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

相关推荐
音视频牛哥3 小时前
从“十五五”规划看中国视频基础设施的下一个五年:SmartMediaKit 的战略跃迁与时代机遇
人工智能·音视频·大牛直播sdk·十五五规划具身智能·十五五规划音视频·低空经济低延迟音视频方案·具身智能rtsp rtmp
eguid_13 小时前
【HLS】Java实现统计HLS的m3u8清单中所有ts切片的视频持续时长
java·音视频·hls·1024程序员节·m3u8·ts时长
ICscholar3 小时前
生物突触功能总结
人工智能
百度智能云3 小时前
MySQL最怕的IN大列表,被百度智能云GaiaDB治好了!查询速度提升60倍!
算法
深度学习lover3 小时前
<项目代码>yolo螺丝螺母识别<目标检测>
人工智能·python·深度学习·yolo·目标检测·计算机视觉·螺丝螺母识别
信奥卷王3 小时前
[GESP202506 五级] 奖品兑换
数据结构·算法
3DVisionary3 小时前
数字图像相关(DIC)技术:汽车板料成形极限(FLC)的精确测量与分析
人工智能·汽车·数字图像相关·材料力学性能·汽车板料成形·成形极限曲线·应变测量
newxtc4 小时前
【重庆政务服务网-注册_登录安全分析报告】
人工智能·selenium·测试工具·安全·政务
奶茶树4 小时前
【数据结构】二叉搜索树
数据结构·算法