diff --git a/esphome/components/esp_adf/__init__.py b/esphome/components/esp_adf/__init__.py index 9a91394da8..f5c6bd8847 100644 --- a/esphome/components/esp_adf/__init__.py +++ b/esphome/components/esp_adf/__init__.py @@ -5,7 +5,7 @@ import esphome.codegen as cg import esphome.final_validate as fv from esphome.components import esp32 -from esphome.components.i2c import I2CDevice, i2c_ns, I2CBus +from esphome.components.i2c import i2c_ns, I2CBus from esphome.const import CONF_ID, CONF_BOARD @@ -91,9 +91,8 @@ async def to_code(config): cg.add_define("USE_ESP_ADF_BOARD") esp32.add_idf_sdkconfig_option(SUPPORTED_BOARDS[board], True) - #esp32.add_idf_sdkconfig_option("CONFIG_SPIRAM_BOOT_INIT", True) - #esp32.add_idf_sdkconfig_option("CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY", True) - + # esp32.add_idf_sdkconfig_option("CONFIG_SPIRAM_BOOT_INIT", True) + # esp32.add_idf_sdkconfig_option("CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY", True) esp32.add_extra_script( "pre", @@ -105,16 +104,22 @@ async def to_code(config): "https://github.com/X-Ryl669/esp-adf/raw/with-i2c-cb/idf_patches/idf_v4.4_freertos.patch", ) + # I2C Bus below ADFI2CBus = i2c_ns.class_("ADFI2CBus", I2CBus, cg.Component) + + # Patch the I2C config schema to use the right I2C bus def _patch_idfi2cbus(config): from esphome.cpp_generator import MockObjClass if "i2c" in fv.full_config.get(): for i2c_inst in fv.full_config.get()["i2c"]: - i2c_inst["id"].type = MockObjClass("i2c::ADFI2CBus", parents = i2c_inst["id"].type._parents) + i2c_inst["id"].type = MockObjClass( + "i2c::ADFI2CBus", parents=i2c_inst["id"].type._parents + ) return config + FINAL_VALIDATE_SCHEMA = _patch_idfi2cbus diff --git a/esphome/components/esp_adf/i2c_bus_esp_adf.cpp b/esphome/components/esp_adf/i2c_bus_esp_adf.cpp index 0b902a491e..903d94f2ee 100644 --- a/esphome/components/esp_adf/i2c_bus_esp_adf.cpp +++ b/esphome/components/esp_adf/i2c_bus_esp_adf.cpp @@ -8,16 +8,12 @@ #include #include - namespace esphome { namespace i2c { - static const char *const TAG = "i2c.adf"; -static void recover_i2c_hard(i2c_port_t, void* bus) { - ((ADFI2CBus*)bus)->recover_(); -} +static void recover_i2c_hard(i2c_port_t, void *bus) { ((ADFI2CBus *) bus)->recover_(); } void ADFI2CBus::setup() { ESP_LOGCONFIG(TAG, "Setting up I2C bus..."); @@ -30,12 +26,14 @@ void ADFI2CBus::setup() { next_port = I2C_NUM_MAX; #endif if (port == I2C_NUM_MAX) { - ESP_LOGE(TAG, "Too many I2C buses configured"); this->mark_failed(); return; + ESP_LOGE(TAG, "Too many I2C buses configured"); + this->mark_failed(); + return; } -// Recovery is disabled by default in adf since any esp-adf component that needed the I2C bus -// might have run its setup and create the bus already. In that case, it would break the bus -// this->recover_(); + // Recovery is disabled by default in adf since any esp-adf component that needed the I2C bus + // might have run its setup and create the bus already. In that case, it would break the bus + // this->recover_(); this->recovery_result_ = RECOVERY_COMPLETED; i2c_config_t conf{}; @@ -52,12 +50,12 @@ void ADFI2CBus::setup() { this->mark_failed(); return; } -/* if (i2c_bus_run_cb(this->handle_, &recover_i2c_hard, this) != ESP_OK) { - ESP_LOGW(TAG, "i2c_bus_recover failed"); - this->mark_failed(); - return; - } -*/ + /* if (i2c_bus_run_cb(this->handle_, &recover_i2c_hard, this) != ESP_OK) { + ESP_LOGW(TAG, "i2c_bus_recover failed"); + this->mark_failed(); + return; + } + */ if (this->scan_) { ESP_LOGV(TAG, "Scanning i2c bus for active devices..."); this->i2c_scan_(); @@ -95,15 +93,13 @@ void ADFI2CBus::dump_config() { } } - -struct ReadVCmd -{ +struct ReadVCmd { uint8_t address; - ReadBuffer * buffers; + ReadBuffer *buffers; size_t cnt; - ErrorCode code { ERROR_UNKNOWN }; + ErrorCode code{ERROR_UNKNOWN}; - ReadVCmd(uint8_t address, ReadBuffer * buffers, size_t cnt) : address(address), buffers(buffers), cnt(cnt) {} + ReadVCmd(uint8_t address, ReadBuffer *buffers, size_t cnt) : address(address), buffers(buffers), cnt(cnt) {} ErrorCode read(i2c_port_t port) { i2c_cmd_handle_t cmd = i2c_cmd_link_create(); @@ -167,11 +163,10 @@ struct ReadVCmd return ERROR_OK; } - }; // Calling stub for I2C port -static void i2c_readv(i2c_port_t port, void* arg) { - ReadVCmd * args = (ReadVCmd*)arg; +static void i2c_readv(i2c_port_t port, void *arg) { + ReadVCmd *args = (ReadVCmd *) arg; args->code = args->read(port); } @@ -182,7 +177,7 @@ ErrorCode ADFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) { ESP_LOGVV(TAG, "i2c bus not initialized!"); return ERROR_NOT_INITIALIZED; } - ReadVCmd cmd { address, buffers, cnt }; + ReadVCmd cmd{address, buffers, cnt}; if (i2c_bus_run_cb(this->handle_, &i2c_readv, &cmd) != ESP_OK || cmd.code != ERROR_OK) { ESP_LOGVV(TAG, "i2c readv failed!"); return cmd.code; @@ -190,16 +185,15 @@ ErrorCode ADFI2CBus::readv(uint8_t address, ReadBuffer *buffers, size_t cnt) { return ERROR_OK; } -struct WriteVCmd -{ +struct WriteVCmd { uint8_t address; - WriteBuffer * buffers; + WriteBuffer *buffers; size_t cnt; bool stop; - ErrorCode code { ERROR_UNKNOWN }; - - WriteVCmd(uint8_t address, WriteBuffer * buffers, size_t cnt, bool stop) : address(address), buffers(buffers), cnt(cnt), stop(stop) {} + ErrorCode code{ERROR_UNKNOWN}; + WriteVCmd(uint8_t address, WriteBuffer *buffers, size_t cnt, bool stop) + : address(address), buffers(buffers), cnt(cnt), stop(stop) {} ErrorCode write(i2c_port_t port) { #ifdef ESPHOME_LOG_HAS_VERY_VERBOSE @@ -266,8 +260,8 @@ struct WriteVCmd }; // Calling stub for I2C port -static void i2c_writev(i2c_port_t port, void* arg) { - WriteVCmd * args = (WriteVCmd*)arg; +static void i2c_writev(i2c_port_t port, void *arg) { + WriteVCmd *args = (WriteVCmd *) arg; args->code = args->write(port); } @@ -279,7 +273,7 @@ ErrorCode ADFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, b return ERROR_NOT_INITIALIZED; } - WriteVCmd cmd { address, buffers, cnt, stop }; + WriteVCmd cmd{address, buffers, cnt, stop}; if (i2c_bus_run_cb(this->handle_, &i2c_writev, &cmd) != ESP_OK || cmd.code != ERROR_OK) { ESP_LOGVV(TAG, "i2c writev failed!"); return cmd.code; @@ -287,14 +281,12 @@ ErrorCode ADFI2CBus::writev(uint8_t address, WriteBuffer *buffers, size_t cnt, b return ERROR_OK; } - /// Perform I2C bus recovery, see: /// https://www.nxp.com/docs/en/user-guide/UM10204.pdf /// https://www.analog.com/media/en/technical-documentation/application-notes/54305147357414AN686_0.pdf void ADFI2CBus::recover_() { ESP_LOGI(TAG, "Performing I2C bus recovery"); - const gpio_num_t scl_pin = static_cast(scl_pin_); const gpio_num_t sda_pin = static_cast(sda_pin_); @@ -402,7 +394,6 @@ void ADFI2CBus::recover_() { recovery_result_ = RECOVERY_COMPLETED; } - } // namespace i2c } // namespace esphome diff --git a/esphome/components/esp_adf/microphone/esp_adf_microphone.cpp b/esphome/components/esp_adf/microphone/esp_adf_microphone.cpp index 1912dc021b..629ab3c638 100644 --- a/esphome/components/esp_adf/microphone/esp_adf_microphone.cpp +++ b/esphome/components/esp_adf/microphone/esp_adf_microphone.cpp @@ -75,50 +75,18 @@ void ESPADFMicrophone::read_task(void *params) { event.type = TaskEventType::STARTING; xQueueSend(this_mic->read_event_queue_, &event, portMAX_DELAY); -/* - audio_pipeline_cfg_t pipeline_cfg = { - .rb_size = 8 * 1024, - }; - */ + /* + audio_pipeline_cfg_t pipeline_cfg = { + .rb_size = 8 * 1024, + }; + */ audio_pipeline_cfg_t pipeline_cfg = DEFAULT_AUDIO_PIPELINE_CONFIG(); audio_pipeline_handle_t pipeline = audio_pipeline_init(&pipeline_cfg); -/* - i2s_driver_config_t i2s_config = {}; - i2s_config.mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_RX); - i2s_config.sample_rate = 16000; - i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT; - i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT; - i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S; - i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL2 | ESP_INTR_FLAG_IRAM; - i2s_config.dma_buf_count = 8; - i2s_config.dma_buf_len = 128; - i2s_config.use_apll = false; - i2s_config.tx_desc_auto_clear = true; - i2s_config.fixed_mclk = 0; - i2s_config.mclk_multiple = I2S_MCLK_MULTIPLE_256; - i2s_config.bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT; - i2s_stream_cfg_t i2s_cfg = {}; - i2s_cfg.type = AUDIO_STREAM_READER; - i2s_cfg.i2s_config = i2s_config; - i2s_cfg.i2s_port = static_cast(CODEC_ADC_I2S_PORT); - i2s_cfg.use_alc = false; - i2s_cfg.volume = 0; - i2s_cfg.out_rb_size = I2S_STREAM_RINGBUFFER_SIZE; - i2s_cfg.task_stack = I2S_STREAM_TASK_STACK; - i2s_cfg.task_core = I2S_STREAM_TASK_CORE; - i2s_cfg.task_prio = I2S_STREAM_TASK_PRIO; - i2s_cfg.stack_in_ext = false; - i2s_cfg.multi_out_num = 0; - i2s_cfg.uninstall_drv = true; - i2s_cfg.need_expand = false; - i2s_cfg.expand_src_bits = I2S_BITS_PER_SAMPLE_16BIT; -*/ - //i2s_stream_cfg_t i2s_cfg = I2S_STREAM_CFG_DEFAULT_WITH_PARA(CODEC_ADC_I2S_PORT, 48000, 16, AUDIO_STREAM_READER); i2s_stream_cfg_t i2s_cfg = {}; memset(&i2s_cfg, 0, sizeof(i2s_cfg)); i2s_cfg.type = AUDIO_STREAM_READER; - i2s_cfg.i2s_port = (i2s_port_t)CODEC_ADC_I2S_PORT; + i2s_cfg.i2s_port = (i2s_port_t) CODEC_ADC_I2S_PORT; i2s_cfg.use_alc = false; i2s_cfg.volume = 0; i2s_cfg.out_rb_size = I2S_STREAM_RINGBUFFER_SIZE; @@ -131,7 +99,7 @@ void ESPADFMicrophone::read_task(void *params) { i2s_cfg.need_expand = false; i2s_cfg.expand_src_bits = I2S_BITS_PER_SAMPLE_16BIT; i2s_cfg.buffer_len = I2S_STREAM_BUF_SIZE; - i2s_cfg.i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX); + i2s_cfg.i2s_config.mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX | I2S_MODE_RX); i2s_cfg.i2s_config.sample_rate = 16000; i2s_cfg.i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT; i2s_cfg.i2s_config.channel_format = I2S_CHANNEL_FMT_RIGHT_LEFT; @@ -143,30 +111,9 @@ void ESPADFMicrophone::read_task(void *params) { i2s_cfg.i2s_config.tx_desc_auto_clear = true; i2s_cfg.i2s_config.fixed_mclk = 0; audio_element_handle_t i2s_stream_reader = i2s_stream_init(&i2s_cfg); -/* - rsp_filter_cfg_t rsp_cfg = { - .src_rate = 16000, - .src_ch = 2, - .dest_rate = 16000, - .dest_bits = 16, - .dest_ch = 1, - .src_bits = I2S_BITS_PER_SAMPLE_16BIT, - .mode = RESAMPLE_DECODE_MODE, - .max_indata_bytes = RSP_FILTER_BUFFER_BYTE, - .out_len_bytes = RSP_FILTER_BUFFER_BYTE, - .type = ESP_RESAMPLE_TYPE_AUTO, - .complexity = 2, - .down_ch_idx = 0, - .prefer_flag = ESP_RSP_PREFER_TYPE_SPEED, - .out_rb_size = RSP_FILTER_RINGBUFFER_SIZE, - .task_stack = RSP_FILTER_TASK_STACK, - .task_core = RSP_FILTER_TASK_CORE, - .task_prio = RSP_FILTER_TASK_PRIO, - .stack_in_ext = true, - }; - */ + rsp_filter_cfg_t rsp_cfg = {}; - memset(&rsp_cfg, 0, sizeof(rsp_cfg)); //DEFAULT_RESAMPLE_FILTER_CONFIG(); + memset(&rsp_cfg, 0, sizeof(rsp_cfg)); // DEFAULT_RESAMPLE_FILTER_CONFIG(); rsp_cfg.src_rate = 16000; rsp_cfg.src_ch = 2; rsp_cfg.src_bits = 16; @@ -187,30 +134,31 @@ void ESPADFMicrophone::read_task(void *params) { rsp_cfg.stack_in_ext = true; audio_element_handle_t filter = rsp_filter_init(&rsp_cfg); - algorithm_stream_cfg_t algo_cfg = { - .input_type = ALGORITHM_STREAM_INPUT_TYPE1, - .task_stack = 10 * 1024, - .task_prio = ALGORITHM_STREAM_TASK_PERIOD, - .task_core = ALGORITHM_STREAM_PINNED_TO_CORE, - .out_rb_size = ALGORITHM_STREAM_RINGBUFFER_SIZE, - .stack_in_ext = true, - .rec_linear_factor = 1, - .ref_linear_factor = 1, - .debug_input = false, - .swap_ch = false, - // .algo_mask = ALGORITHM_STREAM_USE_AGC, - // .algo_mask = (ALGORITHM_STREAM_USE_AEC | ALGORITHM_STREAM_USE_AGC | ALGORITHM_STREAM_USE_NS), - // .algo_mask = (ALGORITHM_STREAM_USE_AGC | ALGORITHM_STREAM_USE_NS), - .algo_mask = (ALGORITHM_STREAM_USE_AEC | ALGORITHM_STREAM_USE_NS), - // .algo_mask = (ALGORITHM_STREAM_USE_NS), - .sample_rate = 16000, - .mic_ch = 1, - .agc_gain = 10, - .aec_low_cost = false, - }; - - // audio_element_handle_t algo_stream = algo_stream_init(&algo_cfg); + /* + algorithm_stream_cfg_t algo_cfg = { + .input_type = ALGORITHM_STREAM_INPUT_TYPE1, + .task_stack = 10 * 1024, + .task_prio = ALGORITHM_STREAM_TASK_PERIOD, + .task_core = ALGORITHM_STREAM_PINNED_TO_CORE, + .out_rb_size = ALGORITHM_STREAM_RINGBUFFER_SIZE, + .stack_in_ext = true, + .rec_linear_factor = 1, + .ref_linear_factor = 1, + .debug_input = false, + .swap_ch = false, + // .algo_mask = ALGORITHM_STREAM_USE_AGC, + // .algo_mask = (ALGORITHM_STREAM_USE_AEC | ALGORITHM_STREAM_USE_AGC | ALGORITHM_STREAM_USE_NS), + // .algo_mask = (ALGORITHM_STREAM_USE_AGC | ALGORITHM_STREAM_USE_NS), + .algo_mask = (ALGORITHM_STREAM_USE_AEC | ALGORITHM_STREAM_USE_NS), + // .algo_mask = (ALGORITHM_STREAM_USE_NS), + .sample_rate = 16000, + .mic_ch = 1, + .agc_gain = 10, + .aec_low_cost = false, + }; + audio_element_handle_t algo_stream = algo_stream_init(&algo_cfg); + */ raw_stream_cfg_t raw_cfg = { .type = AUDIO_STREAM_READER, .out_rb_size = 8 * 1024, @@ -230,18 +178,15 @@ void ESPADFMicrophone::read_task(void *params) { }; audio_pipeline_link(pipeline, &link_tag[0], 3); -/* // Set the event listener for the pipeline, else it'll fill itself and crash - audio_event_iface_cfg_t evt_cfg = AUDIO_EVENT_IFACE_DEFAULT_CFG(); - audio_event_iface_handle_t evt = audio_event_iface_init(&evt_cfg); - audio_pipeline_set_listener(pipeline, evt); - esp_periph_config_t periph_cfg = DEFAULT_ESP_PERIPH_SET_CONFIG(); - esp_periph_set_handle_t set = esp_periph_set_init(&periph_cfg); - - // Initialize SD Card peripheral -// audio_board_sdcard_init(set, SD_MODE_1_LINE); - audio_event_iface_set_listener(esp_periph_set_get_event_iface(set), evt); - ESP_LOGW(TAG, "audio pipeline listener installed"); -*/ + /* + // Set the event listener for the pipeline, else it'll fill itself and crash + audio_event_iface_cfg_t evt_cfg = AUDIO_EVENT_IFACE_DEFAULT_CFG(); + audio_event_iface_handle_t evt = audio_event_iface_init(&evt_cfg); + audio_pipeline_set_listener(pipeline, evt); + esp_periph_config_t periph_cfg = DEFAULT_ESP_PERIPH_SET_CONFIG(); + esp_periph_set_handle_t set = esp_periph_set_init(&periph_cfg); + ESP_LOGW(TAG, "audio pipeline listener installed"); + */ audio_pipeline_run(pipeline); @@ -280,21 +225,21 @@ void ESPADFMicrophone::read_task(void *params) { } rb_write(this_mic->ring_buffer_, (char *) buffer, bytes_read, 0); -/* // Pipeline listener for events too - audio_event_iface_msg_t msg; - esp_err_t ret = audio_event_iface_listen(evt, &msg, 0); - if (ret == ESP_OK) { - ESP_LOGW(TAG, "msg srct:%d, src:%p, cmd:%d, data:%d", msg.source_type, msg.source, msg.cmd, (int)msg.data); + /* // Pipeline listener for events too + audio_event_iface_msg_t msg; + esp_err_t ret = audio_event_iface_listen(evt, &msg, 0); + if (ret == ESP_OK) { + ESP_LOGW(TAG, "msg srct:%d, src:%p, cmd:%d, data:%d", msg.source_type, msg.source, msg.cmd, (int)msg.data); - // Stop when the last pipeline element (raw_read in this case) receives stop event - if (msg.source_type == AUDIO_ELEMENT_TYPE_ELEMENT && msg.source == (void *) raw_read - && msg.cmd == AEL_MSG_CMD_REPORT_STATUS - && (((int)msg.data == AEL_STATUS_STATE_STOPPED) || ((int)msg.data == AEL_STATUS_STATE_FINISHED))) { - // Stop from the microphone (upon error?) - break; - } - } -*/ + // Stop when the last pipeline element (raw_read in this case) receives stop event + if (msg.source_type == AUDIO_ELEMENT_TYPE_ELEMENT && msg.source == (void *) raw_read + && msg.cmd == AEL_MSG_CMD_REPORT_STATUS + && (((int)msg.data == AEL_STATUS_STATE_STOPPED) || ((int)msg.data == AEL_STATUS_STATE_FINISHED))) { + // Stop from the microphone (upon error?) + break; + } + } + */ } allocator.deallocate(buffer, BUFFER_SIZE / sizeof(int16_t)); diff --git a/esphome/components/esp_adf/speaker/esp_adf_speaker.cpp b/esphome/components/esp_adf/speaker/esp_adf_speaker.cpp index 508f549abe..dd8fbdf67d 100644 --- a/esphome/components/esp_adf/speaker/esp_adf_speaker.cpp +++ b/esphome/components/esp_adf/speaker/esp_adf_speaker.cpp @@ -16,7 +16,7 @@ namespace esphome { namespace esp_adf { -static const size_t BUFFER_COUNT = 20; +static const size_t BUFFER_COUNT = 25; static const char *const TAG = "esp_adf.speaker"; @@ -50,41 +50,6 @@ void ESPADFSpeaker::player_task(void *params) { }; audio_pipeline_handle_t pipeline = audio_pipeline_init(&pipeline_cfg); - /* i2s_driver_config_t i2s_config = {}; - i2s_config.mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX); - i2s_config.sample_rate = 16000; - i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT; - i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT; - i2s_config.communication_format = I2S_COMM_FORMAT_STAND_I2S; - i2s_config.intr_alloc_flags = ESP_INTR_FLAG_LEVEL2 | ESP_INTR_FLAG_IRAM; - i2s_config.dma_buf_count = 8; - i2s_config.dma_buf_len = 1024; - i2s_config.use_apll = false; - i2s_config.tx_desc_auto_clear = true; - i2s_config.fixed_mclk = 0; - i2s_config.mclk_multiple = I2S_MCLK_MULTIPLE_256; - i2s_config.bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT; - - - - i2s_stream_cfg_t i2s_cfg = {}; - i2s_cfg.type = AUDIO_STREAM_WRITER; - i2s_cfg.i2s_config = i2s_config; - i2s_cfg.i2s_port = I2S_NUM_0; - i2s_cfg.use_alc = false; - i2s_cfg.volume = 0; - i2s_cfg.out_rb_size = I2S_STREAM_RINGBUFFER_SIZE; - i2s_cfg.task_stack = I2S_STREAM_TASK_STACK; - i2s_cfg.task_core = I2S_STREAM_TASK_CORE; - i2s_cfg.task_prio = I2S_STREAM_TASK_PRIO; - i2s_cfg.stack_in_ext = false; - i2s_cfg.multi_out_num = 0; - i2s_cfg.uninstall_drv = true; - i2s_cfg.need_expand = false; - i2s_cfg.expand_src_bits = I2S_BITS_PER_SAMPLE_16BIT; - - audio_element_handle_t i2s_stream_writer = i2s_stream_init(&i2s_cfg); -*/ i2s_stream_cfg_t i2s_cfg = {}; memset(&i2s_cfg, 0, sizeof(i2s_cfg)); i2s_cfg.type = AUDIO_STREAM_WRITER; @@ -101,7 +66,7 @@ void ESPADFSpeaker::player_task(void *params) { i2s_cfg.need_expand = false; i2s_cfg.expand_src_bits = I2S_BITS_PER_SAMPLE_16BIT; i2s_cfg.buffer_len = I2S_STREAM_BUF_SIZE; - i2s_cfg.i2s_config.mode = (i2s_mode_t)(I2S_MODE_MASTER | I2S_MODE_TX); + i2s_cfg.i2s_config.mode = (i2s_mode_t) (I2S_MODE_MASTER | I2S_MODE_TX); i2s_cfg.i2s_config.sample_rate = 16000; i2s_cfg.i2s_config.bits_per_sample = I2S_BITS_PER_SAMPLE_16BIT; i2s_cfg.i2s_config.channel_format = I2S_CHANNEL_FMT_ONLY_RIGHT; @@ -115,49 +80,28 @@ void ESPADFSpeaker::player_task(void *params) { i2s_cfg.i2s_config.bits_per_chan = I2S_BITS_PER_CHAN_DEFAULT; audio_element_handle_t i2s_stream_writer = i2s_stream_init(&i2s_cfg); - - rsp_filter_cfg_t rsp_cfg = {}; -/* - .src_rate = 16000, - .src_ch = 1, - .dest_rate = 16000, - .dest_bits = 16, - .dest_ch = 2, - .src_bits = 16, - .mode = RESAMPLE_DECODE_MODE, - .max_indata_bytes = RSP_FILTER_BUFFER_BYTE, - .out_len_bytes = RSP_FILTER_BUFFER_BYTE, - .type = ESP_RESAMPLE_TYPE_AUTO, - .complexity = 2, - .down_ch_idx = 0, - .prefer_flag = ESP_RSP_PREFER_TYPE_SPEED, - .out_rb_size = RSP_FILTER_RINGBUFFER_SIZE, - .task_stack = RSP_FILTER_TASK_STACK, - .task_core = RSP_FILTER_TASK_CORE, - .task_prio = RSP_FILTER_TASK_PRIO, - .stack_in_ext = true, - }; + /* + rsp_filter_cfg_t rsp_cfg = {}; + rsp_cfg.src_rate = 16000; + rsp_cfg.src_ch = 1; + rsp_cfg.src_bits = 16; + rsp_cfg.dest_rate = 16000; + rsp_cfg.dest_ch = 2; + rsp_cfg.dest_bits = 16; + rsp_cfg.mode = RESAMPLE_DECODE_MODE; + rsp_cfg.max_indata_bytes = RSP_FILTER_BUFFER_BYTE; + rsp_cfg.out_len_bytes = RSP_FILTER_BUFFER_BYTE; + rsp_cfg.type = ESP_RESAMPLE_TYPE_AUTO; + rsp_cfg.complexity = 2; + rsp_cfg.down_ch_idx = 0; + rsp_cfg.prefer_flag = ESP_RSP_PREFER_TYPE_SPEED; + rsp_cfg.out_rb_size = RSP_FILTER_RINGBUFFER_SIZE; + rsp_cfg.task_stack = RSP_FILTER_TASK_STACK; + rsp_cfg.task_core = RSP_FILTER_TASK_CORE; + rsp_cfg.task_prio = RSP_FILTER_TASK_PRIO; + rsp_cfg.stack_in_ext = true; + audio_element_handle_t filter = rsp_filter_init(&rsp_cfg); */ - rsp_cfg.src_rate = 16000; - rsp_cfg.src_ch = 1; - rsp_cfg.src_bits = 16; - rsp_cfg.dest_rate = 16000; - rsp_cfg.dest_ch = 2; - rsp_cfg.dest_bits = 16; - rsp_cfg.mode = RESAMPLE_DECODE_MODE; - rsp_cfg.max_indata_bytes = RSP_FILTER_BUFFER_BYTE; - rsp_cfg.out_len_bytes = RSP_FILTER_BUFFER_BYTE; - rsp_cfg.type = ESP_RESAMPLE_TYPE_AUTO; - rsp_cfg.complexity = 2; - rsp_cfg.down_ch_idx = 0; - rsp_cfg.prefer_flag = ESP_RSP_PREFER_TYPE_SPEED; - rsp_cfg.out_rb_size = RSP_FILTER_RINGBUFFER_SIZE; - rsp_cfg.task_stack = RSP_FILTER_TASK_STACK; - rsp_cfg.task_core = RSP_FILTER_TASK_CORE; - rsp_cfg.task_prio = RSP_FILTER_TASK_PRIO; - rsp_cfg.stack_in_ext = true; - audio_element_handle_t filter = rsp_filter_init(&rsp_cfg); - raw_stream_cfg_t raw_cfg = { .type = AUDIO_STREAM_WRITER, .out_rb_size = 8 * 1024, @@ -165,7 +109,7 @@ void ESPADFSpeaker::player_task(void *params) { audio_element_handle_t raw_write = raw_stream_init(&raw_cfg); audio_pipeline_register(pipeline, raw_write, "raw"); - audio_pipeline_register(pipeline, filter, "filter"); + // audio_pipeline_register(pipeline, filter, "filter"); audio_pipeline_register(pipeline, i2s_stream_writer, "i2s"); const char *link_tag[3] = {