Add a way to mute an AudioContext.
authoradachan@apple.com <adachan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Nov 2014 18:50:12 +0000 (18:50 +0000)
committeradachan@apple.com <adachan@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 20 Nov 2014 18:50:12 +0000 (18:50 +0000)
https://bugs.webkit.org/show_bug.cgi?id=138104

Reviewed by Eric Carlson.

Keep a muted state in AudioDestinationNode. If m_muted is true,
zero out the audio buffers.

No new tests, since it's difficult to test whether the audio is indeed muted.

* Modules/webaudio/AudioContext.cpp:
(WebCore::AudioContext::AudioContext):
Call pageMutedStateDidChange() so it'll initialize the destination audio node's muted state accordingly.
(WebCore::AudioContext::pageMutedStateDidChange):
Set the destination audio node's muted state to match the page's muted state.

* Modules/webaudio/AudioDestinationNode.cpp:
(WebCore::AudioDestinationNode::AudioDestinationNode):
Initialize m_muted.
(WebCore::AudioDestinationNode::render):
If m_muted is true, call AudioBus::zero() to zero out the buffers.
* Modules/webaudio/AudioDestinationNode.h:
(WebCore::AudioDestinationNode::setMuted):
Set m_muted.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@176403 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebCore/ChangeLog
Source/WebCore/Modules/webaudio/AudioContext.cpp
Source/WebCore/Modules/webaudio/AudioDestinationNode.cpp
Source/WebCore/Modules/webaudio/AudioDestinationNode.h

index d8de7f6..662c54a 100644 (file)
@@ -1,3 +1,30 @@
+2014-11-19  Ada Chan  <adachan@apple.com>
+
+        Add a way to mute an AudioContext.
+        https://bugs.webkit.org/show_bug.cgi?id=138104
+
+        Reviewed by Eric Carlson.
+
+        Keep a muted state in AudioDestinationNode. If m_muted is true,
+        zero out the audio buffers.
+
+        No new tests, since it's difficult to test whether the audio is indeed muted.
+
+        * Modules/webaudio/AudioContext.cpp:
+        (WebCore::AudioContext::AudioContext):
+        Call pageMutedStateDidChange() so it'll initialize the destination audio node's muted state accordingly.
+        (WebCore::AudioContext::pageMutedStateDidChange):
+        Set the destination audio node's muted state to match the page's muted state.
+
+        * Modules/webaudio/AudioDestinationNode.cpp:
+        (WebCore::AudioDestinationNode::AudioDestinationNode):
+        Initialize m_muted.
+        (WebCore::AudioDestinationNode::render):
+        If m_muted is true, call AudioBus::zero() to zero out the buffers.
+        * Modules/webaudio/AudioDestinationNode.h:
+        (WebCore::AudioDestinationNode::setMuted):
+        Set m_muted.
+
 2014-11-20  Chris Dumez  <cdumez@apple.com>
 
         Crash when destroying a Document that has a throttled timer still running
index e196192..7f36e26 100644 (file)
@@ -142,6 +142,9 @@ AudioContext::AudioContext(Document& document)
     constructCommon();
 
     m_destinationNode = DefaultAudioDestinationNode::create(this);
+
+    // Initialize the destination node's muted state to match the page's current muted state.
+    pageMutedStateDidChange();
 }
 
 // Constructor for offline (non-realtime) rendering.
@@ -975,7 +978,8 @@ bool AudioContext::isPlayingAudio()
 
 void AudioContext::pageMutedStateDidChange()
 {
-    // FIXME https://bugs.webkit.org/show_bug.cgi?id=138104: Handle muting web audio.
+    if (m_destinationNode && document()->page())
+        m_destinationNode->setMuted(document()->page()->isMuted());
 }
 
 void AudioContext::isPlayingAudioDidChange()
index 684d2cd..afea416 100644 (file)
@@ -41,6 +41,7 @@ AudioDestinationNode::AudioDestinationNode(AudioContext* context, float sampleRa
     , m_currentSampleFrame(0)
     , m_isSilent(true)
     , m_isEffectivelyPlayingAudio(false)
+    , m_muted(false)
 {
     addInput(std::make_unique<AudioNodeInput>(this));
     
@@ -107,6 +108,11 @@ void AudioDestinationNode::render(AudioBus* sourceBus, AudioBus* destinationBus,
     m_currentSampleFrame += numberOfFrames;
 
     setIsSilent(destinationBus->isSilent());
+
+    // The reason we are handling mute after the call to setIsSilent() is because the muted state does
+    // not affect the audio destination node's effective playing state.
+    if (m_muted)
+        destinationBus->zero();
 }
 
 void AudioDestinationNode::isPlayingDidChange()
index 4438d2e..7489464 100644 (file)
@@ -64,6 +64,7 @@ public:
     virtual bool isPlaying() { return false; }
     virtual void isPlayingDidChange() override;
     bool isPlayingAudio() const { return m_isEffectivelyPlayingAudio; }
+    void setMuted(bool muted) { m_muted = muted; }
 
 protected:
     // LocalAudioInputProvider allows us to expose an AudioSourceProvider for local/live audio input.
@@ -106,6 +107,7 @@ protected:
     LocalAudioInputProvider m_localAudioInputProvider;
     bool m_isSilent;
     bool m_isEffectivelyPlayingAudio;
+    bool m_muted;
 };
 
 } // namespace WebCore