Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 2f88bc0b118178fdb588f9143366246f09e21eb8
https://github.com/WebKit/WebKit/commit/2f88bc0b118178fdb588f9143366246f09e21eb8
Author: Youenn Fablet <[email protected]>
Date: 2026-06-26 (Fri, 26 Jun 2026)
Changed paths:
A
LayoutTests/fast/mediastream/audio-session-stays-active-when-removing-session-during-speech-recognition-expected.txt
A
LayoutTests/fast/mediastream/audio-session-stays-active-when-removing-session-during-speech-recognition.html
M LayoutTests/http/tests/webrtc/audioSessionInFrames.html
M LayoutTests/platform/glib/TestExpectations
M LayoutTests/platform/ios/TestExpectations
M Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp
M Source/WebCore/Modules/speech/SpeechRecognition.cpp
M Source/WebCore/Modules/speech/SpeechRecognition.h
M Source/WebCore/Modules/speech/SpeechRecognitionConnection.h
M Source/WebCore/Modules/speech/SpeechRecognitionConnectionClient.h
M Source/WebCore/platform/audio/AudioSession.cpp
M Source/WebCore/platform/audio/AudioSession.h
M Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp
M Source/WebCore/platform/audio/MediaSessionManagerInterface.h
M Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp
M Source/WebKit/GPUProcess/webrtc/UserMediaCaptureManagerProxy.cpp
M Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp
M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.cpp
M Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.h
M
Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.cpp
M Source/WebKit/UIProcess/SpeechRecognitionServer.cpp
M Source/WebKit/UIProcess/SpeechRecognitionServer.h
M Source/WebKit/UIProcess/WebPageProxy.cpp
M Source/WebKit/UIProcess/WebPageProxy.h
M Source/WebKit/UIProcess/WebProcessProxy.cpp
M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp
M Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h
M Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.h
M
Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.serialization.in
M Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.cpp
M
Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.cpp
M
Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.h
M
Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.messages.in
M Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp
M Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h
Log Message:
-----------
Speech recognition microphone source should make sure to keep its audio
session active while capturing
rdar://174786023
https://bugs.webkit.org/show_bug.cgi?id=317741
Reviewed by Eric Carlson.
Microphone capture requires the AudioSession unit to stay active.
While for getUserMedia, the WebProcess is ensuring that the AudioSession is
active, this is not the case for speech recognition.
This can cause issues in case other WebProcess deactivate the AudioSession.
To prevent this, we make sure that SpeechRecognitionRealtimeMediaSourceManager
sources are tied to the MediaSessionManager, by making each source an
AudioCaptureSource.
It ensures that the audio session is properly set up whenever capture for
speech recgonition starts.
We also make sure to deactivate the AudioSession as needed when capture stops.
We have to fix a race condition in how RemoteAudioSession is returning whether
active or not.
When AudioSession is enabled/disabled very quickly, there might be
configuration changed messages being received in between.
They might change the active state creating flakiness in tests.
To prevent this, we only set RemoteAudioSession::m_active in
tryToSetActiveInternal and no longer synchronize it when configuration changes.
We add a protected setActive in AudioSession, so that RemoteAudioSession can
set it back to false when GPU process crashes.
We no longer need AudioSession::isActive to be virtual as a small bonus.
This test can be flaky in case of rerunning it since navigating away stops the
recognition right away but was stopping the capture asynchronously in WebProcess
since it needs to go through UIProcess.
We add a way for the source created in the WebProcess to register itself to the
SpeechRecognition object.
This allows to synchronously stop capture when the SpeechRecognition gets
stopped.
Test:
fast/mediastream/audio-session-stays-active-when-removing-session-during-speech-recognition.html
*
LayoutTests/fast/mediastream/audio-session-stays-active-when-removing-session-during-speech-recognition-expected.txt:
Added.
*
LayoutTests/fast/mediastream/audio-session-stays-active-when-removing-session-during-speech-recognition.html:
Added.
* LayoutTests/http/tests/webrtc/audioSessionInFrames.html:
* LayoutTests/platform/glib/TestExpectations:
* Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::MediaStreamTrack::stopTrack):
(WebCore::MediaStreamTrack::trackMutedChanged):
* Source/WebCore/Modules/speech/SpeechRecognition.cpp:
(WebCore::SpeechRecognition::stop):
(WebCore::SpeechRecognition::captureSourceCreated):
* Source/WebCore/Modules/speech/SpeechRecognition.h:
* Source/WebCore/Modules/speech/SpeechRecognitionConnection.h:
(WebCore::SpeechRecognitionConnection::dispatchCaptureSourceCreated):
* Source/WebCore/Modules/speech/SpeechRecognitionConnectionClient.h:
(WebCore::SpeechRecognitionConnectionClient::captureSourceCreated):
* Source/WebCore/platform/audio/AudioSession.cpp:
(WebCore::AudioSession::tryToSetActive):
(WebCore::AudioSession::setActive):
* Source/WebCore/platform/audio/AudioSession.h:
* Source/WebCore/platform/audio/MediaSessionManagerInterface.cpp:
(WebCore::MediaSessionManagerInterface::audioCaptureSourceStateChanged):
* Source/WebCore/platform/audio/MediaSessionManagerInterface.h:
* Source/WebKit/GPUProcess/media/RemoteAudioSessionProxy.cpp:
(WebKit::RemoteAudioSessionProxy::configuration):
* Source/WebKit/GPUProcess/webrtc/UserMediaCaptureManagerProxy.cpp:
* Source/WebKit/UIProcess/Media/RemoteMediaSessionManagerProxy.cpp:
(WebKit::RemoteMediaSessionManagerProxy::tryToSetActiveInternal):
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.cpp:
(WebKit::SpeechRecognitionRemoteRealtimeMediaSource::create):
(WebKit::SpeechRecognitionRemoteRealtimeMediaSource::SpeechRecognitionRemoteRealtimeMediaSource):
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSource.h:
(WebKit::SpeechRecognitionRemoteRealtimeMediaSource::clientIdentifier const):
* Source/WebKit/UIProcess/SpeechRecognitionRemoteRealtimeMediaSourceManager.cpp:
(WebKit::SpeechRecognitionRemoteRealtimeMediaSourceManager::addSource):
* Source/WebKit/UIProcess/SpeechRecognitionServer.cpp:
(WebKit::SpeechRecognitionServer::handleRequest):
* Source/WebKit/UIProcess/SpeechRecognitionServer.h:
* Source/WebKit/UIProcess/WebPageProxy.cpp:
(WebKit::WebPageProxy::createRealtimeMediaSourceForSpeechRecognition):
* Source/WebKit/UIProcess/WebPageProxy.h:
* Source/WebKit/UIProcess/WebProcessProxy.cpp:
(WebKit::WebProcessProxy::createSpeechRecognitionServer):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.cpp:
(WebKit::RemoteAudioSession::gpuProcessConnectionDidClose):
(WebKit::RemoteAudioSession::tryToSetActiveInternal):
(WebKit::RemoteAudioSession::configurationChanged):
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSession.h:
* Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.h:
*
Source/WebKit/WebProcess/GPU/media/RemoteAudioSessionConfiguration.serialization.in:
* Source/WebKit/WebProcess/Media/RemoteMediaSessionManager.cpp:
(WebKit::RemoteMediaSessionManager::RemoteMediaSessionManager):
*
Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.cpp:
(WebKit::SpeechRecognitionRealtimeMediaSourceManager::createSource):
(WebKit::SpeechRecognitionRealtimeMediaSourceManager::start):
(WebKit::SpeechRecognitionRealtimeMediaSourceManager::stop):
* Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.h:
*
Source/WebKit/WebProcess/Speech/SpeechRecognitionRealtimeMediaSourceManager.messages.in:
* Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.cpp:
(WebKit::WebSpeechRecognitionConnection::dispatchCaptureSourceCreated):
* Source/WebKit/WebProcess/WebCoreSupport/WebSpeechRecognitionConnection.h:
Canonical link: https://commits.webkit.org/315887@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications