Bug 1373888 - part5 : only request audio wake lock when it's audible. draft
authorAlastor Wu <alwu@mozilla.com>
Tue, 29 Aug 2017 15:25:44 +0800
changeset 654754 0e9ddbb58cbab18e4d54b2f5de89359f8b37c6ce
parent 654753 c60c73749a84f65e1729db8fef2c37f0168949fa
child 654755 73ab88c767be6926abd51d39bcfc40e41bf3bd49
push id76666
push useralwu@mozilla.com
push dateTue, 29 Aug 2017 07:28:48 +0000
bugs1373888
milestone57.0a1
Bug 1373888 - part5 : only request audio wake lock when it's audible. No need to prevent sleeping for non-audible audio. MozReview-Commit-ID: 6p3azSUWTU2
dom/html/HTMLMediaElement.cpp
dom/html/HTMLMediaElement.h
--- a/dom/html/HTMLMediaElement.cpp
+++ b/dom/html/HTMLMediaElement.cpp
@@ -4167,18 +4167,21 @@ HTMLMediaElement::WakeLockBoolWrapper::o
 
 void
 HTMLMediaElement::WakeLockBoolWrapper::UpdateWakeLock()
 {
   MOZ_ASSERT(NS_IsMainThread());
   MOZ_ASSERT(mOuter);
 
   bool playing = !mValue;
-
-  if (playing) {
+  bool isAudible = mOuter->Volume() > 0.0 &&
+                   !mOuter->mMuted &&
+                   mOuter->mIsAudioTrackAudible;
+  // when playing audible media.
+  if (playing && isAudible) {
     mOuter->WakeLockCreate();
   } else {
     mOuter->WakeLockRelease();
   }
 }
 
 void
 HTMLMediaElement::WakeLockCreate()
@@ -7162,16 +7165,18 @@ HTMLMediaElement::SetAudibleState(bool a
 }
 
 void
 HTMLMediaElement::NotifyAudioPlaybackChanged(AudibleChangedReasons aReason)
 {
   if (mAudioChannelWrapper) {
     mAudioChannelWrapper->NotifyAudioPlaybackChanged(aReason);
   }
+  // only request wake lock for audible media.
+  mPaused.UpdateWakeLock();
 }
 
 bool
 HTMLMediaElement::ShouldElementBePaused()
 {
   // Bfcached page or inactive document.
   if (!IsActive()) {
     return true;
--- a/dom/html/HTMLMediaElement.h
+++ b/dom/html/HTMLMediaElement.h
@@ -826,19 +826,18 @@ protected:
     void SetOuter(HTMLMediaElement* outer) { mOuter = outer; }
 
     MOZ_IMPLICIT operator bool() const { return mValue; }
 
     WakeLockBoolWrapper& operator=(bool val);
 
     bool operator !() const { return !mValue; }
 
+    void UpdateWakeLock();
   private:
-    void UpdateWakeLock();
-
     bool mValue;
     HTMLMediaElement* mOuter;
   };
 
   // Holds references to the DOM wrappers for the MediaStreams that we're
   // writing to.
   struct OutputMediaStream {
     OutputMediaStream();