Changeset 280664 in webkit
- Timestamp:
- Aug 4, 2021, 2:36:38 PM (5 years ago)
- Location:
- trunk
- Files:
-
- 18 edited
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/html/HTMLMediaElement.cpp (modified) (3 diffs)
-
Source/WebCore/html/HTMLMediaElement.h (modified) (2 diffs)
-
Source/WebCore/platform/audio/AudioSession.cpp (modified) (1 diff)
-
Source/WebCore/platform/audio/AudioSession.h (modified) (2 diffs)
-
Source/WebCore/platform/audio/ios/AudioSessionIOS.h (modified) (1 diff)
-
Source/WebCore/platform/audio/mac/AudioSessionMac.h (modified) (2 diffs)
-
Source/WebCore/platform/audio/mac/AudioSessionMac.mm (modified) (7 diffs)
-
Source/WebKit/ChangeLog (modified) (1 diff)
-
Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp (modified) (1 diff)
-
Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h (modified) (1 diff)
-
Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp (modified) (3 diffs)
-
Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h (modified) (2 diffs)
-
Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp (modified) (2 diffs)
-
Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h (modified) (2 diffs)
-
Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in (modified) (1 diff)
-
Tools/ChangeLog (modified) (1 diff)
-
Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r280654 r280664 1 2021-08-04 Peng Liu <peng.liu6@apple.com> 2 3 [Catalina][GPUP] Some API tests fail after GPU Process features are enabled 4 https://bugs.webkit.org/show_bug.cgi?id=228589 5 6 Reviewed by Jer Noble. 7 8 When "Media in GPU Process" is enabled, `AudioSession[IOS|Mac]` runs in 9 the GPU process. `HTMLMediaElement`, which is an observer of audio session, 10 runs in a WebContent process. It cannot get its AudioSession's configuration 11 directly. We need a mechanism to "push" the latest audio session configuration 12 from the GPU process to the WebContent process. 13 14 This patch replaces the `MutedStateObserver` with an audio session configuration 15 change observer interface, so that an audio session will notify its observers 16 after changing its configurations, including buffer size, muted state, sample rate. 17 Currently, this observer interface is used on macOS only. 18 19 No new tests. Fix an API test failure. 20 21 * html/HTMLMediaElement.cpp: 22 (WebCore::HTMLMediaElement::initializeMediaSession): 23 (WebCore::HTMLMediaElement::~HTMLMediaElement): 24 (WebCore::HTMLMediaElement::hardwareMutedStateDidChange): 25 * html/HTMLMediaElement.h: 26 27 * platform/audio/AudioSession.cpp: 28 (WebCore::AudioSession::addConfigurationChangeObserver): 29 (WebCore::AudioSession::removeConfigurationChangeObserver): 30 * platform/audio/AudioSession.h: 31 * platform/audio/ios/AudioSessionIOS.h: 32 Move `m_interruptionObservers` to this class because only `AudioSessionIOS` 33 supports interruption observers. 34 * platform/audio/mac/AudioSessionMac.h: 35 * platform/audio/mac/AudioSessionMac.mm: 36 (WebCore::AudioSessionMac::handleSampleRateChange): 37 (WebCore::AudioSessionMac::handleSampleRateChange const): 38 (WebCore::AudioSessionMac::handleBufferSizeChange): 39 (WebCore::AudioSessionMac::handleBufferSizeChange const): 40 (WebCore::AudioSessionMac::sampleRate const): 41 (WebCore::AudioSessionMac::setPreferredBufferSize): 42 (WebCore::AudioSessionMac::handleMutedStateChange): 43 (WebCore::AudioSessionMac::addConfigurationChangeObserver): 44 (WebCore::AudioSessionMac::removeConfigurationChangeObserver): 45 (WebCore::AudioSessionMac::addMutedStateObserver): Deleted. 46 (WebCore::AudioSessionMac::removeMutedStateObserver): Deleted. 47 1 48 2021-08-04 Miguel Gomez <magomez@igalia.com> 2 49 -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r280624 r280664 514 514 515 515 #if USE(AUDIO_SESSION) && PLATFORM(MAC) 516 AudioSession::sharedSession().add MutedStateObserver(this);516 AudioSession::sharedSession().addConfigurationChangeObserver(*this); 517 517 #endif 518 518 … … 531 531 532 532 #if USE(AUDIO_SESSION) && PLATFORM(MAC) 533 AudioSession::sharedSession().remove MutedStateObserver(this);533 AudioSession::sharedSession().removeConfigurationChangeObserver(*this); 534 534 #endif 535 535 … … 3809 3809 3810 3810 #if USE(AUDIO_SESSION) && PLATFORM(MAC) 3811 void HTMLMediaElement::hardwareMutedStateDidChange( AudioSession*session)3812 { 3813 if (!session ->isMuted())3811 void HTMLMediaElement::hardwareMutedStateDidChange(const AudioSession& session) 3812 { 3813 if (!session.isMuted()) 3814 3814 return; 3815 3815 -
trunk/Source/WebCore/html/HTMLMediaElement.h
r280330 r280664 129 129 , private VideoTrackClient 130 130 #if USE(AUDIO_SESSION) && PLATFORM(MAC) 131 , private AudioSession:: MutedStateObserver131 , private AudioSession::ConfigurationChangeObserver 132 132 #endif 133 133 #if ENABLE(ENCRYPTED_MEDIA) … … 883 883 884 884 #if USE(AUDIO_SESSION) && PLATFORM(MAC) 885 void hardwareMutedStateDidChange( AudioSession*) final;885 void hardwareMutedStateDidChange(const AudioSession&) final; 886 886 #endif 887 887 -
trunk/Source/WebCore/platform/audio/AudioSession.cpp
r280462 r280664 202 202 } 203 203 204 void AudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver&) 205 { 206 notImplemented(); 207 } 208 209 void AudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver&) 210 { 211 notImplemented(); 212 } 213 204 214 void AudioSession::setIsPlayingToBluetoothOverride(std::optional<bool>) 205 215 { -
trunk/Source/WebCore/platform/audio/AudioSession.h
r280462 r280664 92 92 virtual void setPreferredBufferSize(size_t); 93 93 94 class MutedStateObserver{94 class ConfigurationChangeObserver : public CanMakeWeakPtr<ConfigurationChangeObserver> { 95 95 public: 96 virtual ~MutedStateObserver() = default; 97 98 virtual void hardwareMutedStateDidChange(AudioSession*) = 0; 96 virtual ~ConfigurationChangeObserver() = default; 97 98 virtual void hardwareMutedStateDidChange(const AudioSession&) = 0; 99 virtual void bufferSizeDidChange(const AudioSession&) { } 100 virtual void sampleRateDidChange(const AudioSession&) { } 99 101 }; 100 102 101 virtual void add MutedStateObserver(MutedStateObserver*) { }102 virtual void remove MutedStateObserver(MutedStateObserver*) { }103 virtual void addConfigurationChangeObserver(ConfigurationChangeObserver&); 104 virtual void removeConfigurationChangeObserver(ConfigurationChangeObserver&); 103 105 104 106 virtual void audioOutputDeviceChanged(); … … 134 136 135 137 virtual bool tryToSetActiveInternal(bool); 136 137 HashSet<MutedStateObserver*> m_observers;138 #if PLATFORM(IOS_FAMILY)139 WeakHashSet<InterruptionObserver> m_interruptionObservers;140 #endif141 138 142 139 WeakPtr<AudioSessionRoutingArbitrationClient> m_routingArbitrationClient; -
trunk/Source/WebCore/platform/audio/ios/AudioSessionIOS.h
r279119 r280664 67 67 AudioSession::CategoryType m_categoryOverride { AudioSession::CategoryType::None }; 68 68 Ref<WTF::WorkQueue> m_workQueue; 69 WeakHashSet<InterruptionObserver> m_interruptionObservers; 69 70 RetainPtr<WebInterruptionObserverHelper> m_interruptionObserverHelper; 70 71 }; -
trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.h
r278253 r280664 45 45 46 46 static OSStatus handleSampleRateChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData); 47 void handleSampleRateChange() const; 47 48 static OSStatus handleBufferSizeChange(AudioObjectID, UInt32, const AudioObjectPropertyAddress*, void* inClientData); 49 void handleBufferSizeChange() const; 48 50 49 51 // AudioSession … … 65 67 bool isMuted() const final; 66 68 void handleMutedStateChange() final; 67 void add MutedStateObserver(MutedStateObserver*) final;68 void remove MutedStateObserver(MutedStateObserver*) final;69 void addConfigurationChangeObserver(ConfigurationChangeObserver&) final; 70 void removeConfigurationChangeObserver(ConfigurationChangeObserver&) final; 69 71 70 72 std::optional<bool> m_lastMutedState; 73 mutable WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers; 71 74 AudioSession::CategoryType m_category { AudioSession::CategoryType::None }; 72 75 #if ENABLE(ROUTING_ARBITRATION) -
trunk/Source/WebCore/platform/audio/mac/AudioSessionMac.mm
r278253 r280664 126 126 127 127 session->m_sampleRate = narrowPrecisionToFloat(nominalSampleRate); 128 129 callOnMainThread([session] { 130 session->handleSampleRateChange(); 131 }); 132 128 133 return noErr; 134 } 135 136 void AudioSessionMac::handleSampleRateChange() const 137 { 138 m_configurationChangeObservers.forEach([this](auto& observer) { 139 observer.sampleRateDidChange(*this); 140 }); 129 141 } 130 142 … … 164 176 165 177 session->m_bufferSize = bufferSize; 178 179 callOnMainThread([session] { 180 session->handleBufferSizeChange(); 181 }); 182 166 183 return noErr; 184 } 185 186 void AudioSessionMac::handleBufferSizeChange() const 187 { 188 m_configurationChangeObservers.forEach([this](auto& observer) { 189 observer.bufferSizeDidChange(*this); 190 }); 167 191 } 168 192 … … 273 297 m_sampleRate = 44100; 274 298 } 299 300 handleSampleRateChange(); 275 301 } 276 302 return *m_sampleRate; … … 407 433 result = AudioObjectSetPropertyData(defaultDevice(), &preferredBufferSizeAddress, 0, 0, sizeof(bufferSizeOut), (void*)&bufferSizeOut); 408 434 409 if (!result) 435 if (!result) { 410 436 m_bufferSize = bufferSizeOut; 437 handleBufferSizeChange(); 438 } 411 439 412 440 #if !LOG_DISABLED … … 460 488 return; 461 489 462 for (auto* observer : m_observers)463 observer->hardwareMutedStateDidChange(this);464 465 490 m_lastMutedState = isCurrentlyMuted; 466 } 467 468 void AudioSessionMac::addMutedStateObserver(MutedStateObserver* observer) 469 { 470 m_observers.add(observer); 471 472 if (m_observers.size() > 1) 491 492 m_configurationChangeObservers.forEach([this](auto& observer) { 493 observer.hardwareMutedStateDidChange(*this); 494 }); 495 } 496 497 void AudioSessionMac::addConfigurationChangeObserver(ConfigurationChangeObserver& observer) 498 { 499 m_configurationChangeObservers.add(observer); 500 501 if (m_configurationChangeObservers.computeSize() > 1) 473 502 return; 474 503 … … 487 516 } 488 517 489 void AudioSessionMac::remove MutedStateObserver(MutedStateObserver*observer)490 { 491 if (m_ observers.size() == 1) {518 void AudioSessionMac::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer) 519 { 520 if (m_configurationChangeObservers.computeSize() == 1) { 492 521 AudioObjectPropertyAddress muteAddress = { 493 522 kAudioDevicePropertyMute, … … 504 533 } 505 534 506 m_ observers.remove(observer);535 m_configurationChangeObservers.remove(observer); 507 536 } 508 537 -
trunk/Source/WebKit/ChangeLog
r280653 r280664 1 2021-08-04 Peng Liu <peng.liu6@apple.com> 2 3 [Catalina][GPUP] Some API tests fail after GPU Process features are enabled 4 https://bugs.webkit.org/show_bug.cgi?id=228589 5 6 Reviewed by Jer Noble. 7 8 When an audio session's configuration changes, let `RemoteAudioSessionProxy` 9 in the GPU process send the latest audio session configuration to `RemoteAudioSession` 10 in the WebContent process through an IPC message (`RemoteAudioSession::ConfigurationChanged`). 11 12 * GPUProcess/media/RemoteAudioSessionProxy.cpp: 13 (WebKit::RemoteAudioSessionProxy::configurationChanged): 14 * GPUProcess/media/RemoteAudioSessionProxy.h: 15 16 * GPUProcess/media/RemoteAudioSessionProxyManager.cpp: 17 (WebKit::RemoteAudioSessionProxyManager::RemoteAudioSessionProxyManager): 18 (WebKit::RemoteAudioSessionProxyManager::~RemoteAudioSessionProxyManager): 19 (WebKit::RemoteAudioSessionProxyManager::beginAudioSessionInterruption): 20 (WebKit::RemoteAudioSessionProxyManager::endAudioSessionInterruption): 21 (WebKit::RemoteAudioSessionProxyManager::hardwareMutedStateDidChange): 22 (WebKit::RemoteAudioSessionProxyManager::bufferSizeDidChange): 23 (WebKit::RemoteAudioSessionProxyManager::sampleRateDidChange): 24 (WebKit::RemoteAudioSessionProxyManager::configurationDidChange): 25 26 * GPUProcess/media/RemoteAudioSessionProxyManager.h: 27 * WebProcess/GPU/media/RemoteAudioSession.cpp: 28 (WebKit::RemoteAudioSession::addConfigurationChangeObserver): 29 (WebKit::RemoteAudioSession::removeConfigurationChangeObserver): 30 (WebKit::RemoteAudioSession::configurationChanged): 31 * WebProcess/GPU/media/RemoteAudioSession.h: 32 * WebProcess/GPU/media/RemoteAudioSession.messages.in: 33 1 34 2021-08-04 Simon Fraser <simon.fraser@apple.com> 2 35 -
trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp
r277584 r280664 94 94 } 95 95 96 void RemoteAudioSessionProxy::configurationChanged() 97 { 98 connection().send(Messages::RemoteAudioSession::ConfigurationChanged(configuration()), { }); 99 } 100 96 101 void RemoteAudioSessionProxy::beginInterruption() 97 102 { -
trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h
r277584 r280664 58 58 bool isActive() const { return m_active; } 59 59 60 void configurationChanged(); 60 61 void beginInterruption(); 61 62 void endInterruption(WebCore::AudioSession::MayResume); -
trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp
r277584 r280664 48 48 { 49 49 m_session->addInterruptionObserver(*this); 50 m_session->addConfigurationChangeObserver(*this); 50 51 } 51 52 … … 53 54 { 54 55 m_session->removeInterruptionObserver(*this); 56 m_session->removeConfigurationChangeObserver(*this); 55 57 } 56 58 … … 174 176 void RemoteAudioSessionProxyManager::beginAudioSessionInterruption() 175 177 { 176 for (auto& proxy : m_proxies) {178 m_proxies.forEach([](auto& proxy) { 177 179 if (proxy.isActive()) 178 180 proxy.beginInterruption(); 179 } 181 }); 180 182 } 181 183 182 184 void RemoteAudioSessionProxyManager::endAudioSessionInterruption(AudioSession::MayResume mayResume) 183 185 { 184 for (auto& proxy : m_proxies) {186 m_proxies.forEach([mayResume](auto& proxy) { 185 187 if (proxy.isActive()) 186 188 proxy.endInterruption(mayResume); 187 } 189 }); 190 } 191 192 void RemoteAudioSessionProxyManager::hardwareMutedStateDidChange(const AudioSession& session) 193 { 194 configurationDidChange(session); 195 } 196 197 void RemoteAudioSessionProxyManager::bufferSizeDidChange(const AudioSession& session) 198 { 199 configurationDidChange(session); 200 } 201 202 void RemoteAudioSessionProxyManager::sampleRateDidChange(const AudioSession& session) 203 { 204 configurationDidChange(session); 205 } 206 207 void RemoteAudioSessionProxyManager::configurationDidChange(const WebCore::AudioSession&) 208 { 209 m_proxies.forEach([](auto& proxy) { 210 proxy.configurationChanged(); 211 }); 188 212 } 189 213 -
trunk/Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.h
r278374 r280664 38 38 39 39 class RemoteAudioSessionProxyManager 40 : public WebCore::AudioSession::InterruptionObserver { 40 : private WebCore::AudioSession::InterruptionObserver 41 , private WebCore::AudioSession::ConfigurationChangeObserver { 41 42 WTF_MAKE_FAST_ALLOCATED; 42 43 public: … … 59 60 void endAudioSessionInterruption(WebCore::AudioSession::MayResume) final; 60 61 62 void hardwareMutedStateDidChange(const WebCore::AudioSession&) final; 63 void bufferSizeDidChange(const WebCore::AudioSession&) final; 64 void sampleRateDidChange(const WebCore::AudioSession&) final; 65 void configurationDidChange(const WebCore::AudioSession&); 66 61 67 UniqueRef<WebCore::AudioSession> m_session; 62 68 WeakHashSet<RemoteAudioSessionProxy> m_proxies; -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp
r280576 r280664 123 123 } 124 124 125 void RemoteAudioSession::addConfigurationChangeObserver(ConfigurationChangeObserver& observer) 126 { 127 m_configurationChangeObservers.add(observer); 128 } 129 130 void RemoteAudioSession::removeConfigurationChangeObserver(ConfigurationChangeObserver& observer) 131 { 132 m_configurationChangeObservers.remove(observer); 133 } 134 125 135 AudioSession::CategoryType RemoteAudioSession::category() const 126 136 { … … 132 142 } 133 143 144 void RemoteAudioSession::configurationChanged(RemoteAudioSessionConfiguration&& configuration) 145 { 146 bool mutedStateChanged = !m_configuration || configuration.isMuted != (*m_configuration).isMuted; 147 bool bufferSizeChanged = !m_configuration || configuration.bufferSize != (*m_configuration).bufferSize; 148 bool sampleRateCahnged = !m_configuration || configuration.sampleRate != (*m_configuration).sampleRate; 149 150 m_configuration = WTFMove(configuration); 151 152 m_configurationChangeObservers.forEach([&](auto& observer) { 153 if (mutedStateChanged) 154 observer.hardwareMutedStateDidChange(*this); 155 156 if (bufferSizeChanged) 157 observer.bufferSizeDidChange(*this); 158 159 if (sampleRateCahnged) 160 observer.sampleRateDidChange(*this); 161 }); 162 } 163 134 164 } 135 165 -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h
r278253 r280664 69 69 void setPreferredBufferSize(size_t) final; 70 70 bool tryToSetActiveInternal(bool) final; 71 void addConfigurationChangeObserver(ConfigurationChangeObserver&); 72 void removeConfigurationChangeObserver(ConfigurationChangeObserver&); 71 73 72 74 const RemoteAudioSessionConfiguration& configuration() const; … … 87 89 WebProcess& m_process; 88 90 91 WeakHashSet<ConfigurationChangeObserver> m_configurationChangeObservers; 89 92 CategoryType m_category { CategoryType::None }; 90 93 WebCore::RouteSharingPolicy m_routeSharingPolicy { WebCore::RouteSharingPolicy::Default }; -
trunk/Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.messages.in
r277584 r280664 27 27 28 28 messages -> RemoteAudioSession NotRefCounted { 29 ConfigurationChanged(struct WebKit::RemoteAudioSessionConfiguration configuration) 29 30 BeginInterruption() 30 31 EndInterruption(WebCore::AudioSession::MayResume flags) -
trunk/Tools/ChangeLog
r280663 r280664 1 2021-08-04 Peng Liu <peng.liu6@apple.com> 2 3 [Catalina][GPUP] Some API tests fail after GPU Process features are enabled 4 https://bugs.webkit.org/show_bug.cgi?id=228589 5 6 Reviewed by Jer Noble. 7 8 * TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm: 9 (TestWebKitAPI::TEST): 10 1 11 2021-08-04 Jonathan Bedard <jbedard@apple.com> 2 12 -
trunk/Tools/TestWebKitAPI/Tests/WebKitCocoa/AudioBufferSize.mm
r280439 r280664 57 57 } 58 58 59 TEST(WebKit, DISABLED_AudioBufferSize)59 TEST(WebKit, AudioBufferSize) 60 60 { 61 61 auto configuration = adoptNS([[WKWebViewConfiguration alloc] init]);
Note:
See TracChangeset
for help on using the changeset viewer.