ES7243E ADC模拟音频转i2S到 BES I2S1 Master输出播放到SPK精准分析
1 初始化


2 开启音频管理

3 音频线程处理

4 AUX中断处理
到步骤3

5 发送音频请求事件

6 消息转到这里处理

7 打开LINEIN(AUX) 音频流处理

8 播放LINEIN 音频函数接口

全部源码
int app_play_linein_onoff(bool onoff)
{
static bool isRun = false;
uint8_t *linein_audio_cap_buff = 0;
uint8_t *linein_audio_play_buff = 0;
uint8_t *linein_audio_loop_buf = NULL;
struct AF_STREAM_CONFIG_T stream_cfg;
uint8_t POSSIBLY_UNUSED *bt_eq_buff = NULL;
uint32_t POSSIBLY_UNUSED eq_buff_size;
uint8_t POSSIBLY_UNUSED play_samp_size;
TRACE(2,"app_play_linein_onoff work:%d op:%d", isRun, onoff);
if (isRun == onoff)
return 0;
if (onoff){
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_104M);
app_overlay_select(APP_OVERLAY_A2DP);
app_audio_mempool_init();
app_audio_mempool_get_buff(&linein_audio_cap_buff, LINEIN_CAPTURE_BUFFER_SIZE);
app_audio_mempool_get_buff(&linein_audio_play_buff, LINEIN_PLAYER_BUFFER_SIZE);
app_audio_mempool_get_buff(&linein_audio_loop_buf, LINEIN_PLAYER_BUFFER_SIZE<<2);
app_audio_pcmbuff_init(linein_audio_loop_buf, LINEIN_PLAYER_BUFFER_SIZE<<2);
#if (LINEIN_CAPTURE_CHANNEL == 1)
app_audio_mempool_get_buff((uint8_t **)&app_linein_play_cache, LINEIN_PLAYER_BUFFER_SIZE/2/2);
app_play_audio_lineinmode_init(LINEIN_CAPTURE_CHANNEL, LINEIN_PLAYER_BUFFER_SIZE/2/2);
#elif (LINEIN_CAPTURE_CHANNEL == 2)
app_play_audio_lineinmode_init(LINEIN_CAPTURE_CHANNEL, LINEIN_PLAYER_BUFFER_SIZE/2);
#endif
memset(&stream_cfg, 0, sizeof(stream_cfg));
#if (LINEIN_MODE == 1 || LINEIN_MODE == 6)
TRACE(0,"app_play_linein_onoff mode 01");
stream_cfg.bits = AUD_BITS_24; //
stream_cfg.channel_num = (enum AUD_CHANNEL_NUM_T)LINEIN_PLAYER_CHANNEL;
#if defined(AUDIO_RESAMPLE)
stream_cfg.sample_rate = AUD_SAMPRATE_44100;//add by tianshun.shi
#else
stream_cfg.sample_rate = AUD_SAMPRATE_44100;
#endif
#endif
#if FPGA==0
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
#else
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
#endif
stream_cfg.vol = stream_linein_volume;
TRACE(1,"vol = %d",stream_linein_volume);
stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
stream_cfg.handler = app_linein_need_pcm_data;
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(linein_audio_play_buff);
stream_cfg.data_size = LINEIN_PLAYER_BUFFER_SIZE;
#if defined(AUDIO_ANC_FB_MC) && defined(ANC_APP) && !defined(AUDIO_RESAMPLE)
sample_size_play_bt=stream_cfg.bits;
sample_rate_play_bt=stream_cfg.sample_rate;
data_size_play_bt=stream_cfg.data_size;
playback_buf_bt=stream_cfg.data_ptr;
playback_size_bt=stream_cfg.data_size;
if(sample_rate_play_bt==AUD_SAMPRATE_96000)
{
playback_samplerate_ratio_bt=4;
}
else
{
playback_samplerate_ratio_bt=8;
}
playback_ch_num_bt=stream_cfg.channel_num;
mid_p_8_old_l=0;
mid_p_8_old_r=0;
#endif
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
#if defined(HW_FIR_EQ_PROCESS) && defined(HW_IIR_EQ_PROCESS)
eq_buff_size = stream_cfg.data_size*2;
#elif defined(HW_FIR_EQ_PROCESS) && !defined(HW_IIR_EQ_PROCESS)
play_samp_size = (stream_cfg.bits <= AUD_BITS_16) ? 2 : 4;
#if defined(CHIP_BEST2000)
eq_buff_size = stream_cfg.data_size * sizeof(int32_t) / play_samp_size;
#elif defined(CHIP_BEST1000)
eq_buff_size = stream_cfg.data_size * sizeof(int16_t) / play_samp_size;
#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P)
eq_buff_size = stream_cfg.data_size;
#endif
#elif !defined(HW_FIR_EQ_PROCESS) && defined(HW_IIR_EQ_PROCESS)
eq_buff_size = stream_cfg.data_size;
#else
eq_buff_size = 0;
bt_eq_buff = NULL;
#endif
if(eq_buff_size>0)
{
app_audio_mempool_get_buff(&bt_eq_buff, eq_buff_size);
}
audio_process_open(stream_cfg.sample_rate, stream_cfg.bits, stream_cfg.channel_num, stream_cfg.data_size/(stream_cfg.bits <= AUD_BITS_16 ? 2 : 4)/2, bt_eq_buff, eq_buff_size);
#ifdef SW_IIR_EQ_PROCESS
bt_audio_set_eq(AUDIO_EQ_TYPE_SW_IIR,bt_audio_get_eq_index(AUDIO_EQ_TYPE_SW_IIR,0));
#endif
#ifdef HW_FIR_EQ_PROCESS
bt_audio_set_eq(AUDIO_EQ_TYPE_HW_FIR,bt_audio_get_eq_index(AUDIO_EQ_TYPE_HW_FIR,0));
#endif
#ifdef HW_DAC_IIR_EQ_PROCESS
bt_audio_set_eq(AUDIO_EQ_TYPE_HW_DAC_IIR,bt_audio_get_eq_index(AUDIO_EQ_TYPE_HW_DAC_IIR,0));
#endif
#ifdef HW_IIR_EQ_PROCESS
bt_audio_set_eq(AUDIO_EQ_TYPE_HW_IIR,bt_audio_get_eq_index(AUDIO_EQ_TYPE_HW_IIR,0));
#endif
#ifdef ANC_APP
anc_status_record = 0xff;
#endif
#if defined(AUDIO_ANC_FB_MC) && defined(ANC_APP) && !defined(AUDIO_RESAMPLE)
uint8_t* bt_audio_buff = NULL;
stream_cfg.bits = sample_size_play_bt;
stream_cfg.channel_num = playback_ch_num_bt;
stream_cfg.sample_rate = sample_rate_play_bt;
stream_cfg.device = AUD_STREAM_USE_MC;
stream_cfg.vol = 0;
stream_cfg.handler = audio_mc_data_playback_a2dp;
stream_cfg.io_path = AUD_OUTPUT_PATH_SPEAKER;
app_audio_mempool_get_buff(&bt_audio_buff, data_size_play_bt*playback_samplerate_ratio_bt);
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(bt_audio_buff);
stream_cfg.data_size = data_size_play_bt*playback_samplerate_ratio_bt;
playback_buf_mc=stream_cfg.data_ptr;
playback_size_mc=stream_cfg.data_size;
anc_mc_run_init(hal_codec_anc_convert_rate(sample_rate_play_bt));
memset(delay_buf_bt,0,sizeof(delay_buf_bt));
af_stream_open(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK, &stream_cfg);
//ASSERT(ret == 0, "af_stream_open playback failed: %d", ret);
#endif
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
#if defined(AUDIO_ANC_FB_MC) && defined(ANC_APP) && !defined(AUDIO_RESAMPLE)
af_stream_start(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK);
#endif
memset(&stream_cfg, 0, sizeof(stream_cfg));
#if (LINEIN_CAPTURE_CHANNEL == 1) //?????
app_audio_mempool_get_buff((uint8_t **)&app_linein_play_cache, LINEIN_PLAYER_BUFFER_SIZE/2/2); //?????
app_play_audio_lineinmode_init(LINEIN_CAPTURE_CHANNEL, LINEIN_PLAYER_BUFFER_SIZE/2/2); //?????
#elif (LINEIN_CAPTURE_CHANNEL == 2)
app_play_audio_lineinmode_init(LINEIN_CAPTURE_CHANNEL, LINEIN_PLAYER_BUFFER_SIZE/2); //?????
#endif
memset(&stream_cfg, 0, sizeof(stream_cfg)); //???????
#if (LINEIN_MODE == 1 || LINEIN_MODE == 6) //?????
TRACE(0,"app_play_linein_onoff mode 01");
stream_cfg.bits = AUD_BITS_24; //
stream_cfg.channel_num = (enum AUD_CHANNEL_NUM_T)LINEIN_PLAYER_CHANNEL;
#if defined(AUDIO_RESAMPLE)
stream_cfg.sample_rate = AUD_SAMPRATE_44100;//add by tianshun.shi
#else
stream_cfg.sample_rate = AUD_SAMPRATE_44100;
#endif
#endif
#if (TJ_BOARD_ZP_H6506 == 1 || CSP_BOARD_WH301A == 1) //from I2S
#if FPGA==0
stream_cfg.device = AUD_STREAM_USE_I2S1_MASTER;//add by tianshun.shi 2021-08-17
#else
stream_cfg.device = AUD_STREAM_USE_I2S1_MASTER;//add by tianshun.shi 2021-08-17
#endif
// stream_cfg.io_path = AUD_INPUT_PATH_LINEIN; //
#elif TJ_BOARD_YP_21061 == 1 //from LINEIN example MIC0 MIC1 (FF)
#if FPGA==0
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;//add by tianshun.shi 2021-08-17
#else
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;//add by tianshun.shi 2021-08-17
#endif
stream_cfg.io_path = AUD_INPUT_PATH_LINEIN;//add by tianshun.shi 2021-08-17
#else
#endif
stream_cfg.channel_num = (enum AUD_CHANNEL_NUM_T)LINEIN_CAPTURE_CHANNEL;
// stream_cfg.channel_map = (enum AUD_CHANNEL_MAP_T)hal_codec_get_input_path_cfg(stream_cfg.io_path); //
stream_cfg.handler = app_linein_pcm_come;
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(linein_audio_cap_buff);
stream_cfg.data_size = LINEIN_CAPTURE_BUFFER_SIZE;
/** begin
��� ӹ ���line-in ���� ʱ � ���popo ����������� 2021-08-15
*/
app_media_mute_cnts_set(150);
/** end
��� ӹ ���line-in ���� ʱ � ���popo ����������� 2021-08-15
*/
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
}else {
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
#if defined(AUDIO_ANC_FB_MC) && defined(ANC_APP) && !defined(AUDIO_RESAMPLE)
af_stream_stop(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK);
#endif
audio_process_close();
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
#if defined(AUDIO_ANC_FB_MC) && defined(ANC_APP) && !defined(AUDIO_RESAMPLE)
af_stream_close(AUD_STREAM_ID_2, AUD_STREAM_PLAYBACK);
#endif
app_overlay_unloadall();
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
}
isRun = onoff;
TRACE(1,"%s end!\n", func);
return 0;
}
9 重点摘要
捕获 ADC的 i2s数据给i2s1 FIFO

10 播放音频到SPK



11 I2s 持续 PCM数据获取

