esp-adf音频框架 :audio stream->I2S Stream

audio streams 的作用就是负责获取音频数据并在处理后将数据发送出去的音频元素(audio element)称为音频流

I2S streams 文件位置在:

/esp-adf/components/audio_steam/i2s_stream.c
/esp-adf/components/audio_steam/include/i2s_stream.c
  • i2s stream 初始化
/**
 * @brief     创建音频元素的句柄以将数据从I2S流传输到另一个元素,或从发送到I2S的其他元素获取数据,具体取决于流类型的配置为AUDIO_STREAM_READER或AUDIO_STREAM_WRITER。 
 *            
 * @note      如果通过内置DAC模式启用了I2S流,请不要使用I2S_NUM_1。当前ESP32芯片仅在I2S0上支持内置DAC功能。
 *           
 * @param      i2s 配置结构体指针
 *
 * @return     音频元素句柄
 */
audio_element_handle_t i2s_stream_init(i2s_stream_cfg_t *config);
  • 初始化函数的使用方法
/*初始化默认配置*/
   i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT();
   /*修改配置中的选项*/
   i2s_cfg.type = AUDIO_STREAM_WRITER;//i2s流为写入writer,当I2S流类型为“ writer”时,数据可以发送到编解码器芯片或ESP32的内部DAC。
   i2s_cfg.multi_out_num = 1;//多通道输出(同时输出两个音频流)
   i2s_cfg.task_core = 1;// i2s stream 运行的内核(esp32 有两个core ,core0,core1)
   /*初始化i2s stream,返回audio_element_handle_t 指针*/
   i2s_stream_writer = i2s_stream_init(&i2s_cfg);
  • 设置i2s 数据流的时钟
/**
 * @brief      I2S流的设置时钟,此功能仅与由创建的句柄一起使用 i2s_stream_init
 *
 * @param[in]  i2s元素句柄
 * @param[in]  时钟频率(以Hz为单位)
 * @param[in] 音频位宽(8、16、24、32)
 * @param[in]  音频通道数(1:单声道,2:立体声)
 *
 * @return
 *     - ESP_OK
 *     - ESP_FAIL
 */
esp_err_t i2s_stream_set_clk(audio_element_handle_t i2s_stream, int rate, int bits, int ch);
  • 设置i2s流的音量
/**
 * @brief      使用ALC设置流的音量
 *
 * @param[in]  i2s_stream   i2s元素句柄
 * @param[in]  volume       将设置流的音量
 *
 * @return
 *     - ESP_OK
 *     - ESP_FAIL
 */
esp_err_t i2s_alc_volume_set(audio_element_handle_t i2s_stream, int volume);
  • 获取i2s流当前的音量
/**
 * @brief      获取i2s流当前的音量
 *
 * @param[in]  i2s_stream   i2s元素句柄
 * @param[in]  volume       音频流的音量值
 *
 * @return
 *     - ESP_OK
 *     - ESP_FAIL
 */
esp_err_t i2s_alc_volume_get(audio_element_handle_t i2s_stream, int* volume);
  • 配置结构体 从函数接口可以看出,esp-adf对i2s stream的操作只有两个(时钟和声音),说明对于i2s stream操作是不支持实时修改的,除了声音以外其他的配置只能在初始化阶段才能实现。
/*i2s stream 配置*/
typedef struct {
    /*当前流类型:AUDIO_STREAM_READER,AUDIO_STREAM_WRITER*/
    audio_stream_type_t     type;
    /*i2s 配置,主要是配置i2s 硬件接口的相关信息*/            
    i2s_config_t            i2s_config;
    /*i2s 端口号  0 ,1 */        
    i2s_port_t              i2s_port;          
    /*是否使用alc的标志,如果使用这个值应配置成true*/        
    bool                    use_alc;           
    /*设定输入音频数据的默认音量*/        
    int                     volume;            
    /*输出环形缓冲区的大小*/        
    int                     out_rb_size;       
    /*任务堆栈大小*/        
    int                     task_stack;        
    /*任务运行的内核 0,1*/        
    int                     task_core;         
    /*任务优先级*/        
    int                     task_prio;         
    /*输出倍数,如果=1 表示同时可以输出2个音频流*/        
    int                     multi_out_num;     
    /*当流销毁时是否卸载i2s驱动程序*/        
    bool                    uninstall_drv;     
} i2s_stream_cfg_t;
  • 默认配置
#define I2S_STREAM_TASK_STACK           (3072+512)
#define I2S_STREAM_BUF_SIZE             (2048)
#define I2S_STREAM_TASK_PRIO            (23)
#define I2S_STREAM_TASK_CORE            (0)
#define I2S_STREAM_RINGBUFFER_SIZE      (8 * 1024)

#define I2S_STREAM_CFG_DEFAULT() {                                              \
    .type = AUDIO_STREAM_WRITER,                                                \
    .task_prio = I2S_STREAM_TASK_PRIO,                                          \
    .task_core = I2S_STREAM_TASK_CORE,                                          \
    .task_stack = I2S_STREAM_TASK_STACK,                                        \
    .out_rb_size = I2S_STREAM_RINGBUFFER_SIZE,                                  \
    .i2s_config = {                                                             \
        .mode = I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX,                    \
        .sample_rate = 44100,                                                   \
        .bits_per_sample = 16,                                                  \
        .channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT,                           \
        .communication_format = I2S_COMM_FORMAT_I2S,                            \
        .dma_buf_count = 3,                                                     \
        .dma_buf_len = 300,                                                     \
        .use_apll = 1,                                                          \
        .intr_alloc_flags = ESP_INTR_FLAG_LEVEL2,                               \
        .tx_desc_auto_clear = true,                                             \
    },                                                                          \
    .i2s_port = 0,                                                              \
    .use_alc = false,                                                           \
    .volume = 0,                                                                \
    .multi_out_num = 0,                                                         \
    .uninstall_drv = true,                                                      \
}

欢迎关注我的个人网站:zwww.zcxbb.com

知乎专栏:物联网开发入门 - 知乎 (zhihu.com)

你可能感兴趣的:(ESP32开发快速入门,音视频)