-
Notifications
You must be signed in to change notification settings - Fork 15
Description
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