Page 1 of 1

使用esp_audio_pay 实现单曲循环播放功能遇到的问题

Posted: Tue Jul 13, 2021 12:41 pm
by luxianquan
1.使用esp_audio_play 播放sd卡中的音乐,
2.然后再回调函数中查看播放状态,
3.待播放完后紧接着重新用esp_audio_play播放。
功能是可以实现,但是上一次播放完成后,衔接的下一次播放都要等25秒中。下面时有关的log
I (2388093) BS-X001: Entry audio call back function status is 4
I (2388103) BS-X001: Entry audio call back function media type is is 0
W (2388103) ESP_AUDIO_CTRL: [media_ctrl_stop]-Already stopped, status is FINISHED, phase:0
I (2388213) BS-X001: play music is file://sdcard/sleep_1.mp3
I (2408233) BS-X001: uart[1] event:
I (2408233) BS-X001: [UART DATA]: 5
I (2408233) BS-X001: [DATA EVT]:ff,55,0,0,54
I (2408233) BS-X001: [DATA EVT]:54
I (2408243) BS-X001: heartbeat frame
W (2413213) ESP_AUDIO_CTRL: Prepare play activity timeout(25 s)
W (2413213) AUDIO_PIPELINE: There are no listener registered

I (2413343) BS-X001: Entry audio call back function status is 1
I (2413343) BS-X001: Entry audio call back function media type is is 0



以下是有关代码:

Code: Select all

 //第一次播放
                            ESP_LOGI(TAG, "play command,music number is %d",datas[3]);
			    if(play_status.playing_flag == true){
					if(play_status.source == SRC_BT)
						periph_bt_stop(test_handle->bt_periph);
					esp_audio_stop(test_handle->player, TERMINATION_TYPE_NOW);
					vTaskDelay(10);
			    	}
				char *url = NULL;
				music_index = datas[3];
				if(music_index < 10)
				sdcard_list_choose(sdcard_list_handle, music_index, &url);	
				 ESP_LOGI(TAG, "play music is %s",url);
				esp_audio_media_type_set(test_handle->player, MEDIA_SRC_TYPE_MUSIC_SD);
			    esp_audio_play(test_handle->player, AUDIO_CODEC_TYPE_DECODER, url, 0);
				play_status.playing_flag = true;
				play_status.source = SRC_SD;

Code: Select all

//回调函数
void audio_service_cb(esp_audio_state_t *audio, void *ctx)
{
     ESP_LOGI(TAG, "Entry audio call back function status is %d",audio->status);
	 ESP_LOGI(TAG, "Entry audio call back function media type is  is %d",audio->media_src);
	 if((music_index !=0)&&(music_index < 10)){
	 	if((audio->status == AUDIO_STATUS_FINISHED)&&\
			(play_status.source == SRC_SD)){
			esp_audio_stop(test_handle->player, TERMINATION_TYPE_NOW);
			vTaskDelay(10);
			char *url = NULL;
			if(music_index < 10)
			sdcard_list_choose(sdcard_list_handle, music_index, &url);	
			ESP_LOGI(TAG, "play music is %s",url);
			esp_audio_media_type_set(test_handle->player, MEDIA_SRC_TYPE_MUSIC_SD);
			esp_audio_play(test_handle->player, AUDIO_CODEC_TYPE_DECODER, url, 0);
			play_status.playing_flag = true;
			play_status.source = SRC_SD;
			}	
	 }
}

Re: 使用esp_audio_pay 实现单曲循环播放功能遇到的问题

Posted: Wed Aug 11, 2021 7:22 am
by ESP_HengYC
1. 在初始化 audio player 的时候,注册一个 player event 的 cb

Code: Select all

    
    esp_audio_cfg_t cfg = DEFAULT_ESP_AUDIO_CONFIG();
    cfg.cb_func = demo_audio_event_callback;   // event cb
    cfg.cb_ctx = NULL;    // input a pointer
    player = esp_audio_create(&cfg);
2. cb handler 做一些 event 的事件管理操作,比如 播放结束后, 可以收到 finish 事件, 那儿可以在这个发送一些 播放下一次 music 的event。

Code: Select all

static void demo_audio_event_callback(esp_audio_state_t *audio, void *ctx)
{
    ESP_LOGI(TAG, "ESP_AUDIO_CALLBACK_FUNC, st:%d,err:%d,src:%x",
             audio->status, audio->err_msg, audio->media_src);
    switch(audio->status){
        case AUDIO_STATUS_RUNNING :
            ESP_LOGI(TAG, "music start ");
            break;
        case AUDIO_STATUS_PAUSED :
            ESP_LOGI(TAG, "Music pause ");
            break;
        case AUDIO_STATUS_STOPPED :
            ESP_LOGI(TAG, "Music stop");
            break;
        case AUDIO_STATUS_FINISHED :
            ESP_LOGI(TAG, "AUDIO_STATUS_UNKNOWN");
            // send play next song event
            break;
        case AUDIO_STATUS_ERROR :
            ESP_LOGI(TAG, "AUDIO_STATUS_ERROR");
            // do something
            break;
    default:
        ESP_LOGE(TAG, "AUDIO_STATUS_UNKNOWN");
        break;
    }
}
3. 外面有一个 task 专门接收这个事件, 用来播放,暂停,或者出错处理的事情。

Re: 使用esp_audio_pay 实现单曲循环播放功能遇到的问题

Posted: Thu Sep 09, 2021 1:41 pm
by jason.mao
Hi luxianquan,

你的 ADF 版本和 IDF 版本是多少?你的完整代码可以提供一下吗?

Re: 使用esp_audio_pay 实现单曲循环播放功能遇到的问题

Posted: Wed Oct 27, 2021 1:32 pm
by luxianquan
不好意思回复晚了,前段时间一直关注都没有人答复所以就去忙其他事儿了,这个问题就一直遗留着。IDF是4.0,ADF 就不太清楚怎么查询了。

Re: 使用esp_audio_pay 实现单曲循环播放功能遇到的问题

Posted: Wed Oct 27, 2021 1:33 pm
by luxianquan
完整代码已经没有了,后面为了演示交差,改用pipeline + relink 的方式,不过那种方式也不好,也是一堆问题。