[webkit-changes] [WebKit/WebKit] e0ce48: Safari is not using the intended AudioSession
Dean Jackson
noreply at github.com
Thu Apr 20 15:03:10 PDT 2023
Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: e0ce48fe5c2e1b20a22f817e081face321c7c541
https://github.com/WebKit/WebKit/commit/e0ce48fe5c2e1b20a22f817e081face321c7c541
Author: Dean Jackson <dino at apple.com>
Date: 2023-04-20 (Thu, 20 Apr 2023)
Changed paths:
M LayoutTests/media/audio-session-category-at-most-recent-playback-expected.txt
M LayoutTests/media/audio-session-category-at-most-recent-playback.html
M LayoutTests/media/audio-session-category-expected.txt
M LayoutTests/media/audio-session-category.html
A LayoutTests/media/video-audio-session-mode-expected.txt
A LayoutTests/media/video-audio-session-mode.html
M Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h
M Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm
M Source/WebCore/html/HTMLMediaElement.cpp
M Source/WebCore/html/HTMLMediaElement.h
M Source/WebCore/platform/audio/AudioSession.cpp
M Source/WebCore/platform/audio/AudioSession.h
M Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.mm
M Source/WebCore/platform/audio/ios/AudioSessionIOS.h
M Source/WebCore/platform/audio/ios/AudioSessionIOS.mm
M Source/WebCore/platform/audio/mac/AudioSessionMac.h
M Source/WebCore/platform/audio/mac/AudioSessionMac.mm
M Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp
M Source/WebCore/testing/Internals.cpp
M Source/WebCore/testing/Internals.h
M Source/WebCore/testing/Internals.idl
M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp
M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h
M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.messages.in
M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp
M Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
M Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp
M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h
M Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.cpp
Log Message:
-----------
Safari is not using the intended AudioSession
https://bugs.webkit.org/show_bug.cgi?id=255681
rdar://107095456
Reviewed by Jer Noble.
WebKit never sets the AudioSession mode to anything other than "default", which
is not appropriate for video playback, especially in a spatial audio environment.
Fix this by exposing a way for the Media system to select an AudioSession mode,
and set it to MoviePlayback when needed.
* LayoutTests/media/audio-session-category-at-most-recent-playback-expected.txt:
* LayoutTests/media/audio-session-category-at-most-recent-playback.html:
* LayoutTests/media/audio-session-category-expected.txt:
* LayoutTests/media/audio-session-category.html:
* Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.h: Expose the new mode constant.
* Source/WebCore/PAL/pal/cocoa/AVFoundationSoftLink.mm:
* Source/WebCore/html/HTMLMediaElement.cpp: Save the mode so that tests can query it.
(WebCore::HTMLMediaElement::playPlayer):
* Source/WebCore/html/HTMLMediaElement.h:
(WebCore::HTMLMediaElement::modeAtMostRecentPlayback const):
* Source/WebCore/platform/audio/AudioSession.h: Add a new type AudioSession::Mode that can be
set alongside the Category value.
(WTF::LogArgument<WebCore::AudioSession::Mode>::toString):
* Source/WebCore/platform/audio/AudioSession.cpp:
(WebCore::AudioSession::setCategory):
(WebCore::AudioSession::setCategoryOverride):
(WebCore::AudioSession::mode const):
(WebCore::convertEnumerationToString):
* Source/WebCore/platform/audio/cocoa/MediaSessionManagerCocoa.mm:
(WebCore::MediaSessionManagerCocoa::updateSessionState): Set the mode to VideoPlayback here
if `hasAudibleAudioOrVideoMediaType` is true.
* Source/WebCore/platform/audio/ios/AudioSessionIOS.h:
* Source/WebCore/platform/audio/ios/AudioSessionIOS.mm:
(WebCore::AudioSessionIOS::setCategory): Actually send the mode down to the AVAudioSession.
(WebCore::AudioSessionIOS::mode const):
* Source/WebCore/platform/audio/mac/AudioSessionMac.h:
* Source/WebCore/platform/audio/mac/AudioSessionMac.mm:
(WebCore::AudioSessionMac::setCategory): Accept the parameter, but we don't set anything on Mac.
* Source/WebCore/platform/mock/MockRealtimeAudioSource.cpp:
(WebCore::MockRealtimeAudioSource::startProducingData): Update call to setCategory.
* Source/WebCore/testing/Internals.cpp: Expose a way to test the mode.
(WebCore::Internals::audioSessionMode const):
(WebCore::Internals::modeAtMostRecentPlayback const):
* Source/WebCore/testing/Internals.h:
* Source/WebCore/testing/Internals.idl:
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::setCategory):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.h:
(WebKit::RemoteAudioSessionProxy::mode const):
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.messages.in:
* Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in:
* Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::setCategory):
(WebKit::RemoteAudioSession::mode const):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h:
* Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.cpp:
Update the call to setCategory to accept Mode.
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxyManager.cpp:
(WebKit::RemoteAudioSessionProxyManager::updateCategory):
Iterate through the proxies to test if mode has been set.
Canonical link: https://commits.webkit.org/263201@main
More information about the webkit-changes
mailing list