diff --git a/dom/html/HTMLMediaElement.cpp b/dom/html/HTMLMediaElement.cpp
index b9b53956f7c6..af4ebc505703 100644
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -2519,10 +2519,6 @@ HTMLMediaElement::Seek(double aTime,
// MediaDecoderReaders.
mPlayingBeforeSeek = IsPotentiallyPlaying();
- // Set the Variable if the Seekstarted while active playing
- if (mPlayingThroughTheAudioChannel) {
- mPlayingThroughTheAudioChannelBeforeSeek = true;
- }
// The media backend is responsible for dispatching the timeupdate
// event if it changes the playback position as a result of the seek.
@@ -3458,14 +3454,11 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed& aNo
mAutoplayEnabled(true),
mPaused(true),
mMuted(0),
- mAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED),
mStatsShowing(false),
mAllowCasting(false),
mIsCasting(false),
mAudioCaptured(false),
- mAudioCapturedByWindow(false),
mPlayingBeforeSeek(false),
- mPlayingThroughTheAudioChannelBeforeSeek(false),
mPausedForInactiveDocumentOrChannel(false),
mEventDeliveryPaused(false),
mIsRunningLoadMethod(false),
@@ -3487,14 +3480,11 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed& aNo
mWaitingForKey(NOT_WAITING_FOR_KEY),
mDownloadSuspendedByCache(false, "HTMLMediaElement::mDownloadSuspendedByCache"),
mAudioChannel(AudioChannelService::GetDefaultAudioChannel()),
- mAudioChannelVolume(1.0),
- mPlayingThroughTheAudioChannel(false),
mDisableVideo(false),
mHasUserInteraction(false),
mFirstFrameLoaded(false),
mDefaultPlaybackStartPosition(0.0),
mIsAudioTrackAudible(false),
- mAudible(IsAudible()),
mVisibilityState(Visibility::APPROXIMATELY_NONVISIBLE),
mErrorSink(new ErrorSink(this)),
mAudioChannelWrapper(new AudioChannelAgentCallback(this, mAudioChannel))
@@ -3516,7 +3506,6 @@ HTMLMediaElement::HTMLMediaElement(already_AddRefed& aNo
mWatchManager.Watch(mReadyState, &HTMLMediaElement::UpdateReadyStateInternal);
mShutdownObserver->Subscribe(this);
- MaybeCreateAudioChannelAgent();
}
HTMLMediaElement::~HTMLMediaElement()
@@ -3557,7 +3546,6 @@ HTMLMediaElement::~HTMLMediaElement()
}
WakeLockRelease();
- mAudioChannelAgent = nullptr;
}
void HTMLMediaElement::StopSuspendingAfterFirstFrame()
@@ -5093,8 +5081,6 @@ void HTMLMediaElement::SeekCompleted()
if (mCurrentPlayRangeStart == -1.0) {
mCurrentPlayRangeStart = CurrentTime();
}
- // Unset the variable on seekend
- mPlayingThroughTheAudioChannelBeforeSeek = false;
}
void HTMLMediaElement::NotifySuspendedByCache(bool aIsSuspended)
@@ -6337,74 +6323,6 @@ ImageContainer* HTMLMediaElement::GetImageContainer()
return container ? container->GetImageContainer() : nullptr;
}
-bool
-HTMLMediaElement::MaybeCreateAudioChannelAgent()
-{
- if (mAudioChannelAgent) {
- return true;
- }
-
- mAudioChannelAgent = new AudioChannelAgent();
- nsresult rv = mAudioChannelAgent->InitWithWeakCallback(OwnerDoc()->GetInnerWindow(),
- static_cast(mAudioChannel),
- this);
- if (NS_WARN_IF(NS_FAILED(rv))) {
- mAudioChannelAgent = nullptr;
- MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
- ("HTMLMediaElement, Fail to initialize the audio channel agent,"
- " this = %p\n", this));
- return false;
- }
-
- return true;
-}
-
-bool
-HTMLMediaElement::IsPlayingThroughTheAudioChannel() const
-{
- // If we have an error, we are not playing.
- if (mErrorSink->mError) {
- return false;
- }
-
- // It might be resumed from remote, we should keep the audio channel agent.
- if (IsSuspendedByAudioChannel()) {
- return true;
- }
-
- // Are we paused
- if (mPaused) {
- return false;
- }
-
- // We should consider any bfcached page or inactive document as non-playing.
- if (!IsActive()) {
- return false;
- }
-
- // A loop always is playing
- if (HasAttr(kNameSpaceID_None, nsGkAtoms::loop)) {
- return true;
- }
-
- // If we are actually playing...
- if (IsCurrentlyPlaying()) {
- return true;
- }
-
- // If we are seeking, we consider it as playing
- if (mPlayingThroughTheAudioChannelBeforeSeek) {
- return true;
- }
-
- // If we are playing an external stream.
- if (mSrcAttrStream) {
- return true;
- }
-
- return false;
-}
-
void
HTMLMediaElement::UpdateAudioChannelPlayingState(bool aForcePlaying)
{
@@ -6413,177 +6331,6 @@ HTMLMediaElement::UpdateAudioChannelPlayingState(bool aForcePlaying)
}
}
-void
-HTMLMediaElement::NotifyAudioChannelAgent(bool aPlaying)
-{
- if (aPlaying) {
- // The reason we don't call NotifyStartedPlaying after the media element
- // really becomes audible is because there is another case needs to block
- // element as early as we can, we would hear sound leaking if we block it
- // too late. In that case (block autoplay in non-visited-tab), we need to
- // create a connection before decoding, because we don't want user hearing
- // any sound.
- AudioPlaybackConfig config;
- nsresult rv = mAudioChannelAgent->NotifyStartedPlaying(&config,
- IsAudible());
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return;
- }
-
- WindowVolumeChanged(config.mVolume, config.mMuted);
- WindowSuspendChanged(config.mSuspend);
- } else {
- mAudioChannelAgent->NotifyStoppedPlaying();
- }
-}
-
-NS_IMETHODIMP
-HTMLMediaElement::WindowVolumeChanged(float aVolume, bool aMuted)
-{
- MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
- ("HTMLMediaElement, WindowVolumeChanged, this = %p, "
- "aVolume = %f, aMuted = %d\n", this, aVolume, aMuted));
-
- if (mAudioChannelVolume != aVolume) {
- mAudioChannelVolume = aVolume;
- SetVolumeInternal();
- }
-
- if (aMuted && !ComputedMuted()) {
- SetMutedInternal(mMuted | MUTED_BY_AUDIO_CHANNEL);
- } else if (!aMuted && ComputedMuted()) {
- SetMutedInternal(mMuted & ~MUTED_BY_AUDIO_CHANNEL);
- }
-
- return NS_OK;
-}
-
-NS_IMETHODIMP
-HTMLMediaElement::WindowSuspendChanged(SuspendTypes aSuspend)
-{
- MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
- ("HTMLMediaElement, WindowSuspendChanged, this = %p, "
- "aSuspend = %d\n", this, aSuspend));
-
- switch (aSuspend) {
- case nsISuspendedTypes::NONE_SUSPENDED:
- ResumeFromAudioChannel();
- break;
- case nsISuspendedTypes::SUSPENDED_PAUSE:
- case nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE:
- PauseByAudioChannel(aSuspend);
- break;
- case nsISuspendedTypes::SUSPENDED_BLOCK:
- BlockByAudioChannel();
- break;
- case nsISuspendedTypes::SUSPENDED_STOP_DISPOSABLE:
- SetAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED);
- Pause();
- break;
- default:
- MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
- ("HTMLMediaElement, WindowSuspendChanged, this = %p, "
- "Error : unknown suspended type!\n", this));
- }
-
- return NS_OK;
-}
-
-void
-HTMLMediaElement::ResumeFromAudioChannel()
-{
- if (!IsSuspendedByAudioChannel()) {
- return;
- }
-
- switch (mAudioChannelSuspended) {
- case nsISuspendedTypes::SUSPENDED_PAUSE:
- case nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE:
- ResumeFromAudioChannelPaused(mAudioChannelSuspended);
- break;
- case nsISuspendedTypes::SUSPENDED_BLOCK:
- ResumeFromAudioChannelBlocked();
- break;
- default:
- MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
- ("HTMLMediaElement, ResumeFromAudioChannel, this = %p, "
- "Error : resume without suspended!\n", this));
- }
-}
-
-void
-HTMLMediaElement::ResumeFromAudioChannelPaused(SuspendTypes aSuspend)
-{
- MOZ_ASSERT(mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE ||
- mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE);
-
- SetAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED);
- nsresult rv = Play();
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return;
- }
- DispatchAsyncEvent(NS_LITERAL_STRING("mozinterruptend"));
-}
-
-void
-HTMLMediaElement::ResumeFromAudioChannelBlocked()
-{
- MOZ_ASSERT(mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_BLOCK);
-
- SetAudioChannelSuspended(nsISuspendedTypes::NONE_SUSPENDED);
- nsresult rv = Play();
- if (NS_WARN_IF(NS_FAILED(rv))) {
- return;
- }
-}
-
-void
-HTMLMediaElement::PauseByAudioChannel(SuspendTypes aSuspend)
-{
- if (IsSuspendedByAudioChannel()) {
- return;
- }
-
- SetAudioChannelSuspended(aSuspend);
- Pause();
- DispatchAsyncEvent(NS_LITERAL_STRING("mozinterruptbegin"));
-}
-
-void
-HTMLMediaElement::BlockByAudioChannel()
-{
- if (IsSuspendedByAudioChannel()) {
- return;
- }
-
- SetAudioChannelSuspended(nsISuspendedTypes::SUSPENDED_BLOCK);
-}
-
-void
-HTMLMediaElement::SetAudioChannelSuspended(SuspendTypes aSuspend)
-{
- if (mAudioChannelSuspended == aSuspend) {
- return;
- }
-
- MaybeNotifyMediaResumed(aSuspend);
- mAudioChannelSuspended = aSuspend;
- MOZ_LOG(AudioChannelService::GetAudioChannelLog(), LogLevel::Debug,
- ("HTMLMediaElement, SetAudioChannelSuspended, this = %p, "
- "aSuspend = %d\n", this, aSuspend));
-
- NotifyAudioPlaybackChanged(
- AudioChannelService::AudibleChangedReasons::ePauseStateChanged);
-}
-
-bool
-HTMLMediaElement::IsSuspendedByAudioChannel() const
-{
- return (mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE ||
- mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE ||
- mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_BLOCK);
-}
-
bool
HTMLMediaElement::IsAllowedToPlay()
{
@@ -6611,36 +6358,6 @@ HTMLMediaElement::IsAllowedToPlay()
return false;
}
-bool
-HTMLMediaElement::IsAllowedToPlayByAudioChannel()
-{
- // The media element has already been paused or blocked, so it can't start
- // playback again by script or user's intend until resuming by audio channel.
- if (mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_PAUSE ||
- mAudioChannelSuspended == nsISuspendedTypes::SUSPENDED_BLOCK) {
- return false;
- }
-
- // If the tab hasn't been activated yet, the media element in that tab can't
- // be playback now until the tab goes to foreground first time or user clicks
- // the unblocking tab icon.
- if (MaybeCreateAudioChannelAgent() && !IsTabActivated()) {
- // Even we haven't start playing yet, we still need to notify the audio
- // channe system because we need to receive the resume notification later.
- UpdateAudioChannelPlayingState(true /* force to start */);
- return false;
- }
-
- return true;
-}
-
-bool
-HTMLMediaElement::IsTabActivated() const
-{
- MOZ_ASSERT(mAudioChannelAgent);
- return !mAudioChannelAgent->ShouldBlockMedia();
-}
-
static const char* VisibilityString(Visibility aVisibility) {
switch(aVisibility) {
case Visibility::UNTRACKED: {
@@ -6922,17 +6639,6 @@ HTMLMediaElement::CannotDecryptWaitingForKey()
}
}
-NS_IMETHODIMP HTMLMediaElement::WindowAudioCaptureChanged(bool aCapture)
-{
- MOZ_ASSERT(mAudioChannelAgent);
-
- if (mAudioCapturedByWindow != aCapture) {
- mAudioCapturedByWindow = aCapture;
- AudioCaptureStreamChangeIfNeeded();
- }
- return NS_OK;
-}
-
AudioTrackList*
HTMLMediaElement::AudioTracks()
{
@@ -7056,59 +6762,6 @@ HTMLMediaElement::NotifyAudioPlaybackChanged(AudibleChangedReasons aReason)
}
}
-bool
-HTMLMediaElement::IsAudible() const
-{
- // Muted or the volume should not be ~0
- if (Muted() || (std::fabs(Volume()) <= 1e-7)) {
- return false;
- }
-
- // No sound can be heard during suspending.
- if (IsSuspendedByAudioChannel()) {
- return false;
- }
-
- // Silent audio track.
- if (!mIsAudioTrackAudible) {
- return false;
- }
-
- return true;
-}
-
-void
-HTMLMediaElement::MaybeNotifyMediaResumed(SuspendTypes aSuspend)
-{
- // In fennec, we should send the notification when media is resumed from the
- // pause-disposable which was called by media control.
- if (mAudioChannelSuspended != nsISuspendedTypes::SUSPENDED_PAUSE_DISPOSABLE &&
- aSuspend != nsISuspendedTypes::NONE_SUSPENDED) {
- return;
- }
-
- MOZ_ASSERT(mAudioChannelAgent);
- uint64_t windowID = mAudioChannelAgent->WindowID();
- NS_DispatchToMainThread(NS_NewRunnableFunction([windowID]() -> void {
- nsCOMPtr observerService =
- services::GetObserverService();
- if (NS_WARN_IF(!observerService)) {
- return;
- }
-
- nsCOMPtr wrapper =
- do_CreateInstance(NS_SUPPORTS_PRUINT64_CONTRACTID);
- if (NS_WARN_IF(!wrapper)) {
- return;
- }
-
- wrapper->SetData(windowID);
- observerService->NotifyObservers(wrapper,
- "media-playback-resumed",
- u"active");
- }));
-}
-
bool
HTMLMediaElement::ShouldElementBePaused()
{
diff --git a/dom/html/HTMLMediaElement.h b/dom/html/HTMLMediaElement.h
index 600803c55305..d2f032554734 100644
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -48,7 +48,6 @@ class MediaResource;
class MediaDecoder;
class VideoFrameContainer;
namespace dom {
-class AudioChannelAgent;
class MediaKeys;
class TextTrack;
class TimeRanges;
@@ -1204,9 +1203,6 @@ protected:
// next block of audio samples) preceeding seek target.
already_AddRefed Seek(double aTime, SeekTarget::Type aSeekType, ErrorResult& aRv);
- // A method to check if we are playing through the AudioChannel.
- bool IsPlayingThroughTheAudioChannel() const;
-
// Update the audio channel playing state
void UpdateAudioChannelPlayingState(bool aForcePlaying = false);
@@ -1222,68 +1218,18 @@ protected:
// Recomputes ready state and fires events as necessary based on current state.
void UpdateReadyStateInternal();
- // Notifies the audio channel agent when the element starts or stops playing.
- void NotifyAudioChannelAgent(bool aPlaying);
-
- // True if we create the audio channel agent successfully or we already have
- // one. The agent is used to communicate with the AudioChannelService. eg.
- // notify we are playing/audible and receive muted/unmuted/suspend/resume
- // commands from AudioChannelService.
- bool MaybeCreateAudioChannelAgent();
-
// Determine if the element should be paused because of suspend conditions.
bool ShouldElementBePaused();
// Create or destroy the captured stream.
void AudioCaptureStreamChange(bool aCapture);
- /**
- * We have different kinds of suspended cases,
- * - SUSPENDED_PAUSE
- * It's used when we temporary lost platform audio focus. MediaElement can
- * only be resumed when we gain the audio focus again.
- *
- * - SUSPENDED_PAUSE_DISPOSABLE
- * It's used when user press the pause botton on the remote media-control.
- * MediaElement can be resumed by reomte media-control or via play().
- *
- * - SUSPENDED_BLOCK
- * It's used to reduce the power comsuption, we won't play the auto-play
- * audio/video in the page we have never visited before. MediaElement would
- * be resumed when the page is active. See bug647429 for more details.
- *
- * - SUSPENDED_STOP_DISPOSABLE
- * When we permanently lost platform audio focus, we shuold stop playing
- * and stop the audio channel agent. MediaElement can only be restarted by
- * play().
- */
- void PauseByAudioChannel(SuspendTypes aSuspend);
- void BlockByAudioChannel();
-
- void ResumeFromAudioChannel();
- void ResumeFromAudioChannelPaused(SuspendTypes aSuspend);
- void ResumeFromAudioChannelBlocked();
-
- bool IsSuspendedByAudioChannel() const;
- void SetAudioChannelSuspended(SuspendTypes aSuspend);
-
// A method to check whether the media element is allowed to start playback.
bool IsAllowedToPlay();
- bool IsAllowedToPlayByAudioChannel();
// If the network state is empty and then we would trigger DoLoad().
void MaybeDoLoad();
- // True if the tab which media element belongs to has been to foreground at
- // least once or activated by manually clicking the unblocking tab icon.
- bool IsTabActivated() const;
-
- bool IsAudible() const;
-
- // It's used for fennec only, send the notification when the user resumes the
- // media which was paused by media control.
- void MaybeNotifyMediaResumed(SuspendTypes aSuspend);
-
class nsAsyncEventRunner;
using nsGenericHTMLElement::DispatchEvent;
// For nsAsyncEventRunner.
@@ -1504,7 +1450,6 @@ protected:
};
uint32_t mMuted;
- SuspendTypes mAudioChannelSuspended;
// True if the media statistics are currently being shown by the builtin
// video controls
@@ -1521,19 +1466,12 @@ protected:
// True if the sound is being captured.
bool mAudioCaptured;
- // True if the sound is being captured by the window.
- bool mAudioCapturedByWindow;
-
// If TRUE then the media element was actively playing before the currently
// in progress seeking. If FALSE then the media element is either not seeking
// or was not actively playing before the current seek. Used to decide whether
// to raise the 'waiting' event as per 4.7.1.8 in HTML 5 specification.
bool mPlayingBeforeSeek;
- // if TRUE then the seek started while content was in active playing state
- // if FALSE then the seek started while the content was not playing.
- bool mPlayingThroughTheAudioChannelBeforeSeek;
-
// True iff this element is paused because the document is inactive or has
// been suspended by the audio channel service.
bool mPausedForInactiveDocumentOrChannel;
@@ -1629,21 +1567,11 @@ protected:
// Audio Channel.
AudioChannel mAudioChannel;
- // The audio channel volume
- float mAudioChannelVolume;
-
- // Is this media element playing?
- bool mPlayingThroughTheAudioChannel;
-
// Disable the video playback by track selection. This flag might not be
// enough if we ever expand the ability of supporting multi-tracks video
// playback.
bool mDisableVideo;
- // An agent used to join audio channel service and its life cycle would equal
- // to media element.
- RefPtr mAudioChannelAgent;
-
RefPtr mTextTrackManager;
RefPtr mAudioTrackList;
@@ -1735,9 +1663,6 @@ private:
// True if the audio track is not silent.
bool mIsAudioTrackAudible;
- // True if media element is audible for users.
- bool mAudible;
-
Visibility mVisibilityState;
UniquePtr mErrorSink;