}
+ bool ThunderBirdMainView::IsSwitchingVideo()
+ {
+ return g_isSwitchingVideo;
+ }
+
+ bool ThunderBirdMainView::WaitForVideoSwitchComplete(int maxWaitMs)
+ {
+ int waitCount = 0;
+ int maxWaitCount = maxWaitMs / 20; // 每20ms检查一次
+ while (g_isSwitchingVideo && waitCount < maxWaitCount)
+ {
+ usleep(20000); // 等待20ms
+ waitCount++;
+ }
+ if (g_isSwitchingVideo)
+ {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::WaitForVideoSwitchComplete: Timeout after %d ms, video switch still in progress", maxWaitMs);
+ return false;
+ }
+ return true;
+ }
+
bool ThunderBirdMainView::SwitchVideo(const char *uri) // 切换表情接口
{
WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Switching to video: %s", uri ? uri : "null");
return true; // 返回true表示"成功",因为不需要切换
}
+ // 如果正在切换视频,等待完成(最多等待2秒)
+ if (g_isSwitchingVideo)
+ {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Video switch in progress, waiting for completion...");
+ if (!WaitForVideoSwitchComplete(2000))
+ {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Previous video switch did not complete in time, proceeding anyway");
+ }
+ }
+
// 设置切换视频标志,防止屏幕状态通知暂停播放
g_isSwitchingVideo = true;
WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: switching to video: %s", normalizedPath.c_str());
- // 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数
- // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交
- GraphicService::GetInstance()->PostGraphicEvent(
- [normalizedPath]() {
- if (ThunderBirdMainView::GetInstance()) {
- ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str());
- } else {
- WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView instance is null");
- }
- });
+ // 检查 ThunderBirdMainView 是否已初始化
+ // 如果未初始化,直接返回,避免在启动时出现问题
+ if (ThunderBirdMainView::GetInstance() == nullptr)
+ {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView not initialized yet, skipping switch");
+ return false;
+ }
+
+ // 如果正在切换视频,等待完成(最多等待2秒)
+ // 这样可以避免快速进入/退出对话模式时导致的表情切换冲突
+ if (ThunderBirdMainView::IsSwitchingVideo())
+ {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: Video switch in progress, waiting for completion...");
+ // 在图形线程中等待,避免阻塞当前线程
+ GraphicService::GetInstance()->PostGraphicEvent(
+ [normalizedPath]() {
+ // 等待之前的切换完成
+ if (ThunderBirdMainView::GetInstance()) {
+ ThunderBirdMainView::WaitForVideoSwitchComplete(2000);
+ // 再次检查是否还在切换(防止超时后仍在切换)
+ if (!ThunderBirdMainView::IsSwitchingVideo()) {
+ ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str());
+ } else {
+ WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: Video switch still in progress after wait, skipping this switch");
+ }
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView instance is null");
+ }
+ });
+ } else {
+ // 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数
+ // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交
+ GraphicService::GetInstance()->PostGraphicEvent(
+ [normalizedPath]() {
+ if (ThunderBirdMainView::GetInstance()) {
+ ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str());
+ } else {
+ WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView instance is null");
+ }
+ });
+ }
return true; // 异步调用,返回 true 表示调用已提交
}