int64_t AudioSinkWrapper::GetPosition(TimeStamp* aTimeStamp) const { AssertOwnerThread(); MOZ_ASSERT(mIsStarted, "Must be called after playback starts."); int64_t pos = -1; TimeStamp t = TimeStamp::Now(); if (!mAudioEnded) { // Rely on the audio sink to report playback position when it is not ended. pos = mAudioSink->GetPosition(); } else if (!mPlayStartTime.IsNull()) { // Calculate playback position using system clock if we are still playing. pos = GetVideoPosition(t); } else { // Return how long we've played if we are not playing. pos = mPlayDuration; } if (aTimeStamp) { *aTimeStamp = t; } return pos; }
void AudioSinkWrapper::SetPlaybackRate(double aPlaybackRate) { AssertOwnerThread(); mParams.mPlaybackRate = aPlaybackRate; if (!mAudioEnded) { // Pass the playback rate to the audio sink. The underlying AudioStream // will handle playback rate changes and report correct audio position. mAudioSink->SetPlaybackRate(aPlaybackRate); } else if (!mPlayStartTime.IsNull()) { // Adjust playback duration and start time when we are still playing. TimeStamp now = TimeStamp::Now(); mPlayDuration = GetVideoPosition(now); mPlayStartTime = now; } // Do nothing when not playing. Changes in playback rate will be taken into // account by GetVideoPosition(). }