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

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数据获取

相关推荐
数据与后端架构提升之路1 分钟前
英伟达的 Alpamayo-R1:利用因果链推理赋能自动驾驶模型和数据工程剖析
人工智能·机器学习·自动驾驶
算家计算10 分钟前
Grok 4.1深夜发布!算力需求跃升背后的技术演进与开发者机遇
人工智能·资讯
旋转的马铃薯干18 分钟前
bulk RNA-Seq(7)差异表达分析可视化
算法
旋转的马铃薯干20 分钟前
bulk RNA-Seq(8)富集分析
算法
2501_9411117721 分钟前
C++代码移植性设计
开发语言·c++·算法
deephub24 分钟前
TOON:专为 LLM 设计的轻量级数据格式
人工智能·prompt·大语言模型
致Great26 分钟前
RAG在医疗领域的批判性评估、推荐算法等最新研究进展
算法·机器学习·推荐算法
咚咚王者41 分钟前
人工智能之数据分析 numpy:第五章 索引与切片
人工智能·数据分析·numpy
yy_xzz1 小时前
【OpenCV + VS】C++实现动态下雪特效
c++·人工智能·opencv
天选之女wow1 小时前
【Hard——Day4】25.K 个一组翻转链表
数据结构·算法·leetcode·链表