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

Reply via email to