diff --git a/interfaces/inner_api/native/media_sync_manager.h b/interfaces/inner_api/native/media_sync_manager.h index 0662478c215201e077641ee9fb93b9111231d534..84cd543a65f242b22f2653b68c35ab72256a47d7 100644 --- a/interfaces/inner_api/native/media_sync_manager.h +++ b/interfaces/inner_api/native/media_sync_manager.h @@ -129,7 +129,9 @@ private: int64_t currentAnchorMediaTime_ {HST_TIME_NONE}; int64_t currentAbsMediaTime_ {HST_TIME_NONE}; int64_t pausedMediaTime_ {HST_TIME_NONE}; + int64_t pausedExactMediaTime_ {HST_TIME_NONE}; int64_t pausedAbsMediaTime_ {HST_TIME_NONE}; + int64_t pausedExactAbsMediaTime_ {HST_TIME_NONE}; int64_t pausedClockTime_ {HST_TIME_NONE}; int64_t startingTimeMediaUs_ {HST_TIME_NONE}; diff --git a/services/media_engine/modules/sink/media_sync_manager.cpp b/services/media_engine/modules/sink/media_sync_manager.cpp index 78f623b7f8765a9d74abb3dcc5c57c31c9bd6596..9d218e2e07c047f67cb54c36010d02b4c2ff54c1 100644 --- a/services/media_engine/modules/sink/media_sync_manager.cpp +++ b/services/media_engine/modules/sink/media_sync_manager.cpp @@ -166,12 +166,14 @@ Status MediaSyncManager::Resume() { OHOS::Media::AutoLock lock(clockMutex_); // update time anchor after a pause during normal playing - if (clockState_ == State::PAUSED && pausedAbsMediaTime_ != HST_TIME_NONE - && pausedMediaTime_ != HST_TIME_NONE && alreadySetSyncersShouldWait_) { - SimpleUpdateTimeAnchor(GetSystemClock(), pausedMediaTime_, pausedAbsMediaTime_); + if (clockState_ == State::PAUSED && pausedExactAbsMediaTime_ != HST_TIME_NONE + && pausedExactMediaTime_ != HST_TIME_NONE && alreadySetSyncersShouldWait_) { + SimpleUpdateTimeAnchor(GetSystemClock(), pausedExactMediaTime_, pausedExactAbsMediaTime_); pausedMediaTime_ = HST_TIME_NONE; + pausedExactMediaTime_ = HST_TIME_NONE; pausedClockTime_ = HST_TIME_NONE; pausedAbsMediaTime_ = HST_TIME_NONE; + pausedExactAbsMediaTime_ = HST_TIME_NONE; } if (clockState_ == State::RESUMED) { return Status::OK; @@ -197,16 +199,24 @@ Status MediaSyncManager::Pause() if (currentAnchorMediaTime_ != HST_TIME_NONE && currentAnchorClockTime_ != HST_TIME_NONE) { pausedMediaTime_ = SimpleGetMediaTime(currentAnchorClockTime_, delayTime_, pausedClockTime_, currentAnchorMediaTime_, playRate_); + pausedExactMediaTime_ = SimpleGetMediaTimeExactly(currentAnchorClockTime_, delayTime_, pausedClockTime_, + currentAnchorMediaTime_, playRate_); pausedAbsMediaTime_ = SimpleGetMediaTime(currentAnchorClockTime_, delayTime_, pausedClockTime_, currentAbsMediaTime_, playRate_); + pausedExactAbsMediaTime_ = SimpleGetMediaTimeExactly(currentAnchorClockTime_, delayTime_, pausedClockTime_, + currentAbsMediaTime_, playRate_); } else { pausedMediaTime_ = HST_TIME_NONE; + pausedExactMediaTime_ = HST_TIME_NONE; pausedAbsMediaTime_ = HST_TIME_NONE; + pausedExactAbsMediaTime_ = HST_TIME_NONE; } pausedMediaTime_ = ClipMediaTime(pausedMediaTime_); + pausedExactMediaTime_ = ClipMediaTime(pausedExactMediaTime_); pausedAbsMediaTime_ = ClipMediaTime(pausedAbsMediaTime_); - MEDIA_LOG_I("pause with clockTime " PUBLIC_LOG_D64 ", mediaTime " PUBLIC_LOG_D64, pausedClockTime_, - pausedAbsMediaTime_); + pausedExactAbsMediaTime_ = ClipMediaTime(pausedExactAbsMediaTime_); + MEDIA_LOG_I("pause with clockTime " PUBLIC_LOG_D64 ", mediaTime " PUBLIC_LOG_D64 ", exactMediaTime " PUBLIC_LOG_D64, + pausedClockTime_, pausedAbsMediaTime_, pausedExactAbsMediaTime_); clockState_ = State::PAUSED; return Status::OK; } @@ -277,7 +287,9 @@ int64_t MediaSyncManager::ClipMediaTime(int64_t inTime) void MediaSyncManager::ResetTimeAnchorNoLock() { pausedMediaTime_ = HST_TIME_NONE; + pausedExactMediaTime_ = HST_TIME_NONE; pausedAbsMediaTime_ = HST_TIME_NONE; + pausedExactAbsMediaTime_ = HST_TIME_NONE; currentSyncerPriority_ = IMediaSynchronizer::NONE; SimpleUpdateTimeAnchor(HST_TIME_NONE, HST_TIME_NONE, HST_TIME_NONE); }