⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 271488 in webkit


Ignore:
Timestamp:
Jan 14, 2021, 9:19:00 AM (6 years ago)
Author:
youenn@apple.com
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:
Location:
trunk
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r271480 r271488  
     12021-01-14  Youenn Fablet  <youenn@apple.com>
     2
     3        MediaSessionManager should update its state as soon as an audio capture track is ended
     4        https://bugs.webkit.org/show_bug.cgi?id=220619
     5
     6        Reviewed by Eric Carlson.
     7
     8        * fast/mediastream/audio-track-enabled-expected.txt:
     9        * fast/mediastream/audio-track-enabled.html:
     10
    1112021-01-14  Martin Robinson  <mrobinson@igalia.com>
    212
  • trunk/LayoutTests/fast/mediastream/audio-track-enabled-expected.txt

    r267644 r271488  
    11
    22
    3 PASS Check audio session state in case of disabled audio tracks
     3PASS Check audio session state in case of disabled and stopped audio tracks
    44
  • trunk/LayoutTests/fast/mediastream/audio-track-enabled.html

    r250853 r271488  
    1414    internals.settings.setShouldManageAudioSessionCategory(true);
    1515
     16    const defaultCategory = internals.audioSessionCategory();
     17
    1618    let stream = await navigator.mediaDevices.getUserMedia({audio : true});
    1719
     
    2527    assert_equals(internals.audioSessionCategory(), "PlayAndRecord");
    2628
    27     stream.removeTrack(stream.getAudioTracks()[0]);
     29    const audioTrack = stream.getAudioTracks()[0];
     30    stream.removeTrack(audioTrack);
    2831    await new Promise(resolve => setTimeout(resolve, 10));
    2932    assert_equals(internals.audioSessionCategory(), "PlayAndRecord");
    30 }, "Check audio session state in case of disabled audio tracks");
     33
     34    audioTrack.stop();
     35    const maxTries = 100;
     36    let counter = 0;
     37    while (++counter < maxTries) {
     38        if (internals.audioSessionCategory() != "PlayAndRecord")
     39            break;
     40        await new Promise(resolve => setTimeout(resolve, 10));
     41    }
     42    assert_less_than(counter, maxTries);
     43    assert_equals(internals.audioSessionCategory(), defaultCategory);
     44}, "Check audio session state in case of disabled and stopped audio tracks");
    3145</script>
    3246</body>
  • trunk/Source/WebCore/ChangeLog

    r271487 r271488  
     12021-01-14  Youenn Fablet  <youenn@apple.com>
     2
     3        MediaSessionManager should update its state as soon as an audio capture track is ended
     4        https://bugs.webkit.org/show_bug.cgi?id=220619
     5
     6        Reviewed by Eric Carlson.
     7
     8        We were updating the audio session category on track destruction.
     9        It should be done as soon as track is ended (either by web page or underlying)
     10        instead of when GC might happen.
     11
     12        Covered by updated test.
     13
     14        * Modules/mediastream/MediaStreamTrack.cpp:
     15        (WebCore::MediaStreamTrack::~MediaStreamTrack):
     16        (WebCore::MediaStreamTrack::trackEnded):
     17        * platform/audio/PlatformMediaSessionManager.h:
     18        (WebCore::PlatformMediaSessionManager::hasAudioCaptureSource const):
     19
    1202021-01-14  Youenn Fablet  <youenn@apple.com>
    221
  • trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.cpp

    r271440 r271488  
    106106    allCaptureTracks().remove(this);
    107107
    108     if (m_private->type() == RealtimeMediaSource::Type::Audio)
    109         PlatformMediaSessionManager::sharedManager().removeAudioCaptureSource(*this);
     108    ASSERT(m_private->type() != RealtimeMediaSource::Type::Audio || !PlatformMediaSessionManager::sharedManager().hasAudioCaptureSource(*this));
    110109}
    111110
     
    539538void MediaStreamTrack::trackEnded(MediaStreamTrackPrivate&)
    540539{
     540    if (m_isCaptureTrack && m_private->type() == RealtimeMediaSource::Type::Audio)
     541        PlatformMediaSessionManager::sharedManager().removeAudioCaptureSource(*this);
     542
    541543    // http://w3c.github.io/mediacapture-main/#life-cycle
    542544    // 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:
  • trunk/Source/WebCore/platform/audio/PlatformMediaSessionManager.h

    r271214 r271488  
    147147    WEBCORE_EXPORT void addAudioCaptureSource(PlatformMediaSession::AudioCaptureSource&);
    148148    WEBCORE_EXPORT void removeAudioCaptureSource(PlatformMediaSession::AudioCaptureSource&);
     149    bool hasAudioCaptureSource(PlatformMediaSession::AudioCaptureSource& source) const { return m_audioCaptureSources.contains(source); }
    149150
    150151    WEBCORE_EXPORT void processDidReceiveRemoteControlCommand(PlatformMediaSession::RemoteControlCommandType, const PlatformMediaSession::RemoteCommandArgument*);
Note: See TracChangeset for help on using the changeset viewer.