Bug 1055843 - Do not pause when playbackRate = 0. Instead don't play anything. r=padenot

This commit is contained in:
Jean-Yves Avenard 2014-09-01 14:52:39 +10:00
parent 1538e40c30
commit 87ac9d5c41
2 changed files with 14 additions and 5 deletions

View File

@ -3840,9 +3840,9 @@ HTMLMediaElement::SetPlaybackRate(double aPlaybackRate, ErrorResult& aRv)
mPlaybackRate = ClampPlaybackRate(aPlaybackRate);
if (mPlaybackRate < 0 ||
mPlaybackRate > THRESHOLD_HIGH_PLAYBACKRATE_AUDIO ||
mPlaybackRate < THRESHOLD_LOW_PLAYBACKRATE_AUDIO) {
if (mPlaybackRate != 0.0 &&
(mPlaybackRate < 0 || mPlaybackRate > THRESHOLD_HIGH_PLAYBACKRATE_AUDIO ||
mPlaybackRate < THRESHOLD_LOW_PLAYBACKRATE_AUDIO)) {
SetMutedInternal(mMuted | MUTED_BY_INVALID_PLAYBACK_RATE);
} else {
SetMutedInternal(mMuted & ~MUTED_BY_INVALID_PLAYBACK_RATE);

View File

@ -609,6 +609,9 @@ nsresult MediaDecoder::Play()
MOZ_ASSERT(NS_IsMainThread());
ReentrantMonitorAutoEnter mon(GetReentrantMonitor());
NS_ASSERTION(mDecoderStateMachine != nullptr, "Should have state machine.");
if (mPausedForPlaybackRateNull) {
return NS_OK;
}
nsresult res = ScheduleStateMachineThread();
NS_ENSURE_SUCCESS(res,res);
if ((mPlayState == PLAY_STATE_LOADING && mIsDormant) || mPlayState == PLAY_STATE_SEEKING) {
@ -1437,17 +1440,23 @@ bool MediaDecoder::OnStateMachineThread() const
void MediaDecoder::SetPlaybackRate(double aPlaybackRate)
{
if (aPlaybackRate == 0) {
if (aPlaybackRate == mInitialPlaybackRate) {
return;
}
if (aPlaybackRate == 0.0) {
mPausedForPlaybackRateNull = true;
mInitialPlaybackRate = aPlaybackRate;
Pause();
return;
} else if (mPausedForPlaybackRateNull) {
// Play() uses mPausedForPlaybackRateNull value, so must reset it first
mPausedForPlaybackRateNull = false;
// If the playbackRate is no longer null, restart the playback, iff the
// media was playing.
if (mOwner && !mOwner->GetPaused()) {
Play();
}
mPausedForPlaybackRateNull = false;
}
if (mDecoderStateMachine) {