{
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Failed to start video play, ret=%d", ret);
delete newPlayer;
+ newPlayer = nullptr;
+
+ // 如果启动失败,保持lastFrameView可见,避免黑屏
+ if (lastFrameView_ != nullptr && lastFrameView_->IsVisible()) {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: New player failed to start, keeping last frame view visible to avoid black screen");
+ } else {
+ // 如果没有lastFrameView,尝试切换到默认表情,避免黑屏
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: New player failed to start and no last frame view, attempting to switch to default winking");
+ if (ThunderBirdModel::GetInstance()) {
+ std::string defaultPath = "/user/res/video/CloseEyes/round-eyes/amber.mp4";
+ if (access(defaultPath.c_str(), F_OK) == 0) {
+ // 延迟切换,避免递归调用
+ GraphicService::GetInstance()->PostGraphicEvent(
+ [defaultPath]() {
+ if (ThunderBirdMainView::GetInstance()) {
+ ThunderBirdMainView::GetInstance()->SwitchVideo(defaultPath.c_str());
+ }
+ });
+ }
+ }
+ }
+
g_isSwitchingVideo = false;
return false;
}
}
else if(hideView == THUNDERBIRD_DIALOGUEVIEW && (currentSubView_ == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_LISTENING || currentSubView_ == ThunderBirdDialogueView::THUNDERBIRD_DIALOGUEVIEW_SPEAKING))
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::ChangeView: 退出对话模式,清理资源");
+ // 等待视频切换完成,避免资源冲突
+ if (IsSwitchingVideo()) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::ChangeView: 等待视频切换完成");
+ WaitForVideoSwitchComplete(2000);
+ }
ThunderBirdModel::GetInstance()->StopCountUpTimer();
ThunderBirdPresenter::GetInstance()->SetDialogueing(false);
ln_ws_end_audio_chat();//结束对话
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 记录时间线表情: %s", m_currentExpression.c_str());
// 重置对话模式finished标志
m_dialogueModeFinished = false;
+
+ // 等待视频切换完成,避免在视频切换过程中切换表情导致冲突
+ if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::IsSwitchingVideo()) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 等待视频切换完成");
+ ThunderBirdMainView::WaitForVideoSwitchComplete(2000);
+ }
+
//如果本来就是眨眼的表情直接返回
if (m_currentExpression == "winking" || m_currentExpression.empty() == true) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnEnterDialogueMode: 已经是眨眼表情,无需切换");
return;
}
// 退出对话模式时恢复表情
void ThunderBirdModel::OnExitDialogueMode()
{
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 开始退出对话模式");
+
// 隐藏小绿点
if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::GetInstance()->listenIcon) {
ThunderBirdMainView::GetInstance()->listenIcon->SetVisible(false);
// 重置对话模式finished标志
m_dialogueModeFinished = false;
+ // 等待视频切换完成,避免在视频切换过程中恢复表情导致冲突
+ if (ThunderBirdMainView::GetInstance() && ThunderBirdMainView::IsSwitchingVideo()) {
+ WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 等待视频切换完成");
+ ThunderBirdMainView::WaitForVideoSwitchComplete(2000);
+ }
+
// 恢复到进入对话模式前记录的时间线表情
if (!m_currentExpression.empty()) {
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::OnExitDialogueMode: 恢复时间线表情: %s", m_dialogueExpression.c_str());