Changeset 260380 in webkit


Ignore:
Timestamp:
Apr 20, 2020 11:16:57 AM (4 years ago)
Author:
youenn@apple.com
Message:

MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
https://bugs.webkit.org/show_bug.cgi?id=210740

Reviewed by Eric Carlson.

Source/WebCore:

Before the patch, MediaPlayerPrivateMediaStreamAVFObjC was not calling play on the audio renderer when the audio renderer
was added after the MediaPlayerPrivateMediaStreamAVFObjC was asked to play.
This patch makes it so that, on configuration of an audio track, it will be asked to play if its MediaPlayerPrivateMediaStreamAVFObjC is playing.
Add internals API to be able to write a test.

Test: fast/mediastream/play-newly-added-audio-track.html

  • html/track/AudioTrack.h:
  • html/track/AudioTrack.idl:
  • platform/graphics/AudioTrackPrivate.h:

(WebCore::AudioTrackPrivate::isBackedByMediaStreamTrack const):

  • platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:

(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):

  • platform/mediastream/AudioTrackPrivateMediaStream.cpp:

(WebCore::AudioTrackPrivateMediaStream::play):

  • platform/mediastream/AudioTrackPrivateMediaStream.h:

(isType):

  • testing/Internals.cpp:

(WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
(WebCore::Internals::shouldAudioTrackPlay):

  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

  • fast/mediastream/play-newly-added-audio-track-expected.txt: Added.
  • fast/mediastream/play-newly-added-audio-track.html: Added.
Location:
trunk
Files:
2 added
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r260378 r260380  
     12020-04-20  Youenn Fablet  <youenn@apple.com>
     2
     3        MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
     4        https://bugs.webkit.org/show_bug.cgi?id=210740
     5
     6        Reviewed by Eric Carlson.
     7
     8        * fast/mediastream/play-newly-added-audio-track-expected.txt: Added.
     9        * fast/mediastream/play-newly-added-audio-track.html: Added.
     10
    1112020-04-20  Zalan Bujtas  <zalan@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r260379 r260380  
     12020-04-20  Youenn Fablet  <youenn@apple.com>
     2
     3        MediaPlayerPrivateMediaStreamAVFObjC should start play a newly added audio track if it is playing
     4        https://bugs.webkit.org/show_bug.cgi?id=210740
     5
     6        Reviewed by Eric Carlson.
     7
     8        Before the patch, MediaPlayerPrivateMediaStreamAVFObjC was not calling play on the audio renderer when the audio renderer
     9        was added after the MediaPlayerPrivateMediaStreamAVFObjC was asked to play.
     10        This patch makes it so that, on configuration of an audio track, it will be asked to play if its MediaPlayerPrivateMediaStreamAVFObjC is playing.
     11        Add internals API to be able to write a test.
     12
     13        Test: fast/mediastream/play-newly-added-audio-track.html
     14
     15        * html/track/AudioTrack.h:
     16        * html/track/AudioTrack.idl:
     17        * platform/graphics/AudioTrackPrivate.h:
     18        (WebCore::AudioTrackPrivate::isBackedByMediaStreamTrack const):
     19        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
     20        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::updateTracks):
     21        * platform/mediastream/AudioTrackPrivateMediaStream.cpp:
     22        (WebCore::AudioTrackPrivateMediaStream::play):
     23        * platform/mediastream/AudioTrackPrivateMediaStream.h:
     24        (isType):
     25        * testing/Internals.cpp:
     26        (WebCore::Internals::isMockRealtimeMediaSourceCenterEnabled):
     27        (WebCore::Internals::shouldAudioTrackPlay):
     28        * testing/Internals.h:
     29        * testing/Internals.idl:
     30
    1312020-04-20  Youenn Fablet  <youenn@apple.com>
    232
  • trunk/Source/WebCore/html/track/AudioTrack.h

    r256353 r260380  
    6565    size_t inbandTrackIndex() const;
    6666
     67    const AudioTrackPrivate& privateTrack() const { return m_private; }
    6768    void setPrivate(AudioTrackPrivate&);
     69
    6870    void setMediaElement(WeakPtr<HTMLMediaElement>) override;
    6971#if !RELEASE_LOG_DISABLED
  • trunk/Source/WebCore/html/track/AudioTrack.idl

    r219007 r260380  
    2626[
    2727    Conditional=VIDEO_TRACK,
     28    ExportMacro=WEBCORE_EXPORT,
    2829    GenerateIsReachable=ImplElementRoot,
    2930    JSCustomMarkFunction
  • trunk/Source/WebCore/platform/graphics/AudioTrackPrivate.h

    r254454 r260380  
    6363    virtual Kind kind() const { return None; }
    6464
     65    virtual bool isBackedByMediaStreamTrack() const { return false; }
     66
    6567#if !RELEASE_LOG_DISABLED
    6668    const char* logClassName() const override { return "AudioTrackPrivate"; }
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm

    r259861 r260380  
    896896        case TrackState::Configure:
    897897            track.setTrackIndex(index);
    898             bool enabled = track.streamTrack().enabled() && !track.streamTrack().muted();
    899             track.setEnabled(enabled);
     898            track.setVolume(m_volume);
     899            track.setMuted(m_muted);
     900            track.setEnabled(track.streamTrack().enabled() && !track.streamTrack().muted());
     901            if (playing())
     902                track.play();
    900903            break;
    901904        }
  • trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp

    r259861 r260380  
    7373void AudioTrackPrivateMediaStream::play()
    7474{
     75    if (m_shouldPlay)
     76        return;
     77
    7578    m_shouldPlay = true;
    7679    updateRenderer();
  • trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h

    r259861 r260380  
    5555    void play();
    5656    void pause();
    57     bool isPlaying() { return m_isPlaying; }
     57    bool isPlaying() const { return m_isPlaying; }
     58    bool shouldPlay() const { return m_shouldPlay; }
    5859
    5960    void setVolume(float);
     
    7677    AtomString label() const final { return m_label; }
    7778    int trackIndex() const final { return m_index; }
     79    bool isBackedByMediaStreamTrack() const final { return true; }
    7880
    7981    // MediaStreamTrackPrivate::Observer
     
    108110}
    109111
     112SPECIALIZE_TYPE_TRAITS_BEGIN(WebCore::AudioTrackPrivateMediaStream)
     113    static bool isType(const WebCore::AudioTrackPrivate& track) { return track.isBackedByMediaStreamTrack(); }
     114SPECIALIZE_TYPE_TRAITS_END()
     115
    110116#endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)
  • trunk/Source/WebCore/testing/Internals.cpp

    r260379 r260380  
    3333#include "ApplicationCacheStorage.h"
    3434#include "AudioSession.h"
     35#include "AudioTrackPrivateMediaStream.h"
    3536#include "Autofill.h"
    3637#include "BackForwardCache.h"
     
    50775078    return MockRealtimeMediaSourceCenter::mockRealtimeMediaSourceCenterEnabled();
    50785079}
     5080
     5081bool Internals::shouldAudioTrackPlay(const AudioTrack& track)
     5082{
     5083    if (!is<AudioTrackPrivateMediaStream>(track.privateTrack()))
     5084        return false;
     5085    return downcast<AudioTrackPrivateMediaStream>(track.privateTrack()).shouldPlay();
     5086}
    50795087#endif
    50805088
  • trunk/Source/WebCore/testing/Internals.h

    r260247 r260380  
    5353class AnimationTimeline;
    5454class AudioContext;
     55class AudioTrack;
    5556class CacheStorageConnection;
    5657class DOMRect;
     
    765766    void setMediaStreamSourceInterrupted(MediaStreamTrack&, bool);
    766767    bool isMockRealtimeMediaSourceCenterEnabled();
     768    bool shouldAudioTrackPlay(const AudioTrack&);
    767769#endif
    768770
  • trunk/Source/WebCore/testing/Internals.idl

    r260247 r260380  
    778778    [Conditional=MEDIA_STREAM] void setMediaStreamSourceInterrupted(MediaStreamTrack track, boolean interrupted);
    779779    [Conditional=MEDIA_STREAM] boolean isMockRealtimeMediaSourceCenterEnabled();
     780    [Conditional=MEDIA_STREAM] boolean shouldAudioTrackPlay(AudioTrack track);
    780781
    781782    unsigned long long documentIdentifier(Document document);
Note: See TracChangeset for help on using the changeset viewer.