Skip to content

没法重复播放一个wave文件 (AUD-6783) #27

@aiotfactory

Description

@aiotfactory

Checklist

  • Checked the issue tracker for similar issues to ensure this is not a duplicate
  • Read the documentation to confirm the issue is not addressed there and your configuration is set correctly
  • Tested with the latest version to ensure the issue hasn't been fixed

How often does this bug occurs?

always

Expected behavior

把wave文件读取到内存,然后在playback_read_callback中返回,能听到播放声音一次,我希望能重复播放wave内存的内容,但无论怎么尝试只能播放一次。以下是代码和日志,多谢。

/*

  • SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
  • SPDX-License-Identifier: Apache-2.0
    */

#include <string.h>
#include <string.h>
#include <math.h>
#include "esp_err.h"
#include "freertos/FreeRTOS.h"
#include "esp_log.h"

#include "esp_gmf_element.h"
#include "esp_gmf_pool.h"
#include "esp_gmf_io.h"
#include "esp_gmf_pipeline.h"
#include "esp_gmf_ringbuffer.h"
#include "esp_gmf_pool.h"
#include "esp_gmf_rate_cvt.h"
#include "esp_g711_enc.h"
#include "esp_gmf_audio_helper.h"
#include "esp_audio_simple_player.h"
#include "esp_audio_simple_player_advance.h"
#include "esp_gmf_setup_pool.h"
#include "esp_gmf_setup_peripheral.h"
#include "esp_codec_dev.h"
#include "esp_gmf_fifo.h"

#include "esp_gmf_ringbuffer.h"

#ifndef CONFIG_KEY_PRESS_DIALOG_MODE
#include "esp_vad.h"
#include "esp_afe_config.h"
#include "esp_gmf_afe_manager.h"
#include "esp_gmf_afe.h"
#endif /* CONFIG_KEY_PRESS_DIALOG_MODE */
#include "audio_processor.h"

#include "bsp_board.h"
#include "util.h"
#include "system_util.h"

#define VAD_ENABLE (true)
#define VCMD_ENABLE (false)
#define DEFAULT_FIFO_NUM (5)

#define DEFAULT_PLAYBACK_VOLUME (70)

#define DEFAULT_FEED_TASK_PRIO (6)
#define DEFAULT_FEED_TASK_STACK_SIZE (5 * 1024)
#define DEFAULT_FETCH_TASK_PRIO (6)
#define DEFAULT_FETCH_TASK_STACK_SIZE (5 * 1024)
#define DEFAULT_GMF_TASK_PRIO (6)
#define DEFAULT_GMF_TASK_STACK_SIZE (5 * 1024)

#define AFE_WAKEUP_END_MS (30000)

static char *TAG = "AUDIO_PROCESSOR";

typedef struct {
esp_asp_handle_t player;
enum audio_player_state_e state;
} audio_prompt_t;

typedef struct {
esp_gmf_fifo_handle_t fifo;
recorder_event_callback_t cb;
void *ctx;
enum audio_player_state_e state;
#ifndef CONFIG_KEY_PRESS_DIALOG_MODE
esp_gmf_pipeline_handle_t pipe;
esp_gmf_afe_manager_handle_t afe_manager;
afe_config_t afe_cfg;
esp_gmf_task_handle_t task;
#endif /
CONFIG_KEY_PRESS_DIALOG_MODE */
} audio_recordert_t;

typedef struct {
esp_asp_handle_t player;
esp_gmf_fifo_handle_t fifo;
enum audio_player_state_e state;
} audio_playback_t;

typedef struct {
esp_codec_dev_handle_t play_dev;
esp_codec_dev_handle_t rec_dev;
esp_gmf_pool_handle_t pool;
} audio_manager_t;

#define AUDIO_BUFFER_SIZE 1024 * sizeof(int16_t)
#define GAUSSIAN_SIGMA 1.0 // Gaussian filter standard deviation
static esp_gmf_rb_handle_t out_rb = NULL;
float *gaussian_weights;

static audio_manager_t audio_manager;
static audio_recordert_t audio_recorder;
static audio_playback_t audio_playback;
static audio_prompt_t audio_prompt;
static esp_codec_dev_handle_t play_dev = NULL;
static esp_codec_dev_handle_t rec_dev = NULL;

esp_err_t audio_manager_init(esp_gmf_setup_periph_hardware_info *info, void **play_dev, void **rec_dev)
{
esp_gmf_setup_periph(info);
esp_gmf_setup_periph_codec(&audio_manager.play_dev, &audio_manager.rec_dev);
esp_gmf_pool_init(&audio_manager.pool);
pool_register_io(audio_manager.pool);
pool_register_audio_codecs(audio_manager.pool);
pool_register_audio_effects(audio_manager.pool);
pool_register_codec_dev_io(audio_manager.pool, audio_manager.play_dev, audio_manager.rec_dev);
esp_codec_dev_set_out_vol(audio_manager.play_dev, DEFAULT_PLAYBACK_VOLUME);
// esp_codec_dev_set_in_gain(audio_manager.rec_dev, 21);

if (play_dev != NULL) {
    *play_dev = audio_manager.play_dev;
}
if (rec_dev != NULL) {
    *rec_dev = audio_manager.rec_dev;
}

return ESP_OK;

}

esp_err_t audio_manager_deinit()
{
pool_unregister_audio_codecs();
esp_gmf_pool_deinit(audio_manager.pool);
esp_gmf_teardown_periph_codec(audio_manager.play_dev, audio_manager.rec_dev);
return ESP_OK;
}

esp_err_t audio_manager_suspend(bool suspend)
{
return esp_gmf_afe_manager_suspend(audio_recorder.afe_manager, suspend);
}

static int prompt_out_data_callback(uint8_t *data, int data_size, void *ctx)
{
esp_codec_dev_write(audio_manager.play_dev, data, data_size);
return 0;
}

static int prompt_event_callback(esp_asp_event_pkt_t *event, void *ctx)
{
if (event->type == ESP_ASP_EVENT_TYPE_MUSIC_INFO) {
esp_asp_music_info_t info = {0};
memcpy(&info, event->payload, event->payload_size);
ESP_LOGI(TAG, "Get info, rate:%d, channels:%d, bits:%d", info.sample_rate, info.channels, info.bits);
} else if (event->type == ESP_ASP_EVENT_TYPE_STATE) {
esp_asp_state_t st = 0;
memcpy(&st, event->payload, event->payload_size);
ESP_LOGI(TAG, "Get State, %d,%s", st, esp_audio_simple_player_state_to_str(st));
if (((st == ESP_ASP_STATE_STOPPED) || (st == ESP_ASP_STATE_FINISHED) || (st == ESP_ASP_STATE_ERROR))) {
audio_prompt.state = AUDIO_PLAYER_STATE_IDLE;
audio_prompt_play_mute(true);
vTaskDelay(pdMS_TO_TICKS(100));
audio_prompt_play_mute(false);
}
}
return 0;
}

#ifndef CONFIG_KEY_PRESS_DIALOG_MODE
static esp_err_t recorder_pipeline_event(esp_gmf_event_pkt_t *event, void *ctx)
{
ESP_LOGD(TAG, "CB: RECV Pipeline EVT: el:%s-%p, type:%d, sub:%s, payload:%p, size:%d,%p",
OBJ_GET_TAG(event->from), event->from, event->type, esp_gmf_event_get_state_str(event->sub),
event->payload, event->payload_size, ctx);
return 0;
}

#include "esp_timer.h"

static int recorder_outport_acquire_write(void *handle, esp_gmf_data_bus_block_t *blk, int wanted_size, int block_ticks)
{
esp_gmf_rb_acquire_write(out_rb, blk, wanted_size, block_ticks);
return wanted_size;
}

static int recorder_outport_release_write(void *handle, esp_gmf_data_bus_block_t *blk, int block_ticks)
{
int ret = 0;
if (blk->valid_size) {
ret = blk->valid_size;
} else {
printf("||||| release write, valid_size: %d\n", blk->valid_size);
}
esp_gmf_rb_release_write(out_rb, blk, portMAX_DELAY);
return ret;
}

static int recorder_inport_acquire_read(void *handle, esp_gmf_payload_t *load, int wanted_size, int block_ticks)
{
load->valid_size = wanted_size;
esp_codec_dev_read(audio_manager.rec_dev, load->buf, wanted_size);
return wanted_size;
}

static int recorder_inport_release_read(void *handle, esp_gmf_payload_t *load, int block_ticks)
{
return load->valid_size;
}

static void esp_gmf_afe_event_cb(esp_gmf_obj_handle_t obj, esp_gmf_afe_evt_t *event, void *user_data)
{
audio_recorder.cb((void )event, audio_recorder.ctx);
switch (event->type) {
case ESP_GMF_AFE_EVT_WAKEUP_START: {
// wakeup = true;
#if CONFIG_LANGUAGE_WAKEUP_MODE
esp_gmf_afe_vcmd_detection_cancel(obj);
esp_gmf_afe_vcmd_detection_begin(obj);
#endif /
CONFIG_LANGUAGE_WAKEUP_MODE */
esp_gmf_afe_wakeup_info_t info = event->event_data;
ESP_LOGI(TAG, "WAKEUP_START [%d : %d]", info->wake_word_index, info->wakenet_model_index);
break;
}
case ESP_GMF_AFE_EVT_WAKEUP_END: {
#if CONFIG_LANGUAGE_WAKEUP_MODE
esp_gmf_afe_vcmd_detection_cancel(obj);
#endif /
CONFIG_LANGUAGE_WAKEUP_MODE /
ESP_LOGI(TAG, "WAKEUP_END");
break;
}
case ESP_GMF_AFE_EVT_VAD_START: {
#ifndef CONFIG_LANGUAGE_WAKEUP_MODE
esp_gmf_afe_vcmd_detection_cancel(obj);
esp_gmf_afe_vcmd_detection_begin(obj);
#endif /
CONFIG_LANGUAGE_WAKEUP_MODE /
ESP_LOGI(TAG, "VAD_START");
break;
}
case ESP_GMF_AFE_EVT_VAD_END: {
#ifndef CONFIG_LANGUAGE_WAKEUP_MODE
esp_gmf_afe_vcmd_detection_cancel(obj);
#endif /
CONFIG_LANGUAGE_WAKEUP_MODE */
ESP_LOGI(TAG, "VAD_END");
break;
}
case ESP_GMF_AFE_EVT_VCMD_DECT_TIMEOUT: {
ESP_LOGI(TAG, "VCMD_DECT_TIMEOUT");
break;
}
default: {
esp_gmf_afe_vcmd_info_t info = event->event_data;
ESP_LOGW(TAG, "Command %d, phrase_id %d, prob %f, str: %s",
event->type, info->phrase_id, info->prob, info->str);
break;
}
}
}
#endif /
CONFIG_KEY_PRESS_DIALOG_MODE */

esp_err_t audio_gmf_trigger_wakeup()
{
esp_gmf_trigger_wakeup(audio_processor_get_afe_handle());
return ESP_OK;
}

esp_err_t audio_recorder_open(recorder_event_callback_t cb, void *ctx)
{
esp_gmf_rb_create(1, 1024 * 3, &out_rb);
#if CONFIG_KEY_PRESS_DIALOG_MODE
(void)cb;
(void)ctx;
return ESP_OK;
#else

esp_gmf_setup_periph_hardware_info hardware_info = {};
esp_gmf_get_periph_info(&hardware_info);

srmodel_list_t *models = esp_srmodel_init("model");
const char *ch_format = hardware_info.codec.type == ESP_GMF_CODEC_TYPE_ES7210_IN_ES8311_OUT ? "RMNM" : "MR";
audio_recorder.afe_cfg = afe_config_init(ch_format, models, AFE_TYPE_SR, AFE_MODE_HIGH_PERF);
audio_recorder.afe_cfg->vad_init = VAD_ENABLE;
audio_recorder.afe_cfg->vad_mode = VAD_MODE_3;
audio_recorder.afe_cfg->vad_min_speech_ms = 64;
audio_recorder.afe_cfg->vad_min_noise_ms = 1000;
audio_recorder.afe_cfg->agc_init = true;
audio_recorder.afe_cfg->memory_alloc_mode = AFE_MEMORY_ALLOC_MORE_PSRAM;
audio_recorder.afe_cfg->wakenet_init = true;
audio_recorder.afe_cfg->aec_init = true;
esp_gmf_afe_manager_cfg_t afe_manager_cfg = DEFAULT_GMF_AFE_MANAGER_CFG(audio_recorder.afe_cfg, NULL, NULL, NULL, NULL);
afe_manager_cfg.feed_task_setting.prio = DEFAULT_FEED_TASK_PRIO;
afe_manager_cfg.feed_task_setting.stack_size = DEFAULT_FEED_TASK_STACK_SIZE;
afe_manager_cfg.fetch_task_setting.prio = DEFAULT_FETCH_TASK_PRIO;
afe_manager_cfg.fetch_task_setting.stack_size = DEFAULT_FETCH_TASK_STACK_SIZE;
esp_gmf_afe_manager_create(&afe_manager_cfg, &audio_recorder.afe_manager);
esp_gmf_element_handle_t gmf_afe = NULL;
esp_gmf_afe_cfg_t gmf_afe_cfg = DEFAULT_GMF_AFE_CFG(audio_recorder.afe_manager, esp_gmf_afe_event_cb, NULL, models);
gmf_afe_cfg.vcmd_detect_en = VCMD_ENABLE;
gmf_afe_cfg.wakeup_end = AFE_WAKEUP_END_MS;
esp_gmf_afe_init(&gmf_afe_cfg, &gmf_afe);
esp_gmf_pool_register_element(audio_manager.pool, gmf_afe, NULL);
const char *name[] = {"ai_afe", "rate_cvt", "encoder"};
esp_gmf_pool_new_pipeline(audio_manager.pool, NULL, name, sizeof(name) / sizeof(char *), NULL, &audio_recorder.pipe);
if (audio_recorder.pipe == NULL) {
    ESP_LOGE(TAG, "There is no pipeline");
    goto __quit;
}
// printf("---》 outport acquire: %p\n", recorder_outport_acquire_write);
esp_gmf_port_handle_t outport = NULL;
outport = NEW_ESP_GMF_PORT_OUT_BYTE(recorder_outport_acquire_write,
                                    recorder_outport_release_write,
                                    NULL,
                                    &outport,
                                    0,
                                    100);
esp_gmf_pipeline_reg_el_port(audio_recorder.pipe, "encoder", ESP_GMF_IO_DIR_WRITER, outport);

esp_gmf_port_handle_t import = NEW_ESP_GMF_PORT_IN_BYTE(recorder_inport_acquire_read,
                               recorder_inport_release_read,
                               NULL,
                               NULL,
                               2048,
                               100);
esp_gmf_pipeline_reg_el_port(audio_recorder.pipe, "ai_afe", ESP_GMF_IO_DIR_READER, import);

esp_gmf_obj_handle_t rate_cvt = NULL;
esp_gmf_pipeline_get_el_by_name(audio_recorder.pipe, "rate_cvt", &rate_cvt);
esp_gmf_rate_cvt_set_dest_rate(rate_cvt, 8000);

esp_gmf_element_handle_t enc_handle = NULL;
esp_gmf_pipeline_get_el_by_name(audio_recorder.pipe, "encoder", &enc_handle);

esp_gmf_info_sound_t info = { 0 };
info.sample_rates = 8000;
info.channels = 1;
info.bits = 16;
esp_gmf_audio_helper_reconfig_enc_by_type(ESP_AUDIO_TYPE_G711A, &info, (esp_audio_enc_config_t *)OBJ_GET_CFG(enc_handle));

esp_gmf_task_cfg_t cfg = DEFAULT_ESP_GMF_TASK_CONFIG();
cfg.ctx = NULL;
cfg.cb = NULL;
cfg.thread.core = 0;
cfg.thread.prio = DEFAULT_GMF_TASK_PRIO;
cfg.thread.stack = DEFAULT_GMF_TASK_STACK_SIZE;
cfg.thread.stack_in_ext = true;
esp_gmf_task_init(&cfg, &audio_recorder.task);
esp_gmf_pipeline_bind_task(audio_recorder.pipe, audio_recorder.task);
esp_gmf_pipeline_loading_jobs(audio_recorder.pipe);
esp_gmf_pipeline_set_event(audio_recorder.pipe, recorder_pipeline_event, NULL);
esp_gmf_pipeline_run(audio_recorder.pipe);

audio_recorder.cb = cb;
audio_recorder.ctx = ctx;
return ESP_OK;

__quit:
esp_gmf_pipeline_stop(audio_recorder.pipe);
esp_gmf_task_deinit(audio_recorder.task);
afe_config_free(audio_recorder.afe_cfg);
esp_gmf_afe_manager_destroy(audio_recorder.afe_manager);
return ESP_FAIL;
#endif /* CONFIG_KEY_PRESS_DIALOG_MODE */
}

esp_err_t audio_recorder_close(void)
{
if (audio_recorder.state == AUDIO_PLAYER_STATE_CLOSED) {
ESP_LOGW(TAG, "Audio recorded is ready closed");
return ESP_OK;
}
#ifndef CONFIG_KEY_PRESS_DIALOG_MODE
esp_gmf_pipeline_destroy(audio_recorder.pipe);
esp_gmf_task_deinit(audio_recorder.task);
afe_config_free(audio_recorder.afe_cfg);
esp_gmf_afe_manager_destroy(audio_recorder.afe_manager);
#endif /* CONFIG_KEY_PRESS_DIALOG_MODE */
audio_recorder.state = AUDIO_PLAYER_STATE_CLOSED;
return ESP_OK;
}

esp_err_t audio_recorder_read_data(uint8_t *data, int data_size)
{
// TODO: will support opus data
#if CONFIG_KEY_PRESS_DIALOG_MODE
esp_codec_dev_read(audio_manager.rec_dev, data, data_size);
return data_size;
#else
esp_gmf_data_bus_block_t blk;
blk.buf = malloc(data_size);
blk.buf_length = data_size;
blk.valid_size = 0;
blk.is_last = false;
esp_gmf_rb_acquire_read(out_rb, &blk, data_size, portMAX_DELAY);
memcpy(data, blk.buf, blk.valid_size);

esp_gmf_rb_release_read(out_rb, &blk, portMAX_DELAY);
free(blk.buf);
return blk.valid_size;

#endif /* CONFIG_KEY_PRESS_DIALOG_MODE */
}

esp_err_t audio_playback_feed_data(uint8_t *data, int data_size)
{
esp_gmf_data_bus_block_t blk = {0};
ESP_LOGE(TAG, "audio_playback_feed_data %d",data_size);
int ret = esp_gmf_fifo_acquire_write(audio_playback.fifo, &blk, data_size, portMAX_DELAY);
if (ret < 0) {
ESP_LOGE(TAG, "Fifo acquire write failed (0x%x)", ret);
return ESP_FAIL;
}
memcpy(blk.buf, data, data_size);
blk.valid_size = data_size;
esp_gmf_fifo_release_write(audio_playback.fifo, &blk, portMAX_DELAY);
return ESP_OK;
}

static size_t current_pos = 0;
static binary_content_t *wav_data = NULL; // 全局变量或通过ctx传递
static int playback_read_callback(uint8_t *data, int data_size, void *ctx)
{

if (wav_data == NULL) {
    wav_data = util_file_read("/spiffs/echo.wav");
    if (!wav_data) return -1;
}

size_t remaining = wav_data->len - current_pos;
if (remaining <= 0) {
    current_pos = 0;  // 循环播放
    remaining = wav_data->len;
    ESP_LOGE(TAG, "read done %d",current_pos);
    return 0;
}

size_t copy_size = (data_size < remaining) ? data_size : remaining;
memcpy(data, wav_data->content + current_pos, copy_size);
current_pos += copy_size;
ESP_LOGE(TAG, "read done %d|%d|%d",data_size,copy_size,current_pos);
return copy_size;

}

static int playback_write_callback(uint8_t *data, int data_size, void *ctx)
{
ESP_LOGE(TAG, "write done %d",data_size);
if (audio_prompt.state == AUDIO_PLAYER_STATE_PLAYING) {
ESP_LOGW(TAG, "Audio prompt is playing, skip\n");
return data_size;
}
esp_codec_dev_handle_t dev = (esp_codec_dev_handle_t)ctx;
int ret = esp_codec_dev_write(dev, data, data_size);
if (ret != ESP_CODEC_DEV_OK) {
ESP_LOGE(TAG, "Write to codec dev failed (0x%x)\n", ret);
return -1;
}
return data_size;
}

static int playback_event_callback(esp_asp_event_pkt_t *event, void *ctx)
{
if (event->type == ESP_ASP_EVENT_TYPE_MUSIC_INFO) {
esp_asp_music_info_t info;
memcpy(&info, event->payload, event->payload_size);
ESP_LOGI(TAG, "Get info, rate:%d, channels:%d, bits:%d", info.sample_rate,
info.channels, info.bits);
} else if (event->type == ESP_ASP_EVENT_TYPE_STATE) {
esp_asp_state_t st = ESP_ASP_STATE_NONE;
memcpy(&st, event->payload, event->payload_size);
ESP_LOGI(TAG, "Get State, %d,%s", st,
esp_audio_simple_player_state_to_str(st));
if (((st == ESP_ASP_STATE_STOPPED) || (st == ESP_ASP_STATE_FINISHED) || (st == ESP_ASP_STATE_ERROR))) {
audio_prompt.state = AUDIO_PLAYER_STATE_IDLE;
ESP_LOGE(TAG, "run again %d",current_pos);
//vTaskDelay(pdMS_TO_TICKS(10));
//audio_playback_close();
//audio_prompt_open();
//audio_playback_run();
current_pos = 0;
}
}
return 0;
}

I (924) esp_psram: SPI SRAM memory test OK
I (933) cpu_start: Pro cpu start user code
I (933) cpu_start: cpu freq: 240000000 Hz
I (933) app_init: Application information:
I (933) app_init: Project name: dc02
I (937) app_init: App version: 0.12.2-dev
I (941) app_init: Compile time: Sep 25 2025 14:03:54
I (946) app_init: ELF file SHA256: f47b3cd8f...
I (950) app_init: ESP-IDF: v5.5.1
I (954) efuse_init: Min chip rev: v0.0
I (958) efuse_init: Max chip rev: v0.99
I (962) efuse_init: Chip rev: v0.2
I (966) heap_init: Initializing. RAM available for dynamic allocation:
I (972) heap_init: At 3FCB02C0 len 00039450 (229 KiB): RAM
I (977) heap_init: At 3FCE9710 len 00005724 (21 KiB): RAM
I (982) heap_init: At 3FCF0000 len 00008000 (32 KiB): DRAM
I (987) heap_init: At 600FE038 len 00001FA0 (7 KiB): RTCRAM
I (993) esp_psram: Adding pool of 5484K of PSRAM memory to heap allocator
I (999) esp_psram: Adding pool of 42K of PSRAM memory gap generated due to end address alignment of drom to the heap allocator
I (1011) spi_flash: detected chip: generic
I (1014) spi_flash: flash io: qio
I (1018) sleep_gpio: Configure to isolate all GPIO pins in sleep state
I (1024) sleep_gpio: Enable automatic switching of GPIO sleep configuration
I (1030) coexist: coex firmware version: b0bcc39
I (1035) coexist: coexist rom version e7ae62f
I (1039) main_task: Started on CPU0
I (1042) esp_psram: Reserving pool of 32K of internal memory for DMA/internal allocations
I (1050) main_task: Calling app_main()
I (1086) system_util: Partition size: total: 956561, used: 66515
I (1104) device_config_core: config_read /spiffs/config not exist
rt_write /spiffs/runtime write success 40
current version 4106790096
device mac 24587cd6eab0
device firmware 4106790096
I (1113) system_util: restart times 41 reason 0

W (1404) i2c.master: Please check pull-up resistances whether be connected properly. Otherwise unexpected behavior would happen. For more detailed information, please read docs
I (1410) bsp_extra_board: I2C master bus created
E (1415) i2c.master: I2C transaction unexpected nack detected
E (1419) i2c.master: s_i2c_synchronous_transaction(945): I2C transaction failed
E (1426) i2c.master: i2c_master_multi_buffer_transmit(1214): I2C transaction failed
E (1434) I2C_If: Fail to write to dev 30
I (1442) ES8311: Work in Slave mode
E (1445) i2s_common: i2s_channel_disable(1218): the channel has not been enabled yet
I (1448) I2S_IF: channel mode 0 bits:32/32 channel:2 mask:3
I (1453) I2S_IF: STD Mode 1 bits:32/32 channel:2 sample_rate:16000 mask:3
I (1474) Adev_Codec: Open codec device OK
I (1479) ES8311: Work in Slave mode
E (1483) i2s_common: i2s_channel_disable(1218): the channel has not been enabled yet
I (1483) I2S_IF: channel mode 0 bits:32/32 channel:2 mask:3
I (1484) I2S_IF: STD Mode 0 bits:32/32 channel:2 sample_rate:16000 mask:3
I (1505) Adev_Codec: Open codec device OK
I (1505) ESP_GMF_BLOCK: The block buf:0x3c29873c, end:0x3c29d73c
I (1505) NEW_DATA_BUS: New block buf, num:1, item_cnt:20480, db:0x3c29d740
I (1510) ESP_GMF_TASK: Waiting to run... [tsk:http-0x3c29d7a8, wk:0x0, run:0]
I (1517) ESP_GMF_TASK: Waiting to run... [tsk:http-0x3c29d7a8, wk:0x3c29f024, run:0]
I (1524) ESP_GMF_BLOCK: The block buf:0x3c2a5750, end:0x3c2aa750
I (1530) NEW_DATA_BUS: New block buf, num:1, item_cnt:20480, db:0x3c29f170
I (1537) ESP_GMF_TASK: Waiting to run... [tsk:http-0x3c29f1d8, wk:0x0, run:0]
I (1543) ESP_GMF_TASK: Waiting to run... [tsk:http-0x3c29f1d8, wk:0x3c29f250, run:0]
W (2352) AUD_SDEC_REG: Overwrote ES decoder 6
W (2352) AUD_SDEC_REG: Overwrote ES decoder 7
W (2352) AUD_SDEC_REG: Overwrote ES decoder 8
I (2356) ASP_POOL: Dest rate:16000
I (2359) ASP_POOL: Dest channels:2
I (2362) ASP_POOL: Dest bits:32
I (2365) ESP_GMF_BLOCK: The block buf:0x3c2ac91c, end:0x3c2b191c
I (2370) NEW_DATA_BUS: New block buf, num:1, item_cnt:20480, db:0x3c2b1920
I (2377) ESP_GMF_TASK: Waiting to run... [tsk:http-0x3c2b1988, wk:0x0, run:0]
I (2384) ESP_GMF_TASK: Waiting to run... [tsk:http-0x3c2b1988, wk:0x3c2b3204, run:0]
I (2392) ESP_GMF_TASK: Waiting to run... [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x0, run:0]
I (2392) AUD_SIMP_PLAYER: Reconfig decoder by music info, rate:16000, channels:1, bits:16, bitrate:0
I (2408) ESP_GMF_TASK: Waiting to run... [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x3c2b3a1c, run:0]
I (2416) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2b3a1c,ctx:0x3c2b34b0, label:aud_simp_dec_open]
I (2426) ESP_GMF_PORT: ACQ IN, new self payload:0x3c2b3444, port:0x3c2b399c, el:0x3c2b34b0-aud_simp_dec
I (2496) util: Read 32846 bytes from /spiffs/echo.wav
E (2496) AUDIO_PROCESSOR: read done 512|512|512
I (2497) ESP_GMF_PORT: ACQ OUT, new self payload:0x3c2b3a1c, port:0x3c2b3680, el:0x3c2b34b0-aud_simp_dec
E (2504) AUDIO_PROCESSOR: read done 512|512|1024
I (2508) ESP_GMF_ASMP_DEC: NOTIFY Info, rate: 0, bits: 0, ch: 0 --> rate: 16000, bits: 16, ch: 1
I (2517) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2bc7f4,ctx:0x3c2b35b0, label:rate_cvt_open]
I (2526) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2bc90c,ctx:0x3c2b3700, label:ch_cvt_open]
I (2535) ESP_GMF_PORT: ACQ OUT, new self payload:0x3c2bc90c, port:0x3c2b391c, el:0x3c2b3700-ch_cvt
I (2543) AUDIO_PROCESSOR: Get info, rate:16000, channels:2, bits:32
I (2549) AUDIO_PROCESSOR: Get State, 1,ESP_AUD_SIMPLE_PLAYER_RUNNING
I (2555) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2bc974,ctx:0x3c2b3850, label:bit_cvt_open]
E (2565) AUDIO_PROCESSOR: write done 2048
E (2568) AUDIO_PROCESSOR: read done 512|512|1536
E (2573) AUDIO_PROCESSOR: write done 2048
E (2576) AUDIO_PROCESSOR: read done 512|512|2048
E (2581) AUDIO_PROCESSOR: write done 2048
E (2584) AUDIO_PROCESSOR: read done 512|512|2560
E (2589) AUDIO_PROCESSOR: write done 2048
E (2592) AUDIO_PROCESSOR: read done 512|512|3072
E (2597) AUDIO_PROCESSOR: write done 2048
E (2601) AUDIO_PROCESSOR: read done 512|512|3584
E (2605) AUDIO_PROCESSOR: write done 2048
E (2609) AUDIO_PROCESSOR: read done 512|512|4096
E (2613) AUDIO_PROCESSOR: write done 2048
E (2617) AUDIO_PROCESSOR: read done 512|512|4608
E (2621) AUDIO_PROCESSOR: write done 2048
E (2625) AUDIO_PROCESSOR: read done 512|512|5120
E (2629) AUDIO_PROCESSOR: write done 2048
E (2633) AUDIO_PROCESSOR: read done 512|512|5632
E (2637) AUDIO_PROCESSOR: write done 2048
E (2645) AUDIO_PROCESSOR: read done 512|512|6144
E (2645) AUDIO_PROCESSOR: write done 2048
E (2660) AUDIO_PROCESSOR: read done 512|512|6656
E (2660) AUDIO_PROCESSOR: write done 2048
E (2675) AUDIO_PROCESSOR: read done 512|512|7168
E (2675) AUDIO_PROCESSOR: write done 2048
E (2690) AUDIO_PROCESSOR: read done 512|512|7680
E (2690) AUDIO_PROCESSOR: write done 2048
E (2705) AUDIO_PROCESSOR: read done 512|512|8192
E (2705) AUDIO_PROCESSOR: write done 2048
E (2720) AUDIO_PROCESSOR: read done 512|512|8704
E (2720) AUDIO_PROCESSOR: write done 2048
E (2750) AUDIO_PROCESSOR: read done 512|512|9216
E (2750) AUDIO_PROCESSOR: write done 2048
E (2765) AUDIO_PROCESSOR: read done 512|512|9728
E (2765) AUDIO_PROCESSOR: write done 2048
E (2780) AUDIO_PROCESSOR: read done 512|512|10240
E (2780) AUDIO_PROCESSOR: write done 2048
E (2795) AUDIO_PROCESSOR: read done 512|512|10752
E (2795) AUDIO_PROCESSOR: write done 2048
E (2810) AUDIO_PROCESSOR: read done 512|512|11264
E (2810) AUDIO_PROCESSOR: write done 2048
E (2825) AUDIO_PROCESSOR: read done 512|512|11776
E (2825) AUDIO_PROCESSOR: write done 2048
E (2840) AUDIO_PROCESSOR: read done 512|512|12288
E (2840) AUDIO_PROCESSOR: write done 2048
E (2855) AUDIO_PROCESSOR: read done 512|512|12800
E (2855) AUDIO_PROCESSOR: write done 2048
E (2870) AUDIO_PROCESSOR: read done 512|512|13312
E (2870) AUDIO_PROCESSOR: write done 2048
E (2885) AUDIO_PROCESSOR: read done 512|512|13824
E (2885) AUDIO_PROCESSOR: write done 2048
E (2900) AUDIO_PROCESSOR: read done 512|512|14336
E (2900) AUDIO_PROCESSOR: write done 2048
E (2915) AUDIO_PROCESSOR: read done 512|512|14848
E (2915) AUDIO_PROCESSOR: write done 2048
E (2930) AUDIO_PROCESSOR: read done 512|512|15360
E (2930) AUDIO_PROCESSOR: write done 2048
E (2945) AUDIO_PROCESSOR: read done 512|512|15872
E (2945) AUDIO_PROCESSOR: write done 2048
E (2960) AUDIO_PROCESSOR: read done 512|512|16384
E (2960) AUDIO_PROCESSOR: write done 2048
E (2990) AUDIO_PROCESSOR: read done 512|512|16896
E (2990) AUDIO_PROCESSOR: write done 2048
E (3005) AUDIO_PROCESSOR: read done 512|512|17408
E (3005) AUDIO_PROCESSOR: write done 2048
E (3020) AUDIO_PROCESSOR: read done 512|512|17920
E (3020) AUDIO_PROCESSOR: write done 2048
E (3035) AUDIO_PROCESSOR: read done 512|512|18432
E (3035) AUDIO_PROCESSOR: write done 2048
E (3050) AUDIO_PROCESSOR: read done 512|512|18944
E (3050) AUDIO_PROCESSOR: write done 2048
E (3065) AUDIO_PROCESSOR: read done 512|512|19456
E (3065) AUDIO_PROCESSOR: write done 2048
E (3080) AUDIO_PROCESSOR: read done 512|512|19968
E (3080) AUDIO_PROCESSOR: write done 2048
E (3095) AUDIO_PROCESSOR: read done 512|512|20480
E (3095) AUDIO_PROCESSOR: write done 2048
E (3110) AUDIO_PROCESSOR: read done 512|512|20992
E (3110) AUDIO_PROCESSOR: write done 2048
E (3125) AUDIO_PROCESSOR: read done 512|512|21504
E (3125) AUDIO_PROCESSOR: write done 2048
E (3140) AUDIO_PROCESSOR: read done 512|512|22016
E (3140) AUDIO_PROCESSOR: write done 2048
E (3155) AUDIO_PROCESSOR: read done 512|512|22528
E (3155) AUDIO_PROCESSOR: write done 2048
E (3170) AUDIO_PROCESSOR: read done 512|512|23040
E (3170) AUDIO_PROCESSOR: write done 2048
E (3185) AUDIO_PROCESSOR: read done 512|512|23552
E (3185) AUDIO_PROCESSOR: write done 2048
E (3200) AUDIO_PROCESSOR: read done 512|512|24064
E (3200) AUDIO_PROCESSOR: write done 2048
E (3230) AUDIO_PROCESSOR: read done 512|512|24576
E (3230) AUDIO_PROCESSOR: write done 2048
E (3245) AUDIO_PROCESSOR: read done 512|512|25088
E (3245) AUDIO_PROCESSOR: write done 2048
E (3260) AUDIO_PROCESSOR: read done 512|512|25600
E (3260) AUDIO_PROCESSOR: write done 2048
E (3275) AUDIO_PROCESSOR: read done 512|512|26112
E (3275) AUDIO_PROCESSOR: write done 2048
E (3290) AUDIO_PROCESSOR: read done 512|512|26624
E (3290) AUDIO_PROCESSOR: write done 2048
E (3305) AUDIO_PROCESSOR: read done 512|512|27136
E (3305) AUDIO_PROCESSOR: write done 2048
E (3320) AUDIO_PROCESSOR: read done 512|512|27648
E (3320) AUDIO_PROCESSOR: write done 2048
E (3335) AUDIO_PROCESSOR: read done 512|512|28160
E (3335) AUDIO_PROCESSOR: write done 2048
E (3350) AUDIO_PROCESSOR: read done 512|512|28672
E (3350) AUDIO_PROCESSOR: write done 2048
E (3365) AUDIO_PROCESSOR: read done 512|512|29184
E (3365) AUDIO_PROCESSOR: write done 2048
E (3380) AUDIO_PROCESSOR: read done 512|512|29696
E (3380) AUDIO_PROCESSOR: write done 2048
E (3395) AUDIO_PROCESSOR: read done 512|512|30208
E (3395) AUDIO_PROCESSOR: write done 2048
E (3410) AUDIO_PROCESSOR: read done 512|512|30720
E (3410) AUDIO_PROCESSOR: write done 2048
E (3425) AUDIO_PROCESSOR: read done 512|512|31232
E (3425) AUDIO_PROCESSOR: write done 2048
E (3440) AUDIO_PROCESSOR: read done 512|512|31744
E (3440) AUDIO_PROCESSOR: write done 2048
E (3470) AUDIO_PROCESSOR: read done 512|512|32256
E (3470) AUDIO_PROCESSOR: write done 2048
E (3485) AUDIO_PROCESSOR: read done 512|512|32768
E (3485) AUDIO_PROCESSOR: write done 2048
E (3500) AUDIO_PROCESSOR: read done 512|78|32846
E (3500) AUDIO_PROCESSOR: write done 2048
E (3515) AUDIO_PROCESSOR: read done 0
I (3515) ESP_GMF_TASK: Job is done, [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x3c2b3a58, job:0x3c2b34b0-aud_simp_dec_proc]
I (3517) ESP_GMF_TASK: Job is done, [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x3c2bc82c, job:0x3c2b35b0-rate_cvt_proc]
I (3527) ESP_GMF_TASK: Job is done, [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x3c2bc940, job:0x3c2b3700-ch_cvt_proc]
I (3537) ESP_GMF_TASK: Job is done, [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x3c2bc9ac, job:0x3c2b3850-bit_cvt_proc]
I (3547) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2bc82c,ctx:0x3c2b34b0, label:aud_simp_dec_close]
I (3556) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2bc850,ctx:0x3c2b35b0, label:rate_cvt_close]
I (3566) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2b3a6c,ctx:0x3c2b3700, label:ch_cvt_close]
I (3575) ESP_GMF_TASK: One times job is complete, del[wk:0x3c2bc1d0,ctx:0x3c2b3850, label:bit_cvt_close]
I (3584) AUDIO_PROCESSOR: Get State, 4,ESP_AUD_SIMPLE_PLAYER_FINISHED
E (3590) AUDIO_PROCESSOR: run again 0
I (3593) ESP_GMF_TASK: Waiting to run... [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x0, run:0]
I (3601) ESP_GMF_TASK: Waiting to run... [tsk:TSK_0x3c2b3398-0x3c2b3398, wk:0x0, run:0]

esp_err_t audio_playback_open(void)
{
esp_err_t err = ESP_GMF_ERR_OK;

do {
    err = esp_gmf_fifo_create(DEFAULT_FIFO_NUM, 1, &audio_playback.fifo);
    if (err != ESP_GMF_ERR_OK) {
        ESP_LOGE(TAG, "oai_plr_dec_fifo init failed (0x%x)", err);
        break;
    }
    esp_asp_cfg_t player_cfg = {0};
    player_cfg.in.cb = playback_read_callback;
    player_cfg.in.user_ctx = audio_playback.fifo;
    player_cfg.out.cb = playback_write_callback;
    player_cfg.out.user_ctx = audio_manager.play_dev;
    player_cfg.task_prio = 5;
    player_cfg.task_stack = 12 * 1024;
    player_cfg.task_core = 1;

    err = esp_audio_simple_player_new(&player_cfg, &audio_playback.player);
    if (err != ESP_GMF_ERR_OK) {
        ESP_LOGE(TAG, "simple_player init failed (0x%x)", err);
        break;
    }
    err = esp_audio_simple_player_set_event(audio_playback.player,
                                            playback_event_callback, NULL);
    if (err != ESP_GMF_ERR_OK) {
        ESP_LOGE(TAG, "set_event failed (0x%x)", err);
        break;
    }
    audio_playback.state = AUDIO_PLAYER_STATE_IDLE;
    return ESP_OK;

} while (0);

if (audio_playback.player) {
    esp_audio_simple_player_destroy(audio_playback.player);
}
if (audio_playback.fifo) {
    esp_gmf_fifo_destroy(audio_playback.fifo);
}
return err;

}

esp_err_t audio_playback_close(void)
{
if (audio_playback.state == AUDIO_PLAYER_STATE_CLOSED) {
ESP_LOGW(TAG, "Aduio playback is realdy closed");
return ESP_OK;
}
if (audio_playback.state == AUDIO_PLAYER_STATE_PLAYING) {
audio_playback_stop();
}
esp_err_t err = esp_audio_simple_player_destroy(audio_playback.player);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Audio playback closing failed");
return ESP_FAIL;
}
audio_playback.state = AUDIO_PLAYER_STATE_CLOSED;
return ESP_OK;
}

esp_err_t audio_playback_run(void)
{
if (audio_playback.state == AUDIO_PLAYER_STATE_PLAYING) {
ESP_LOGW(TAG, "Audio playback is running");
return ESP_OK;
}
esp_asp_music_info_t music_info;
music_info.sample_rate = 16000;
music_info.channels = 1;
music_info.bits = 16;
music_info.bitrate = 0;

esp_err_t err = esp_audio_simple_player_run(audio_playback.player, "raw://spiffs/x.wav",
                &music_info);
if (err != ESP_GMF_ERR_OK) {
    ESP_LOGE(TAG, "run failed (0x%x)", err);
    return ESP_FAIL;
}
audio_playback.state = AUDIO_PLAYER_STATE_PLAYING;
return ESP_OK;

}

esp_err_t audio_playback_stop(void)
{
if (audio_playback.state == AUDIO_PLAYER_STATE_IDLE) {
ESP_LOGW(TAG, "Audio playback is already stopped");
return ESP_OK;
}
esp_err_t ret = esp_audio_simple_player_stop(audio_playback.player);
if (ret != ESP_OK) {
ESP_LOGE(TAG, "Audio playback stop failed");
return ESP_FAIL;
}
audio_playback.state = AUDIO_PLAYER_STATE_IDLE;
return ESP_OK;
}

esp_err_t audio_prompt_open(void)
{
esp_asp_cfg_t cfg = {
.in.cb = NULL,
.in.user_ctx = NULL,
.out.cb = prompt_out_data_callback,
.out.user_ctx = NULL,
.task_prio = 5,
};
esp_gmf_err_t err = esp_audio_simple_player_new(&cfg, &audio_prompt.player);
err = esp_audio_simple_player_set_event(audio_prompt.player, prompt_event_callback, NULL);
audio_prompt.state = AUDIO_PLAYER_STATE_IDLE;
return err;
}

esp_err_t audio_prompt_close(void)
{
if (audio_prompt.state == AUDIO_PLAYER_STATE_PLAYING) {
esp_audio_simple_player_stop(audio_prompt.player);
}
esp_err_t err = esp_audio_simple_player_destroy(audio_prompt.player);
if (err != ESP_OK) {
ESP_LOGE(TAG, "Audio prompt closing failed");
return ESP_FAIL;
}
audio_prompt.state = AUDIO_PLAYER_STATE_CLOSED;
return ESP_OK;
}

esp_err_t audio_prompt_play(const char *url)
{
if (audio_prompt.state == AUDIO_PLAYER_STATE_PLAYING) {
ESP_LOGE(TAG, "audio_prompt is already playing");
return ESP_OK;
}
esp_audio_simple_player_run(audio_prompt.player, url, NULL);
audio_prompt.state = AUDIO_PLAYER_STATE_PLAYING;
return ESP_OK;
}

esp_err_t audio_prompt_stop(void)
{
if (audio_prompt.state == AUDIO_PLAYER_STATE_IDLE) {
ESP_LOGW(TAG, "audio_prompt_stop, but state is idle");
return ESP_FAIL;
}
esp_audio_simple_player_stop(audio_prompt.player);
audio_prompt.state = AUDIO_PLAYER_STATE_IDLE;
return ESP_OK;
}

esp_err_t audio_prompt_play_with_block(const char *url, int timeout_ms)
{
ESP_LOGI(TAG, "audio_prompt_play_with_block, url: %s, timeout_ms: %d", url, timeout_ms);

if (timeout_ms < 0) {
    timeout_ms = 60 * 60 * 1000;
}

int64_t start_time = esp_timer_get_time();
while (audio_prompt.state == AUDIO_PLAYER_STATE_PLAYING) {
    if (esp_timer_get_time() - start_time > (int64_t)timeout_ms * 1000) {
        ESP_LOGE(
            TAG, "Play audio(%s) timeout(%dms), state(%d), start_time(%d), end_time(%d)",
            url, timeout_ms, audio_prompt.state, (int)(start_time / 1000), (int)(esp_timer_get_time() / 1000)
        );
        return ESP_FAIL;
    }
    vTaskDelay(pdMS_TO_TICKS(10));
}
return audio_prompt_play(url);

}

esp_gmf_element_handle_t audio_processor_get_afe_handle(void)
{
esp_gmf_element_handle_t safe = NULL;
esp_gmf_pipeline_get_el_by_name(audio_recorder.pipe, "ai_afe", &safe);
return safe;
}

esp_err_t audio_prompt_play_mute(bool enable_mute)
{
ESP_LOGI(TAG, "audio_prompt_play_mute, enable_mute: %d", enable_mute);

esp_codec_dev_set_out_mute(audio_manager.play_dev, enable_mute);
return ESP_OK;

}

static void recorder_event_callback_fn(void *event, void *ctx)
{
esp_gmf_afe_evt_t *afe_evt = (esp_gmf_afe_evt_t *)event;
switch (afe_evt->type) {
case ESP_GMF_AFE_EVT_WAKEUP_START: {
ESP_LOGI(TAG, "wakeup start");
break;
}
case ESP_GMF_AFE_EVT_WAKEUP_END:
ESP_LOGI(TAG, "wakeup end");
break;
case ESP_GMF_AFE_EVT_VAD_START:
ESP_LOGI(TAG, "vad start");
break;
case ESP_GMF_AFE_EVT_VAD_END:
ESP_LOGI(TAG, "vad end");
break;
case ESP_GMF_AFE_EVT_VCMD_DECT_TIMEOUT:
ESP_LOGI(TAG, "vcmd detect timeout");
break;
default: {
// TODO: vcmd detected
// esp_gmf_afe_vcmd_info_t *info = event->event_data;
// ESP_UTILS_LOGW("Command %d, phrase_id %d, prob %f, str: %s", sevent->type, info->phrase_id, info->prob, info->str);
}
}
}

static void audio_pipe_open(void)
{
vTaskDelay(pdMS_TO_TICKS(800)); // Delay a little time to stagger other initializations
audio_recorder_open(recorder_event_callback_fn, NULL);
audio_playback_open();
audio_playback_run();
}

bool audio_init()
{
power_onoff_audio(1);
power_onoff_pa(1);

esp_gmf_setup_periph_hardware_info periph_info = {
    .i2c = {
        .handle = bsp_i2c_init(),
    },
    .codec = {
        .io_pa = BSP_POWER_AMP_IO,
        .type = ESP_GMF_CODEC_TYPE_ES8311_IN_OUT, // ESP_GMF_CODEC_TYPE_ES7210_IN_ES8311_OUT,
        .dac = {
            .io_mclk = BSP_I2S_MCLK,
            .io_bclk = BSP_I2S_SCLK,
            .io_ws = BSP_I2S_LCLK,
            .io_do = BSP_I2S_DOUT,
            .io_di = BSP_I2S_DSIN,
            .sample_rate = 16000,
            .channel = 2,
            .bits_per_sample = 32,
            .port_num  = 0,
        },
        .adc = {
            .io_mclk = BSP_I2S_MCLK,
            .io_bclk = BSP_I2S_SCLK,
            .io_ws = BSP_I2S_LCLK,
            .io_do = BSP_I2S_DOUT,
            .io_di = BSP_I2S_DSIN,
            .sample_rate = 16000,
            .channel = 2,
            .bits_per_sample = 32,
            .port_num  = 0,
        },
    },
};
ESP_UTILS_CHECK_ERROR_RETURN(audio_manager_init(&periph_info, &play_dev, &rec_dev), false, "Initialize audio manager failed");

vTaskDelay(pdMS_TO_TICKS(800)); // Delay a little time to stagger other initializations
//audio_recorder_open(recorder_event_callback_fn, NULL);
audio_playback_open();
audio_playback_run();


    
//ESP_UTILS_CHECK_ERROR_RETURN(audio_prompt_open(), false, "Open audio prompt failed");
//ESP_UTILS_CHECK_ERROR_RETURN(audio_prompt_play("file://spiffs/echo.wav"), false, "Play wave echo failed");
//audio_prompt_play("https://dl.espressif.com/dl/audio/gs-16b-2c-44100hz.mp3");


util_pause(NULL);
return true;

}

Actual behavior (suspected bug)

as above

Error logs or terminal output

Steps to reproduce the behavior

as above

Project release version

idf 5.5.1

System architecture

Intel/AMD 64-bit (modern PC, older Mac)

Operating system

Windows

Operating system version

windows11

Shell

ZSH

Additional context

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions