【求助】T5 tuya_os_sdk3.13.3播放提示音或停止时卡死
目前发现以下两个函数都有概率发生永久阻塞现象:
wukong_audio_player_stop(AI_PLAYER_ALL);
wukong_audio_play_data(AI_AUDIO_CODEC_MP3, data, len);
以下是这两个函数的调用:
Code: Select all
//唤醒进入聆听模式
OPERATE_RET hly_ai_wakeup(void)
{
tal_mutex_lock(_ai_mutex);
if(!ai_start)
{
tal_mutex_unlock(_ai_mutex);
return 0;
}
wukong_audio_player_stop(AI_PLAYER_ALL);
wukong_audio_input_reset();
tuya_ai_agent_event(AI_EVENT_CHAT_BREAK, 0);
wake_up_flag = TRUE;
paly_alart = TRUE;
_hly_ai_set_stat(AI_STAT_LISTEN);
tal_mutex_unlock(_ai_mutex);
wukong_audio_player_alert(AI_TOY_ALERT_TYPE_WAKEUP, FALSE);
return 0;
}
Code: Select all
OPERATE_RET hly_ai_play_alert(HLY_AI_ALERT_E alert)
{
static HLY_AI_ALERT_E curr_alert=HLY_AI_ALERT_MAX;
static uint8_t* data=NULL;
static uint32_t len;
uint8_t str[32]={0};
tal_mutex_lock(_alert_mutex);
TAL_PR_DEBUG("=====hly ai play alert:%d", alert);
if (curr_alert != alert)
{
curr_alert = alert;
if (data != NULL)
{
hly_free_psram(data);
}
switch (curr_alert)
{
case HLY_AI_ALERT_ALARM:
sprintf(&str, "/mp3/%s.mp3", "alarm");
break;
case HLY_AI_ALERT_CLOCK:
sprintf(&str, "/mp3/%s.mp3", "clock");
break;
case HLY_AI_ALERT_ERROR:
sprintf(&str, "/mp3/%s.mp3", "error");
break;
case HLY_AI_ALERT_EXIT:
sprintf(&str, "/mp3/%s.mp3", "exit");
break;
case HLY_AI_ALERT_START:
sprintf(&str, "/mp3/%s.mp3", "start");
break;
case HLY_AI_ALERT_STOP:
sprintf(&str, "/mp3/%s.mp3", "stop");
break;
case HLY_AI_ALERT_WAKEUP:
sprintf(&str, "/mp3/%s.mp3", "wakeup");
break;
default:
tal_mutex_unlock(_alert_mutex);
return -1;
break;
}
TAL_PR_DEBUG("=====hly ai load alert:%s", &str);
if (hly_fs_load_psram(&str, &data, &len) != 0)
{
tal_mutex_unlock(_alert_mutex);
return -3;
}
}
if (data == NULL)
{
tal_mutex_unlock(_alert_mutex);
return -1;
}
int rt = wukong_audio_play_data(AI_AUDIO_CODEC_MP3, data, len);
tal_mutex_unlock(_alert_mutex);
return rt;
}