@@ -71,6 +71,15 @@ extern uint8_t a2dp_relay_get_channel(void);
7171
7272#if defined(AUDIO_USING_MANAGER ) && defined(AUDIO_BT_AUDIO )
7373static sifli_resample_t * resample ;
74+ #if BT_BAP_BROADCAST_SOURCE
75+ static int16_t * g_left ;
76+ static int16_t * g_right ;
77+ static uint32_t g_remain ;
78+ static uint32_t g_offset ;
79+ static uint32_t g_one_channle_size ;
80+ static uint16_t g_drop_cnt = 12 ;
81+ #endif
82+
7483static rt_event_t g_playback_evt ;
7584static rt_thread_t g_playback_thread = NULL ;
7685#define PLAYBACK_GETDATA_EVENT_FLAG (1 << 0)
@@ -336,7 +345,201 @@ static U8 *play_data_decode(bts2s_av_inst_data *inst, U16 *out_len)
336345 return ret ;
337346}
338347
348+ #if BT_BAP_BROADCAST_SOURCE
349+ extern struct rt_ringbuffer * ble_bap_src_enabled_ring ;
350+ #define SPEAKER_DMA_SIZE 960
351+ static const uint8_t zero [160 ] = {0 };
352+ void prepare_ble_src_data (int16_t * data , uint32_t len )
353+ {
354+ int16_t * left , * right , * src ;
355+ uint32_t bytes = sifli_resample_process (resample , data , len , 0 ); //two channel data bytes
356+ src = sifli_resample_get_output (resample );
357+ RT_ASSERT ((bytes & 3 ) == 0 );
358+ uint32_t one_channel_sample = bytes >> 2 ;
359+ if ((one_channel_sample * 2 + g_remain ) > g_one_channle_size )
360+ {
361+ USER_TRACE ("sample=%d remain=%d size=%d" , one_channel_sample , g_remain , g_one_channle_size );
362+ RT_ASSERT (0 );
363+ }
364+ left = g_left + (g_remain >> 1 );
365+ right = g_right + (g_remain >> 1 );
366+
367+ while (one_channel_sample > 0 )
368+ {
369+ * left ++ = * src ++ ;
370+ * right ++ = * src ++ ;
371+ one_channel_sample -- ;
372+ }
373+
374+ //one channel data_len
375+ g_remain = (bytes >> 1 ) + g_remain ;
376+ g_offset = 0 ;
377+ }
378+
379+ #if defined (RT_USING_FINSH )
380+ int src_drop (int argc , char * * argv )
381+ {
382+ if (argc == 1 )
383+ {
384+ LOG_I ("drop=%d" , g_drop_cnt );
385+ }
386+ else
387+ {
388+ g_drop_cnt = atoi (argv [1 ]);
389+ LOG_I ("drop=%d" , g_drop_cnt );
390+ }
391+ return 0 ;
392+ }
393+ MSH_CMD_EXPORT_ALIAS (src_drop , src_drop , src_drop );
394+ #endif
339395
396+ void notify_dma_done_to_a2dp ()
397+ {
398+ rt_event_send (g_playback_evt , PLAYBACK_GETDATA_EVENT_FLAG );
399+ }
400+ static void decode_playback_thread (void * args )
401+ {
402+ bts2s_av_inst_data * inst_data ;
403+
404+ rt_uint32_t evt ;
405+ play_data_t * pt_data ;
406+ U8 * decode_data = NULL ;
407+ U16 decode_len = 0 ;
408+ U16 need_send_len = 0 ;
409+ U8 is_stopped = 1 ;
410+ U8 debug_tx_cnt = 0 ;
411+ int ret_write = 0 ;
412+ #if PKG_USING_VBE_DRC
413+ uint32_t vbe_out_size ;
414+ #endif
415+ g_playback_evt = rt_event_create ("playback_evt" , RT_IPC_FLAG_FIFO );
416+
417+ while (1 )
418+ {
419+ evt = 0 ;
420+ rt_err_t err = rt_event_recv (g_playback_evt , PLAYBACK_GETDATA_EVENT_FLAG | PLAYBACK_START_EVENT_FLAG | PLAYBACK_STOPPING_EVENT_FLAG , RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR , RT_WAITING_FOREVER , & evt );
421+ inst_data = bt_av_get_inst_data ();
422+ if (evt & PLAYBACK_STOPPING_EVENT_FLAG )
423+ {
424+ is_stopped = 1 ;
425+ rt_event_send (g_playback_evt , PLAYBACK_STOPPED_EVENT_FLAG );
426+ continue ;
427+ }
428+
429+ if (evt & PLAYBACK_START_EVENT_FLAG )
430+ {
431+ if (inst_data -> snk_data .audio_client )
432+ {
433+ USER_TRACE ("bt_music: open again--\r\n" );
434+ continue ;
435+ }
436+
437+ decode_data = play_data_decode (inst_data , & decode_len );
438+
439+ USER_TRACE ("bt_music: open len=%d\r\n" , decode_len );
440+
441+ USER_TRACE ("decode src_len:%d, dst_len:%d\n" , inst_data -> snk_data .pt_curdata -> len , decode_len );
442+ if (decode_len == 0 )
443+ {
444+ rt_thread_mdelay (5 );
445+ rt_event_send (g_playback_evt , PLAYBACK_START_EVENT_FLAG );
446+ continue ;
447+ }
448+
449+ audio_parameter_t param = {0 };
450+ if (inst_data -> snk_data .codec == AV_SBC )
451+ {
452+ param .write_samplerate = inst_data -> con [inst_data -> con_idx ].act_cfg .sample_freq ;
453+ }
454+ #ifdef CFG_AV_AAC
455+ else if (inst_data -> snk_data .codec == AV_MPEG24_AAC )
456+ {
457+ param .write_samplerate = inst_data -> con [inst_data -> con_idx ].act_aac_cfg .sample_freq ;
458+ }
459+ #endif
460+ else
461+ {
462+ USER_TRACE ("Unsupported codec!!!!!\n" );
463+ RT_ASSERT (0 );
464+ }
465+ uint32_t origin_samplerate = param .write_samplerate ;
466+ param .write_bits_per_sample = 16 ;
467+ param .write_channnel_num = 1 ;
468+ param .write_cache_size = 320 * g_drop_cnt + SPEAKER_DMA_SIZE ;
469+ param .write_samplerate = 48000 ;
470+ debug_tx_cnt = 0 ;
471+ inst_data -> snk_data .audio_client = audio_open (AUDIO_TYPE_BT_MUSIC , AUDIO_TX , & param , NULL , NULL );
472+ is_stopped = 0 ;
473+ if (!resample )
474+ {
475+ USER_TRACE ("resample from %d to 48k" , origin_samplerate );
476+ resample = sifli_resample_open (2 , origin_samplerate , 48000 );
477+ RT_ASSERT (resample );
478+ g_one_channle_size = 4096 ;
479+ g_left = (int16_t * )audio_mem_malloc (g_one_channle_size );
480+ g_right = (int16_t * )audio_mem_malloc (g_one_channle_size );
481+ RT_ASSERT (g_left && g_right );
482+ }
483+ g_remain = 0 ;
484+ g_offset = 0 ;
485+ prepare_ble_src_data ((int16_t * )decode_data , decode_len );
486+ for (int i = 0 ; i < g_drop_cnt ; i ++ )
487+ {
488+ audio_write (inst_data -> snk_data .audio_client , (uint8_t * )zero , 160 );
489+ }
490+ }
491+ if (evt & PLAYBACK_GETDATA_EVENT_FLAG )
492+ {
493+ if (debug_tx_cnt == 0 )
494+ {
495+ //USER_TRACE("a2dp get data,total:%d,full:%d,empty:%d, curr %d\r\n", inst_data->snk_data.playlist.total_num,
496+ // inst_data->snk_data.playlist.full_num, inst_data->snk_data.playlist.empty_num, inst_data->snk_data.playlist.cnt);
497+ }
498+ debug_tx_cnt ++ ;
499+
500+ if (is_stopped == 1 || inst_data -> snk_data .play_state == FALSE || inst_data -> snk_data .audio_client == NULL )
501+ {
502+ //USER_TRACE("snk: stop %d %d %x\r\n", is_stopped, inst_data->snk_data.play_state, inst_data->snk_data.audio_client);
503+ continue ;
504+ }
505+ }
506+
507+ if (g_remain < SPEAKER_DMA_SIZE )
508+ {
509+ memcpy (g_left , & g_left [g_offset ], g_remain );
510+ memcpy (g_right , & g_right [g_offset ], g_remain );
511+ decode_data = play_data_decode (inst_data , & decode_len );
512+ if (decode_len == 0 )
513+ {
514+ decode_len = 2560 ;
515+ decode_data = inst_data -> snk_data .decode_buf ;
516+ memset (decode_data , 0 , decode_len );
517+ }
518+ prepare_ble_src_data ((int16_t * )decode_data , decode_len );
519+ }
520+
521+ ret_write = audio_write (inst_data -> snk_data .audio_client , (uint8_t * )& g_left [g_offset ], SPEAKER_DMA_SIZE );
522+ if (ret_write < 0 )
523+ {
524+ USER_TRACE ("playback write ret:%d\n" , ret_write );
525+ }
526+ else if (ret_write == 0 )
527+ {
528+ USER_TRACE ("cache full\n" );
529+ }
530+ else
531+ {
532+ if (rt_ringbuffer_space_len (ble_bap_src_enabled_ring ) < SPEAKER_DMA_SIZE )
533+ {
534+ LOG_I ("ble src cache full" );
535+ }
536+ rt_ringbuffer_put (ble_bap_src_enabled_ring , (uint8_t * )& g_right [g_offset ], SPEAKER_DMA_SIZE );
537+ g_offset += (SPEAKER_DMA_SIZE / 2 );
538+ g_remain -= SPEAKER_DMA_SIZE ;
539+ }
540+ }
541+ }
542+ #else
340543static void decode_playback_thread (void * args )
341544{
342545 bts2s_av_inst_data * inst_data ;
@@ -509,6 +712,7 @@ static void decode_playback_thread(void *args)
509712 }
510713 }
511714}
715+ #endif
512716
513717#ifdef CFG_AV_AAC
514718 #define DEPLAYBACK_STACK_SIZE (1024 * 16)
@@ -573,6 +777,12 @@ static void stop_audio_playback(bts2s_av_inst_data *inst)
573777#if defined(AUDIO_USING_MANAGER ) && defined(AUDIO_BT_AUDIO )
574778 sifli_resample_close (resample );
575779 resample = NULL ;
780+ #if BT_BAP_BROADCAST_SOURCE
781+ audio_mem_free (g_left );
782+ g_left = NULL ;
783+ audio_mem_free (g_right );
784+ g_right = NULL ;
785+ #endif
576786 audio_close (inst -> snk_data .audio_client );
577787 inst -> snk_data .audio_client = NULL ;
578788#endif
@@ -609,6 +819,12 @@ static void stop_audio_playback_temporarily(bts2s_av_inst_data *inst)
609819#if defined(AUDIO_USING_MANAGER ) && defined(AUDIO_BT_AUDIO )
610820 sifli_resample_close (resample );
611821 resample = NULL ;
822+ #if BT_BAP_BROADCAST_SOURCE
823+ audio_mem_free (g_left );
824+ g_left = NULL ;
825+ audio_mem_free (g_right );
826+ g_right = NULL ;
827+ #endif
612828 audio_close (inst -> snk_data .audio_client );
613829 inst -> snk_data .audio_client = NULL ;
614830#endif
0 commit comments