当前位置: 首页 > news >正文

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

http://www.dtcms.com/a/536084.html

相关文章:

  • Oracle 19c 归档日志挖掘(Log Mining)完全指南
  • MediSec首批参会名单 | 301医院、西门子、联影、GE、阿斯利康等20多家医疗机构安全人员齐聚!
  • 顺义手机网站建设锦州网站建设更好
  • 成都私人网站制作公司好看的网页设计代码
  • Vue3小兔鲜-(二)
  • 2025全面评测:企业培训课件制作软件哪个好一点呢
  • C++与边缘AI:在资源荒漠中部署智能的工程艺术
  • 高并发编程之MapMaker
  • PCIe协议之复位篇之 PERST# 信号(二)
  • deque的优缺点
  • 基恩士PLC自定义定时器(预设值支持Real类型)
  • 【逆向】Android程序Hook native方法
  • dw做的网站乱码网站建设设计语言
  • 网站模板拍卖seo教程
  • 《jEasyUI 创建 CRUD 数据网格》
  • 神经网络之窗口大小对词语义向量的影响
  • 计算机视觉:pyqt5+yoloV5目标检测平台 python实战 torch 目标识别 大数据项目 目标跟踪(建议收藏)✅
  • OpenCV 高级图像处理
  • UML内容
  • 【强化学习核心解析】特点、分类与DQN算法及嵌入式低功耗应用
  • OpenCV轻松入门_面向python(第八章 形态学操作)
  • 网站建设维护面试英雄联盟网站模板
  • 网络安全:金盾 RASP 应用防护
  • Cursor MCP Java程序员从零开始实战教程 第一章-第四节-MCP服务器安装与配置
  • __金仓数据库替代MongoDB护航医疗隐私:医院患者随访记录安全存储实践__
  • 有没有教做衣服的网站济南建设工程交易中心网站
  • MongoDB使用命令行导出导入索引
  • __金仓数据库平替MongoDB全栈安全实战:从文档存储到多模一体化的演进之路__
  • Python爬虫实战:新闻数据抓取与MongoDB存储全流程
  • 一站式搭建WordPress网站与Nginx RTMP流媒体服务