/esp-adf/components/audio_steam/i2s_stream.c
/esp-adf/components/audio_steam/include/i2s_stream.c
/**
* @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);
/**
* @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);
/**
* @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);
/**
* @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);
/*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)