73 if (_running && (_sampleRate != freq)) {
74 i2s_pdm_tx_clk_config_t clk_cfg;
75 clk_cfg = I2S_PDM_TX_CLK_DEFAULT_CONFIG((uint32_t)freq);
76 clk_cfg.up_sample_fp = 960;
77 clk_cfg.up_sample_fs = 480;
78 i2s_channel_disable(_tx_handle);
79 i2s_channel_reconfig_pdm_tx_clock(_tx_handle, &clk_cfg);
80 i2s_channel_enable(_tx_handle);
102 i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(I2S_NUM_AUTO, I2S_ROLE_MASTER);
103 chan_cfg.dma_desc_num = _buffers;
104 chan_cfg.dma_frame_num = _bufferWords;
105 assert(ESP_OK == i2s_new_channel(&chan_cfg, &_tx_handle,
nullptr));
107 i2s_pdm_tx_config_t pdm_cfg = {
108 .clk_cfg = I2S_PDM_TX_CLK_DEFAULT_CONFIG(_sampleRate),
109 .slot_cfg = I2S_PDM_TX_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_STEREO),
111 .clk = I2S_GPIO_UNUSED,
112 .dout = (gpio_num_t)_dout,
113 .dout2 = I2S_GPIO_UNUSED,
119 pdm_cfg.slot_cfg.data_fmt = I2S_PDM_DATA_FMT_PCM;
120 pdm_cfg.clk_cfg.up_sample_fp = 960;
121 pdm_cfg.clk_cfg.up_sample_fs = 480;
122 assert(ESP_OK == i2s_channel_init_pdm_tx_mode(_tx_handle, &pdm_cfg));
124 i2s_chan_info_t _info;
125 i2s_channel_get_info(_tx_handle, &_info);
127 assert(_info.total_dma_buf_size == _buffers * _bufferWords * 4);
128 _totalAvailable = _info.total_dma_buf_size;
131 int16_t a[2] = {0, 0};
134 i2s_channel_preload_data(_tx_handle, (
void*)a,
sizeof(a), &written);
138 i2s_event_callbacks_t _cbs = {
140 .on_recv_q_ovf =
nullptr,
142 .on_send_q_ovf =
nullptr
144 assert(ESP_OK == i2s_channel_register_event_callback(_tx_handle, &_cbs, (
void *)
this));
145 xTaskCreate(
_taskShim,
"BackgroundAudioI2S", 8192, (
void*)
this, 2, &_taskHandle);
146 _running = ESP_OK == i2s_channel_enable(_tx_handle);