Title: [280664] trunk
Revision
280664
Author
[email protected]
Date
2021-08-04 14:36:38 -0700 (Wed, 04 Aug 2021)

Log Message

[Catalina][GPUP] Some API tests fail after GPU Process features are enabled
https://bugs.webkit.org/show_bug.cgi?id=228589

Reviewed by Jer Noble.

Source/WebCore:

When "Media in GPU Process" is enabled, `AudioSession[IOS|Mac]` runs in
the GPU process. `HTMLMediaElement`, which is an observer of audio session,
runs in a WebContent process. It cannot get its AudioSession's configuration
directly. We need a mechanism to "push" the latest audio session configuration
from the GPU process to the WebContent process.

This patch replaces the `MutedStateObserver` with an audio session configuration
change observer interface, so that an audio session will notify its observers
after changing its configurations, including buffer size, muted state, sample rate.
Currently, this observer interface is used on macOS only.

No new tests. Fix an API test failure.

* html/HTMLMediaElement.cpp:
(WebCore::HTMLMediaElement::initializeMediaSession):
(WebCore::HTMLMediaElement::~HTMLMediaElement):
(WebCore::HTMLMediaElement::hardwareMutedStateDidChange):
* html/HTMLMediaElement.h:

* platform/audio/AudioSession.cpp:
(WebCore::AudioSession::addConfigurationChangeObserver):
(WebCore::AudioSession::removeConfigurationChangeObserver):
* platform/audio/AudioSession.h:
* platform/audio/ios/AudioSessionIOS.h:
Move `m_interruptionObservers` to this class because only `AudioSessionIOS`
supports interruption observers.
* platform/audio/mac/AudioSessionMac.h:
* platform/audio/mac/AudioSessionMac.mm:
(WebCore::AudioSessionMac::handleSampleRateChange):
(WebCore::AudioSessionMac::handleSampleRateChange const):
(WebCore::AudioSessionMac::handleBufferSizeChange):
(WebCore::AudioSessionMac::handleBufferSizeChange const):
(WebCore::AudioSessionMac::sampleRate const):
(WebCore::AudioSessionMac::setPreferredBufferSize):
(WebCore::AudioSessionMac::handleMutedStateChange):
(WebCore::AudioSessionMac::addConfigurationChangeObserver):
(WebCore::AudioSessionMac::removeConfigurationChangeObserver):
(WebCore::AudioSessionMac::addMutedStateObserver): Deleted.
(WebCore::AudioSessionMac::removeMutedStateObserver): Deleted.

Source/WebKit:

When an audio session's configuration changes, let `RemoteAudioSessionProxy`
in the GPU process send the latest audio session configuration to `RemoteAudioSession`
in the WebContent process through an IPC message (`RemoteAudioSession::ConfigurationChanged`).

* GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::configurationChanged):
* GPUProcess/media/RemoteAudioSessionProxy.h:

* GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
(WebKit::RemoteAudioSessionProxyManager::RemoteAudioSessionProxyManager):
(WebKit::RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager):
(WebKit::RemoteAudioSessionProxyManager::beginAudioSessionInterruption):
(WebKit::RemoteAudioSessionProxyManager::endAudioSessionInterruption):
(WebKit::RemoteAudioSessionProxyManager::hardwareMutedStateDidChange):
(WebKit::RemoteAudioSessionProxyManager::bufferSizeDidChange):
(WebKit::RemoteAudioSessionProxyManager::sampleRateDidChange):
(WebKit::RemoteAudioSessionProxyManager::configurationDidChange):

* GPUProcess/media/RemoteAudioSessionProxyManager.h:
* WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::addConfigurationChangeObserver):
(WebKit::RemoteAudioSession::removeConfigurationChangeObserver):
(WebKit::RemoteAudioSession::configurationChanged):
* WebProcess/GPU/media/RemoteAudioSession.h:
* WebProcess/GPU/media/RemoteAudioSession.messages.in:

Tools:

* TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:
(TestWebKitAPI::TEST):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (280663 => 280664)


--- trunk/Source/WebCore/ChangeLog	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/ChangeLog	2021-08-04 21:36:38 UTC (rev 280664)
@@ -1,3 +1,50 @@
+2021-08-04  Peng Liu  <[email protected]>
+
+        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=228589
+
+        Reviewed by Jer Noble.
+
+        When "Media in GPU Process" is enabled, `AudioSession[IOS|Mac]` runs in
+        the GPU process. `HTMLMediaElement`, which is an observer of audio session,
+        runs in a WebContent process. It cannot get its AudioSession's configuration
+        directly. We need a mechanism to "push" the latest audio session configuration
+        from the GPU process to the WebContent process.
+
+        This patch replaces the `MutedStateObserver` with an audio session configuration
+        change observer interface, so that an audio session will notify its observers
+        after changing its configurations, including buffer size, muted state, sample rate.
+        Currently, this observer interface is used on macOS only.
+
+        No new tests. Fix an API test failure.
+
+        * html/HTMLMediaElement.cpp:
+        (WebCore::HTMLMediaElement::initializeMediaSession):
+        (WebCore::HTMLMediaElement::~HTMLMediaElement):
+        (WebCore::HTMLMediaElement::hardwareMutedStateDidChange):
+        * html/HTMLMediaElement.h:
+
+        * platform/audio/AudioSession.cpp:
+        (WebCore::AudioSession::addConfigurationChangeObserver):
+        (WebCore::AudioSession::removeConfigurationChangeObserver):
+        * platform/audio/AudioSession.h:
+        * platform/audio/ios/AudioSessionIOS.h:
+        Move `m_interruptionObservers` to this class because only `AudioSessionIOS`
+        supports interruption observers.
+        * platform/audio/mac/AudioSessionMac.h:
+        * platform/audio/mac/AudioSessionMac.mm:
+        (WebCore::AudioSessionMac::handleSampleRateChange):
+        (WebCore::AudioSessionMac::handleSampleRateChange const):
+        (WebCore::AudioSessionMac::handleBufferSizeChange):
+        (WebCore::AudioSessionMac::handleBufferSizeChange const):
+        (WebCore::AudioSessionMac::sampleRate const):
+        (WebCore::AudioSessionMac::setPreferredBufferSize):
+        (WebCore::AudioSessionMac::handleMutedStateChange):
+        (WebCore::AudioSessionMac::addConfigurationChangeObserver):
+        (WebCore::AudioSessionMac::removeConfigurationChangeObserver):
+        (WebCore::AudioSessionMac::addMutedStateObserver): Deleted.
+        (WebCore::AudioSessionMac::removeMutedStateObserver): Deleted.
+
 2021-08-04  Miguel Gomez  <[email protected]>
 
         [GTK][WPE] Elliptic radial gradients are not working

Modified: trunk/Source/WebCore/html/HTMLMediaElement.cpp (280663 => 280664)


--- trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/html/HTMLMediaElement.cpp	2021-08-04 21:36:38 UTC (rev 280664)
@@ -513,7 +513,7 @@
     registerWithDocument(document);
 
 #if USE(AUDIO_SESSION) && PLATFORM(MAC)
-    AudioSession::sharedSession().addMutedStateObserver(this);
+    AudioSession::sharedSession().addConfigurationChangeObserver(*this);
 #endif
 
     m_mediaSession->clientWillBeginAutoplaying();
@@ -530,7 +530,7 @@
     unregisterWithDocument(document());
 
 #if USE(AUDIO_SESSION) && PLATFORM(MAC)
-    AudioSession::sharedSession().removeMutedStateObserver(this);
+    AudioSession::sharedSession().removeConfigurationChangeObserver(*this);
 #endif
 
     if (m_audioTracks)
@@ -3808,9 +3808,9 @@
 }
 
 #if USE(AUDIO_SESSION) && PLATFORM(MAC)
-void HTMLMediaElement::hardwareMutedStateDidChange(AudioSession* session)
+void HTMLMediaElement::hardwareMutedStateDidChange(const AudioSession& session)
 {
-    if (!session->isMuted())
+    if (!session.isMuted())
         return;
 
     if (!hasAudio())

Modified: trunk/Source/WebCore/html/HTMLMediaElement.h (280663 => 280664)


--- trunk/Source/WebCore/html/HTMLMediaElement.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/html/HTMLMediaElement.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -128,7 +128,7 @@
     , private TextTrackClient
     , private VideoTrackClient
 #if USE(AUDIO_SESSION) && PLATFORM(MAC)
-    , private AudioSession::MutedStateObserver
+    , private AudioSession::ConfigurationChangeObserver
 #endif
 #if ENABLE(ENCRYPTED_MEDIA)
     , private CDMClient
@@ -882,7 +882,7 @@
     void pageMutedStateDidChange() override;
 
 #if USE(AUDIO_SESSION) && PLATFORM(MAC)
-    void hardwareMutedStateDidChange(AudioSession*) final;
+    void hardwareMutedStateDidChange(const AudioSession&) final;
 #endif
 
     bool processingUserGestureForMedia() const;

Modified: trunk/Source/WebCore/platform/audio/AudioSession.cpp (280663 => 280664)


--- trunk/Source/WebCore/platform/audio/AudioSession.cpp	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/AudioSession.cpp	2021-08-04 21:36:38 UTC (rev 280664)
@@ -201,6 +201,16 @@
     notImplemented();
 }
 
+void AudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver&)
+{
+    notImplemented();
+}
+
+void AudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver&)
+{
+    notImplemented();
+}
+
 void AudioSession::setIsPlayingToBluetoothOverride(std::optional<bool>)
 {
     notImplemented();

Modified: trunk/Source/WebCore/platform/audio/AudioSession.h (280663 => 280664)


--- trunk/Source/WebCore/platform/audio/AudioSession.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/AudioSession.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -91,15 +91,17 @@
     virtual size_t preferredBufferSize() const;
     virtual void setPreferredBufferSize(size_t);
 
-    class MutedStateObserver {
+    class ConfigurationChangeObserver : public CanMakeWeakPtr<ConfigurationChangeObserver> {
     public:
-        virtual ~MutedStateObserver() = default;
+        virtual ~ConfigurationChangeObserver() = default;
 
-        virtual void hardwareMutedStateDidChange(AudioSession*) = 0;
+        virtual void hardwareMutedStateDidChange(const AudioSession&) = 0;
+        virtual void bufferSizeDidChange(const AudioSession&) { }
+        virtual void sampleRateDidChange(const AudioSession&) { }
     };
 
-    virtual void addMutedStateObserver(MutedStateObserver*) { }
-    virtual void removeMutedStateObserver(MutedStateObserver*) { }
+    virtual void addConfigurationChangeObserver(ConfigurationChangeObserver&);
+    virtual void removeConfigurationChangeObserver(ConfigurationChangeObserver&);
 
     virtual void audioOutputDeviceChanged();
     virtual void setIsPlayingToBluetoothOverride(std::optional<bool>);
@@ -134,11 +136,6 @@
 
     virtual bool tryToSetActiveInternal(bool);
 
-    HashSet<MutedStateObserver*> m_observers;
-#if PLATFORM(IOS_FAMILY)
-    WeakHashSet<InterruptionObserver> m_interruptionObservers;
-#endif
-
     WeakPtr<AudioSessionRoutingArbitrationClient> m_routingArbitrationClient;
     bool m_active { false }; // Used only for testing.
 

Modified: trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h (280663 => 280664)


--- trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -66,6 +66,7 @@
 
     AudioSession::CategoryType m_categoryOverride { AudioSession::CategoryType::None };
     Ref<WTF::WorkQueue> m_workQueue;
+    WeakHashSet<InterruptionObserver> m_interruptionObservers;
     RetainPtr<WebInterruptionObserverHelper> m_interruptionObserverHelper;
 };
 

Modified: trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h (280663 => 280664)


--- trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -44,7 +44,9 @@
     void addBufferSizeObserverIfNeeded() const;
 
     static OSStatus handleSampleRateChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData);
+    void handleSampleRateChange() const;
     static OSStatus handleBufferSizeChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData);
+    void handleBufferSizeChange() const;
 
     // AudioSession
     CategoryType category() const final { return m_category; }
@@ -64,10 +66,11 @@
     void setPreferredBufferSize(size_t) final;
     bool isMuted() const final;
     void handleMutedStateChange() final;
-    void addMutedStateObserver(MutedStateObserver*) final;
-    void removeMutedStateObserver(MutedStateObserver*) final;
+    void addConfigurationChangeObserver(ConfigurationChangeObserver&) final;
+    void removeConfigurationChangeObserver(ConfigurationChangeObserver&) final;
 
     std::optional<bool> m_lastMutedState;
+    mutable WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers;
     AudioSession::CategoryType m_category { AudioSession::CategoryType::None };
 #if ENABLE(ROUTING_ARBITRATION)
     bool m_setupArbitrationOngoing { false };

Modified: trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm (280663 => 280664)


--- trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm	2021-08-04 21:36:38 UTC (rev 280664)
@@ -125,9 +125,21 @@
         return result;
 
     session->m_sampleRate = narrowPrecisionToFloat(nominalSampleRate);
+
+    callOnMainThread([session] {
+        session->handleSampleRateChange();
+    });
+
     return noErr;
 }
 
+void AudioSessionMac::handleSampleRateChange() const
+{
+    m_configurationChangeObservers.forEach([this](auto& observer) {
+        observer.sampleRateDidChange(*this);
+    });
+}
+
 void AudioSessionMac::addBufferSizeObserverIfNeeded() const
 {
     if (m_hasBufferSizeObserver)
@@ -163,9 +175,21 @@
         return result;
 
     session->m_bufferSize = bufferSize;
+
+    callOnMainThread([session] {
+        session->handleBufferSizeChange();
+    });
+
     return noErr;
 }
 
+void AudioSessionMac::handleBufferSizeChange() const
+{
+    m_configurationChangeObservers.forEach([this](auto& observer) {
+        observer.bufferSizeDidChange(*this);
+    });
+}
+
 void AudioSessionMac::audioOutputDeviceChanged()
 {
 #if ENABLE(ROUTING_ARBITRATION)
@@ -272,6 +296,8 @@
             RELEASE_LOG_ERROR(Media, "AudioSessionMac::sampleRate() - AudioObjectGetPropertyData() return an invalid sample rate");
             m_sampleRate = 44100;
         }
+
+        handleSampleRateChange();
     }
     return *m_sampleRate;
 }
@@ -406,8 +432,10 @@
 
     result = AudioObjectSetPropertyData(defaultDevice(), &preferredBufferSizeAddress, 0, 0, sizeof(bufferSizeOut), (void*)&bufferSizeOut);
 
-    if (!result)
+    if (!result) {
         m_bufferSize = bufferSizeOut;
+        handleBufferSizeChange();
+    }
 
 #if !LOG_DISABLED
     if (result)
@@ -459,17 +487,18 @@
     if (m_lastMutedState && *m_lastMutedState == isCurrentlyMuted)
         return;
 
-    for (auto* observer : m_observers)
-        observer->hardwareMutedStateDidChange(this);
+    m_lastMutedState = isCurrentlyMuted;
 
-    m_lastMutedState = isCurrentlyMuted;
+    m_configurationChangeObservers.forEach([this](auto& observer) {
+        observer.hardwareMutedStateDidChange(*this);
+    });
 }
 
-void AudioSessionMac::addMutedStateObserver(MutedStateObserver* observer)
+void AudioSessionMac::addConfigurationChangeObserver(ConfigurationChangeObserver& observer)
 {
-    m_observers.add(observer);
+    m_configurationChangeObservers.add(observer);
 
-    if (m_observers.size() > 1)
+    if (m_configurationChangeObservers.computeSize() > 1)
         return;
 
     AudioObjectPropertyAddress muteAddress = {
@@ -486,9 +515,9 @@
     AudioObjectAddPropertyListener(defaultDevice(), &muteAddress, handleMutePropertyChange, this);
 }
 
-void AudioSessionMac::removeMutedStateObserver(MutedStateObserver* observer)
+void AudioSessionMac::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer)
 {
-    if (m_observers.size() == 1) {
+    if (m_configurationChangeObservers.computeSize() == 1) {
         AudioObjectPropertyAddress muteAddress = {
             kAudioDevicePropertyMute,
             kAudioDevicePropertyScopeOutput,
@@ -503,7 +532,7 @@
         AudioObjectRemovePropertyListener(defaultDevice(), &muteAddress, handleMutePropertyChange, this);
     }
 
-    m_observers.remove(observer);
+    m_configurationChangeObservers.remove(observer);
 }
 
 }

Modified: trunk/Source/WebKit/ChangeLog (280663 => 280664)


--- trunk/Source/WebKit/ChangeLog	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/ChangeLog	2021-08-04 21:36:38 UTC (rev 280664)
@@ -1,3 +1,36 @@
+2021-08-04  Peng Liu  <[email protected]>
+
+        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=228589
+
+        Reviewed by Jer Noble.
+
+        When an audio session's configuration changes, let `RemoteAudioSessionProxy`
+        in the GPU process send the latest audio session configuration to `RemoteAudioSession`
+        in the WebContent process through an IPC message (`RemoteAudioSession::ConfigurationChanged`).
+
+        * GPUProcess/media/RemoteAudioSessionProxy.cpp:
+        (WebKit::RemoteAudioSessionProxy::configurationChanged):
+        * GPUProcess/media/RemoteAudioSessionProxy.h:
+
+        * GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
+        (WebKit::RemoteAudioSessionProxyManager::RemoteAudioSessionProxyManager):
+        (WebKit::RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager):
+        (WebKit::RemoteAudioSessionProxyManager::beginAudioSessionInterruption):
+        (WebKit::RemoteAudioSessionProxyManager::endAudioSessionInterruption):
+        (WebKit::RemoteAudioSessionProxyManager::hardwareMutedStateDidChange):
+        (WebKit::RemoteAudioSessionProxyManager::bufferSizeDidChange):
+        (WebKit::RemoteAudioSessionProxyManager::sampleRateDidChange):
+        (WebKit::RemoteAudioSessionProxyManager::configurationDidChange):
+
+        * GPUProcess/media/RemoteAudioSessionProxyManager.h:
+        * WebProcess/GPU/media/RemoteAudioSession.cpp:
+        (WebKit::RemoteAudioSession::addConfigurationChangeObserver):
+        (WebKit::RemoteAudioSession::removeConfigurationChangeObserver):
+        (WebKit::RemoteAudioSession::configurationChanged):
+        * WebProcess/GPU/media/RemoteAudioSession.h:
+        * WebProcess/GPU/media/RemoteAudioSession.messages.in:
+
 2021-08-04  Simon Fraser  <[email protected]>
 
         Crash in DisplayLink::notifyObserversDisplayWasRefreshed() on macOS

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp (280663 => 280664)


--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp	2021-08-04 21:36:38 UTC (rev 280664)
@@ -93,6 +93,11 @@
     completion(m_active);
 }
 
+void RemoteAudioSessionProxy::configurationChanged()
+{
+    connection().send(Messages::RemoteAudioSession::ConfigurationChanged(configuration()), { });
+}
+
 void RemoteAudioSessionProxy::beginInterruption()
 {
     connection().send(Messages::RemoteAudioSession::BeginInterruption(), { });

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h (280663 => 280664)


--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -57,6 +57,7 @@
     size_t preferredBufferSize() const { return m_preferredBufferSize; }
     bool isActive() const { return m_active; }
 
+    void configurationChanged();
     void beginInterruption();
     void endInterruption(WebCore::AudioSession::MayResume);
 

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp (280663 => 280664)


--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp	2021-08-04 21:36:38 UTC (rev 280664)
@@ -47,11 +47,13 @@
     : m_session(AudioSession::create())
 {
     m_session->addInterruptionObserver(*this);
+    m_session->addConfigurationChangeObserver(*this);
 }
 
 RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager()
 {
     m_session->removeInterruptionObserver(*this);
+    m_session->removeConfigurationChangeObserver(*this);
 }
 
 void RemoteAudioSessionProxyManager::addProxy(RemoteAudioSessionProxy& proxy)
@@ -173,20 +175,42 @@
 
 void RemoteAudioSessionProxyManager::beginAudioSessionInterruption()
 {
-    for (auto& proxy : m_proxies) {
+    m_proxies.forEach([](auto& proxy) {
         if (proxy.isActive())
             proxy.beginInterruption();
-    }
+    });
 }
 
 void RemoteAudioSessionProxyManager::endAudioSessionInterruption(AudioSession::MayResume mayResume)
 {
-    for (auto& proxy : m_proxies) {
+    m_proxies.forEach([mayResume](auto& proxy) {
         if (proxy.isActive())
             proxy.endInterruption(mayResume);
-    }
+    });
 }
 
+void RemoteAudioSessionProxyManager::hardwareMutedStateDidChange(const AudioSession& session)
+{
+    configurationDidChange(session);
 }
 
+void RemoteAudioSessionProxyManager::bufferSizeDidChange(const AudioSession& session)
+{
+    configurationDidChange(session);
+}
+
+void RemoteAudioSessionProxyManager::sampleRateDidChange(const AudioSession& session)
+{
+    configurationDidChange(session);
+}
+
+void RemoteAudioSessionProxyManager::configurationDidChange(const WebCore::AudioSession&)
+{
+    m_proxies.forEach([](auto& proxy) {
+        proxy.configurationChanged();
+    });
+}
+
+}
+
 #endif

Modified: trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h (280663 => 280664)


--- trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -37,7 +37,8 @@
 class RemoteAudioSessionProxy;
 
 class RemoteAudioSessionProxyManager
-    : public WebCore::AudioSession::InterruptionObserver {
+    : private WebCore::AudioSession::InterruptionObserver
+    , private WebCore::AudioSession::ConfigurationChangeObserver {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     RemoteAudioSessionProxyManager();
@@ -58,6 +59,11 @@
     void beginAudioSessionInterruption() final;
     void endAudioSessionInterruption(WebCore::AudioSession::MayResume) final;
 
+    void hardwareMutedStateDidChange(const WebCore::AudioSession&) final;
+    void bufferSizeDidChange(const WebCore::AudioSession&) final;
+    void sampleRateDidChange(const WebCore::AudioSession&) final;
+    void configurationDidChange(const WebCore::AudioSession&);
+
     UniqueRef<WebCore::AudioSession> m_session;
     WeakHashSet<RemoteAudioSessionProxy> m_proxies;
 };

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp (280663 => 280664)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp	2021-08-04 21:36:38 UTC (rev 280664)
@@ -122,6 +122,16 @@
     return succeeded;
 }
 
+void RemoteAudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver& observer)
+{
+    m_configurationChangeObservers.add(observer);
+}
+
+void RemoteAudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer)
+{
+    m_configurationChangeObservers.remove(observer);
+}
+
 AudioSession::CategoryType RemoteAudioSession::category() const
 {
 #if PLATFORM(COCOA)
@@ -131,6 +141,26 @@
 #endif
 }
 
+void RemoteAudioSession::configurationChanged(RemoteAudioSessionConfiguration&& configuration)
+{
+    bool mutedStateChanged = !m_configuration || configuration.isMuted != (*m_configuration).isMuted;
+    bool bufferSizeChanged = !m_configuration || configuration.bufferSize != (*m_configuration).bufferSize;
+    bool sampleRateCahnged = !m_configuration || configuration.sampleRate != (*m_configuration).sampleRate;
+
+    m_configuration = WTFMove(configuration);
+
+    m_configurationChangeObservers.forEach([&](auto& observer) {
+        if (mutedStateChanged)
+            observer.hardwareMutedStateDidChange(*this);
+
+        if (bufferSizeChanged)
+            observer.bufferSizeDidChange(*this);
+
+        if (sampleRateCahnged)
+            observer.sampleRateDidChange(*this);
+    });
 }
 
+}
+
 #endif

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h (280663 => 280664)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h	2021-08-04 21:36:38 UTC (rev 280664)
@@ -68,6 +68,8 @@
     void setCategory(CategoryType, WebCore::RouteSharingPolicy) final;
     void setPreferredBufferSize(size_t) final;
     bool tryToSetActiveInternal(bool) final;
+    void addConfigurationChangeObserver(ConfigurationChangeObserver&);
+    void removeConfigurationChangeObserver(ConfigurationChangeObserver&);
 
     const RemoteAudioSessionConfiguration& configuration() const;
     RemoteAudioSessionConfiguration& configuration();
@@ -86,6 +88,7 @@
 
     WebProcess& m_process;
 
+    WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers;
     CategoryType m_category { CategoryType::None };
     WebCore::RouteSharingPolicy m_routeSharingPolicy { WebCore::RouteSharingPolicy::Default };
     std::optional<RemoteAudioSessionConfiguration> m_configuration;

Modified: trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in (280663 => 280664)


--- trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in	2021-08-04 21:36:38 UTC (rev 280664)
@@ -26,6 +26,7 @@
 #if ENABLE(GPU_PROCESS) && USE(AUDIO_SESSION)
 
 messages -> RemoteAudioSession NotRefCounted {
+    ConfigurationChanged(struct WebKit::RemoteAudioSessionConfiguration configuration)
     BeginInterruption()
     EndInterruption(WebCore::AudioSession::MayResume flags)
 }

Modified: trunk/Tools/ChangeLog (280663 => 280664)


--- trunk/Tools/ChangeLog	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Tools/ChangeLog	2021-08-04 21:36:38 UTC (rev 280664)
@@ -1,3 +1,13 @@
+2021-08-04  Peng Liu  <[email protected]>
+
+        [Catalina][GPUP] Some API tests fail after GPU Process features are enabled
+        https://bugs.webkit.org/show_bug.cgi?id=228589
+
+        Reviewed by Jer Noble.
+
+        * TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm:
+        (TestWebKitAPI::TEST):
+
 2021-08-04  Jonathan Bedard  <[email protected]>
 
         [check-github-mirror-integrity] Store remote cache in checkout

Modified: trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm (280663 => 280664)


--- trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm	2021-08-04 21:29:09 UTC (rev 280663)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm	2021-08-04 21:36:38 UTC (rev 280664)
@@ -56,7 +56,7 @@
     return 0;
 }
 
-TEST(WebKit, DISABLED_AudioBufferSize)
+TEST(WebKit, AudioBufferSize)
 {
     auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
     auto context = adoptWK(TestWebKitAPI::Util::createContextForInjectedBundleTest("InternalsInjectedBundleTest"));
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to