Skip to content

Commit 857c65d

Browse files
committed
[int][opt][zbt] update ble audio examaple
Project: Bluetooth redmine: #id, REDMINE-id ext-redmine: feat#5146 [Description in detail] Affected branch: [master] Change-Id: I05bf45cc1369e564b6da63af97c2cef8111d8254
1 parent 1bdb577 commit 857c65d

File tree

1 file changed

+216
-0
lines changed

1 file changed

+216
-0
lines changed

service/bt/bt_finsh/bts2_app_av_snk.c

Lines changed: 216 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,15 @@ extern uint8_t a2dp_relay_get_channel(void);
7171

7272
#if defined(AUDIO_USING_MANAGER) && defined(AUDIO_BT_AUDIO)
7373
static 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+
7483
static rt_event_t g_playback_evt;
7584
static 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
340543
static 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

Comments
 (0)