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

相关推荐
鬼手点金2 分钟前
如何选择模型
java·前端·人工智能·git·深度学习
xrgs_shz3 分钟前
基于OGD-Net的果园环境下蟠桃生长期检测
人工智能·yolo·目标检测·计算机视觉
我叫孙一鸣-专注电子元器件6 分钟前
快反镜的镜面偏转角,为什么不等于光束偏转角?
人工智能·智能硬件·半导体·压电驱动器
古法老登瞎折腾9 分钟前
大数据智能运维实战(三):实现第一个运维 MCP 工具——查询节点与组件状态
java·大数据·运维·人工智能·spring ai·mcp
SEO_juper13 分钟前
手写 llms.txt 验证器:让 AI 更愿意引用你的网站(GEO)
开发语言·人工智能·python·聚类·seo·独立站
lucas_AI17 分钟前
AI 审查员把 PostgreSQL 19 拖延期了?committer 拆完 12 个撤回,故事没那么简单
人工智能
阡陌数智19 分钟前
Anthropic Claude Fable 5.1 长周期 Agent 原生架构解析:工具调用链路稳定性与 API 聚合平台落地实战
人工智能·语言模型·自然语言处理·架构·推荐算法
IT_陈寒19 分钟前
Vue开发实战:从入门到精通
前端·人工智能·后端
TK泰妞19 分钟前
AI 带货视频工具怎么选?电商短视频创作者的实用评估指南
人工智能·音视频
EasyDSS20 分钟前
告别单一场景局限!一套视频会议/直播/点播/集群对讲EasyDSS音视频平台四大功能解析
音视频·媒体·easydss