Title: [271488] trunk
Revision
271488
Author
you...@apple.com
Date
2021-01-14 09:19:00 -0800 (Thu, 14 Jan 2021)

Log Message

MediaSessionManager should update its state as soon as an audio capture track is ended
https://bugs.webkit.org/show_bug.cgi?id=220619

Reviewed by Eric Carlson.

Source/WebCore:

We were updating the audio session category on track destruction.
It should be done as soon as track is ended (either by web page or underlying)
instead of when GC might happen.

Covered by updated test.

* Modules/mediastream/MediaStreamTrack.cpp:
(WebCore::MediaStreamTrack::~MediaStreamTrack):
(WebCore::MediaStreamTrack::trackEnded):
* platform/audio/PlatformMediaSessionManager.h:
(WebCore::PlatformMediaSessionManager::hasAudioCaptureSource const):

LayoutTests:

* fast/mediastream/audio-track-enabled-expected.txt:
* fast/mediastream/audio-track-enabled.html:

Modified Paths

Diff

Modified: trunk/LayoutTests/ChangeLog (271487 => 271488)


--- trunk/LayoutTests/ChangeLog	2021-01-14 17:17:47 UTC (rev 271487)
+++ trunk/LayoutTests/ChangeLog	2021-01-14 17:19:00 UTC (rev 271488)
@@ -1,3 +1,13 @@
+2021-01-14  Youenn Fablet  <you...@apple.com>
+
+        MediaSessionManager should update its state as soon as an audio capture track is ended
+        https://bugs.webkit.org/show_bug.cgi?id=220619
+
+        Reviewed by Eric Carlson.
+
+        * fast/mediastream/audio-track-enabled-expected.txt:
+        * fast/mediastream/audio-track-enabled.html:
+
 2021-01-14  Martin Robinson  <mrobin...@igalia.com>
 
         [css-scroll-snap] scroll-snap-align parsing is incorrect/backwards

Modified: trunk/LayoutTests/fast/mediastream/audio-track-enabled-expected.txt (271487 => 271488)


--- trunk/LayoutTests/fast/mediastream/audio-track-enabled-expected.txt	2021-01-14 17:17:47 UTC (rev 271487)
+++ trunk/LayoutTests/fast/mediastream/audio-track-enabled-expected.txt	2021-01-14 17:19:00 UTC (rev 271488)
@@ -1,4 +1,4 @@
 
 
-PASS Check audio session state in case of disabled audio tracks
+PASS Check audio session state in case of disabled and stopped audio tracks
 

Modified: trunk/LayoutTests/fast/mediastream/audio-track-enabled.html (271487 => 271488)


--- trunk/LayoutTests/fast/mediastream/audio-track-enabled.html	2021-01-14 17:17:47 UTC (rev 271487)
+++ trunk/LayoutTests/fast/mediastream/audio-track-enabled.html	2021-01-14 17:19:00 UTC (rev 271488)
@@ -13,6 +13,8 @@
 
     internals.settings.setShouldManageAudioSessionCategory(true);
 
+    const defaultCategory = internals.audioSessionCategory();
+
     let stream = await navigator.mediaDevices.getUserMedia({audio : true});
 
     localVideo.srcObject = stream;
@@ -24,9 +26,21 @@
     await new Promise(resolve => setTimeout(resolve, 10));
     assert_equals(internals.audioSessionCategory(), "PlayAndRecord");
 
-    stream.removeTrack(stream.getAudioTracks()[0]);
+    const audioTrack = stream.getAudioTracks()[0];
+    stream.removeTrack(audioTrack);
     await new Promise(resolve => setTimeout(resolve, 10));
     assert_equals(internals.audioSessionCategory(), "PlayAndRecord");
-}, "Check audio session state in case of disabled audio tracks");
+
+    audioTrack.stop();
+    const maxTries = 100;
+    let counter = 0;
+    while (++counter < maxTries) {
+        if (internals.audioSessionCategory() != "PlayAndRecord")
+            break;
+        await new Promise(resolve => setTimeout(resolve, 10));
+    }
+    assert_less_than(counter, maxTries);
+    assert_equals(internals.audioSessionCategory(), defaultCategory);
+}, "Check audio session state in case of disabled and stopped audio tracks");
 </script>
 </body>

Modified: trunk/Source/WebCore/ChangeLog (271487 => 271488)


--- trunk/Source/WebCore/ChangeLog	2021-01-14 17:17:47 UTC (rev 271487)
+++ trunk/Source/WebCore/ChangeLog	2021-01-14 17:19:00 UTC (rev 271488)
@@ -1,5 +1,24 @@
 2021-01-14  Youenn Fablet  <you...@apple.com>
 
+        MediaSessionManager should update its state as soon as an audio capture track is ended
+        https://bugs.webkit.org/show_bug.cgi?id=220619
+
+        Reviewed by Eric Carlson.
+
+        We were updating the audio session category on track destruction.
+        It should be done as soon as track is ended (either by web page or underlying)
+        instead of when GC might happen.
+
+        Covered by updated test.
+
+        * Modules/mediastream/MediaStreamTrack.cpp:
+        (WebCore::MediaStreamTrack::~MediaStreamTrack):
+        (WebCore::MediaStreamTrack::trackEnded):
+        * platform/audio/PlatformMediaSessionManager.h:
+        (WebCore::PlatformMediaSessionManager::hasAudioCaptureSource const):
+
+2021-01-14  Youenn Fablet  <you...@apple.com>
+
         Use AVAudioSessionModeDefault in AVAudioSessionCaptureDeviceManager::createAudioSession
         https://bugs.webkit.org/show_bug.cgi?id=220618
         <rdar://problem/73185920>

Modified: trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp (271487 => 271488)


--- trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2021-01-14 17:17:47 UTC (rev 271487)
+++ trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp	2021-01-14 17:19:00 UTC (rev 271488)
@@ -105,8 +105,7 @@
 
     allCaptureTracks().remove(this);
 
-    if (m_private->type() == RealtimeMediaSource::Type::Audio)
-        PlatformMediaSessionManager::sharedManager().removeAudioCaptureSource(*this);
+    ASSERT(m_private->type() != RealtimeMediaSource::Type::Audio || !PlatformMediaSessionManager::sharedManager().hasAudioCaptureSource(*this));
 }
 
 const AtomString& MediaStreamTrack::kind() const
@@ -538,6 +537,9 @@
 
 void MediaStreamTrack::trackEnded(MediaStreamTrackPrivate&)
 {
+    if (m_isCaptureTrack && m_private->type() == RealtimeMediaSource::Type::Audio)
+        PlatformMediaSessionManager::sharedManager().removeAudioCaptureSource(*this);
+
     // http://w3c.github.io/mediacapture-main/#life-cycle
     // When a MediaStreamTrack track ends for any reason other than the stop() method being invoked, the User Agent must queue a task that runs the following steps:
     // 1. If the track's readyState attribute has the value ended already, then abort these steps.

Modified: trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h (271487 => 271488)


--- trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h	2021-01-14 17:17:47 UTC (rev 271487)
+++ trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h	2021-01-14 17:19:00 UTC (rev 271488)
@@ -146,6 +146,7 @@
 
     WEBCORE_EXPORT void addAudioCaptureSource(PlatformMediaSession::AudioCaptureSource&);
     WEBCORE_EXPORT void removeAudioCaptureSource(PlatformMediaSession::AudioCaptureSource&);
+    bool hasAudioCaptureSource(PlatformMediaSession::AudioCaptureSource& source) const { return m_audioCaptureSources.contains(source); }
 
     WEBCORE_EXPORT void processDidReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*);
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to