Title: [259824] trunk/Source
Revision
259824
Author
jacob_uph...@apple.com
Date
2020-04-09 13:49:04 -0700 (Thu, 09 Apr 2020)

Log Message

Unreviewed, reverting r259816.

This commit broke the webkit build for macOS and iOS

Reverted changeset:

"Introduce a RealtimeMediaSource observer dedicated to
receiving audio samples"
https://bugs.webkit.org/show_bug.cgi?id=210180
https://trac.webkit.org/changeset/259816

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (259823 => 259824)


--- trunk/Source/WebCore/ChangeLog	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/ChangeLog	2020-04-09 20:49:04 UTC (rev 259824)
@@ -1,3 +1,16 @@
+2020-04-09  Jacob Uphoff  <jacob_uph...@apple.com>
+
+        Unreviewed, reverting r259816.
+
+        This commit broke the webkit build for macOS and iOS
+
+        Reverted changeset:
+
+        "Introduce a RealtimeMediaSource observer dedicated to
+        receiving audio samples"
+        https://bugs.webkit.org/show_bug.cgi?id=210180
+        https://trac.webkit.org/changeset/259816
+
 2020-04-09  Daniel Bates  <daba...@apple.com>
 
         [ macOS debug wk2 ] REGRESSION(r259762): ASSERTION FAILED: !needsLayout() on fast/events/scroll-subframe-in-rendering-update.html

Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp (259823 => 259824)


--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -44,7 +44,7 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(MediaRecorder);
 
-MediaRecorder::CreatorFunction MediaRecorder::m_customCreator = nullptr;
+creatorFunction MediaRecorder::m_customCreator = nullptr;
 
 ExceptionOr<Ref<MediaRecorder>> MediaRecorder::create(Document& document, Ref<MediaStream>&& stream, Options&& options)
 {
@@ -59,15 +59,15 @@
     return recorder;
 }
 
-void MediaRecorder::setCustomPrivateRecorderCreator(CreatorFunction creator)
+void MediaRecorder::setCustomPrivateRecorderCreator(creatorFunction creator)
 {
     m_customCreator = creator;
 }
 
-std::unique_ptr<MediaRecorderPrivate> MediaRecorder::createMediaRecorderPrivate(Document& document, MediaStreamPrivate& stream)
+std::unique_ptr<MediaRecorderPrivate> MediaRecorder::createMediaRecorderPrivate(Document& document, const MediaStreamPrivate& stream)
 {
     if (m_customCreator)
-        return m_customCreator(stream);
+        return m_customCreator();
 
 #if PLATFORM(COCOA)
     auto* page = document.page();
@@ -227,6 +227,11 @@
     m_private->sampleBufferUpdated(track, mediaSample);
 }
 
+void MediaRecorder::audioSamplesAvailable(MediaStreamTrackPrivate& track, const MediaTime& mediaTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
+{
+    m_private->audioSamplesAvailable(track, mediaTime, audioData, description, sampleCount);
+}
+
 bool MediaRecorder::virtualHasPendingActivity() const
 {
     return m_state != RecordingState::Inactive;

Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h (259823 => 259824)


--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -38,6 +38,8 @@
 class Document;
 class MediaRecorderPrivate;
 
+typedef std::unique_ptr<MediaRecorderPrivate>(*creatorFunction)();
+
 class MediaRecorder final
     : public ActiveDOMObject
     , public RefCounted<MediaRecorder>
@@ -60,9 +62,7 @@
     
     static ExceptionOr<Ref<MediaRecorder>> create(Document&, Ref<MediaStream>&&, Options&& = { });
     
-    using CreatorFunction = std::unique_ptr<MediaRecorderPrivate>(*)(MediaStreamPrivate&);
-
-    WEBCORE_EXPORT static void setCustomPrivateRecorderCreator(CreatorFunction);
+    WEBCORE_EXPORT static void setCustomPrivateRecorderCreator(creatorFunction);
     
     RecordingState state() const { return m_state; }
     
@@ -78,7 +78,7 @@
 private:
     MediaRecorder(Document&, Ref<MediaStream>&&, std::unique_ptr<MediaRecorderPrivate>&&, Options&& = { });
 
-    static std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(Document&, MediaStreamPrivate&);
+    static std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(Document&, const MediaStreamPrivate&);
     
     Document* document() const;
 
@@ -107,9 +107,10 @@
     void trackSettingsChanged(MediaStreamTrackPrivate&) final { };
     void trackEnabledChanged(MediaStreamTrackPrivate&) final { };
     void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) final;
-
-    static CreatorFunction m_customCreator;
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     
+    static creatorFunction m_customCreator;
+    
     Options m_options;
     Ref<MediaStream> m_stream;
     std::unique_ptr<MediaRecorderPrivate> m_private;

Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp (259823 => 259824)


--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -32,7 +32,7 @@
 
 namespace WebCore {
 
-std::unique_ptr<MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate(MediaStreamPrivate& stream)
+std::unique_ptr<MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate(const MediaStreamPrivate& stream)
 {
     return MediaRecorderPrivateAVFImpl::create(stream);
 }

Modified: trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h (259823 => 259824)


--- trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -37,7 +37,7 @@
     virtual ~MediaRecorderProvider() = default;
 
 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
-    virtual std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(MediaStreamPrivate&);
+    virtual std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(const MediaStreamPrivate&);
 #endif
 
     void setUseGPUProcess(bool value) { m_useGPUProcess = value; }

Modified: trunk/Source/WebCore/loader/EmptyClients.cpp (259823 => 259824)


--- trunk/Source/WebCore/loader/EmptyClients.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/loader/EmptyClients.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -582,7 +582,7 @@
     EmptyMediaRecorderProvider() = default;
 private:
 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
-    std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(MediaStreamPrivate&) final { return nullptr; }
+    std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(const MediaStreamPrivate&) final { return nullptr; }
 #endif
 };
 

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (259823 => 259824)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-04-09 20:49:04 UTC (rev 259824)
@@ -560,7 +560,7 @@
     ALWAYS_LOG(LOGIDENTIFIER, volume);
     m_volume = volume;
     for (const auto& track : m_audioTrackMap.values())
-        track->setVolume(m_volume);
+        track->setVolume(m_muted ? 0 : m_volume);
 }
 
 void MediaPlayerPrivateMediaStreamAVFObjC::setMuted(bool muted)
@@ -571,7 +571,7 @@
     ALWAYS_LOG(LOGIDENTIFIER, muted);
     m_muted = muted;
     for (const auto& track : m_audioTrackMap.values())
-        track->setMuted(m_muted);
+        track->setVolume(m_muted ? 0 : m_volume);
 }
 
 bool MediaPlayerPrivateMediaStreamAVFObjC::hasVideo() const

Modified: trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -32,7 +32,7 @@
 
 namespace WebCore {
 
-MediaRecorderPrivate::AudioVideoSelectedTracks MediaRecorderPrivate::selectTracks(MediaStreamPrivate& stream)
+MediaRecorderPrivate::AudioVideoSelectedTracks MediaRecorderPrivate::selectTracks(const MediaStreamPrivate& stream)
 {
     AudioVideoSelectedTracks selectedTracks;
     stream.forEachTrack([&](auto& track) {

Modified: trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -27,7 +27,6 @@
 #include <wtf/CompletionHandler.h>
 #include <wtf/Forward.h>
 #include "Exception.h"
-#include "RealtimeMediaSource.h"
 
 #if ENABLE(MEDIA_STREAM)
 
@@ -44,53 +43,29 @@
 class PlatformAudioData;
 class SharedBuffer;
 
-class MediaRecorderPrivate :
-    public RealtimeMediaSource::AudioSampleObserver {
+class MediaRecorderPrivate {
 public:
-    ~MediaRecorderPrivate();
+    virtual ~MediaRecorderPrivate() = default;
 
     struct AudioVideoSelectedTracks {
-        MediaStreamTrackPrivate* audioTrack { nullptr };
-        MediaStreamTrackPrivate* videoTrack { nullptr };
+        const MediaStreamTrackPrivate* audioTrack { nullptr };
+        const MediaStreamTrackPrivate* videoTrack { nullptr };
     };
-    WEBCORE_EXPORT static AudioVideoSelectedTracks selectTracks(MediaStreamPrivate&);
+    WEBCORE_EXPORT static AudioVideoSelectedTracks selectTracks(const MediaStreamPrivate&);
 
     virtual void sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) = 0;
+    virtual void audioSamplesAvailable(const MediaStreamTrackPrivate&, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) = 0;
 
-    using FetchDataCallback = CompletionHandler<void(RefPtr<SharedBuffer>&&, const String& mimeType)>;
-    virtual void fetchData(FetchDataCallback&&) = 0;
-    virtual void stopRecording() = 0;
+    virtual void fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String& mimeType)>&&) = 0;
+    virtual void stopRecording() { };
 
     using ErrorCallback = Function<void(Optional<Exception>&&)>;
     void setErrorCallback(ErrorCallback&& errorCallback) { m_errorCallback = WTFMove(errorCallback); }
 
 protected:
-    void setAudioSource(RefPtr<RealtimeMediaSource>&&);
-
-protected:
     ErrorCallback m_errorCallback;
-
-private:
-    RefPtr<RealtimeMediaSource> m_audioSource;
 };
 
-inline void MediaRecorderPrivate::setAudioSource(RefPtr<RealtimeMediaSource>&& audioSource)
-{
-    if (m_audioSource)
-        m_audioSource->removeAudioSampleObserver(*this);
-
-    m_audioSource = WTFMove(audioSource);
-
-    if (m_audioSource)
-        m_audioSource->addAudioSampleObserver(*this);
-}
-
-inline MediaRecorderPrivate::~MediaRecorderPrivate()
-{
-    if (m_audioSource)
-        m_audioSource->removeAudioSampleObserver(*this);
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -36,7 +36,7 @@
 
 namespace WebCore {
 
-std::unique_ptr<MediaRecorderPrivateAVFImpl> MediaRecorderPrivateAVFImpl::create(MediaStreamPrivate& stream)
+std::unique_ptr<MediaRecorderPrivateAVFImpl> MediaRecorderPrivateAVFImpl::create(const MediaStreamPrivate& stream)
 {
     // FIXME: we will need to implement support for multiple audio/video tracks
     // Currently we only choose the first track as the recorded track.
@@ -51,15 +51,11 @@
     String audioTrackId;
     if (selectedTracks.audioTrack)
         audioTrackId = selectedTracks.audioTrack->id();
-
     String videoTrackId;
     if (selectedTracks.videoTrack)
         videoTrackId = selectedTracks.videoTrack->id();
 
-    auto recorder = makeUnique<MediaRecorderPrivateAVFImpl>(writer.releaseNonNull(), WTFMove(audioTrackId), WTFMove(videoTrackId));
-    if (selectedTracks.audioTrack)
-        recorder->setAudioSource(&selectedTracks.audioTrack->source());
-    return recorder;
+    return makeUnique<MediaRecorderPrivateAVFImpl>(writer.releaseNonNull(), WTFMove(audioTrackId), WTFMove(videoTrackId));
 }
 
 MediaRecorderPrivateAVFImpl::MediaRecorderPrivateAVFImpl(Ref<MediaRecorderPrivateWriter>&& writer, String&& audioTrackId, String&& videoTrackId)
@@ -69,11 +65,6 @@
 {
 }
 
-MediaRecorderPrivateAVFImpl::~MediaRecorderPrivateAVFImpl()
-{
-    setAudioSource(nullptr);
-}
-
 void MediaRecorderPrivateAVFImpl::sampleBufferUpdated(const MediaStreamTrackPrivate& track, MediaSample& sampleBuffer)
 {
     if (track.id() != m_recordedVideoTrackID)
@@ -81,8 +72,10 @@
     m_writer->appendVideoSampleBuffer(sampleBuffer.platformSample().sample.cmSampleBuffer);
 }
 
-void MediaRecorderPrivateAVFImpl::audioSamplesAvailable(const WTF::MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount)
+void MediaRecorderPrivateAVFImpl::audioSamplesAvailable(const MediaStreamTrackPrivate& track, const WTF::MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount)
 {
+    if (track.id() != m_recordedAudioTrackID)
+        return;
     ASSERT(is<WebAudioBufferList>(data));
     ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
     m_writer->appendAudioSampleBuffer(data, description, mediaTime, sampleCount);
@@ -90,11 +83,10 @@
 
 void MediaRecorderPrivateAVFImpl::stopRecording()
 {
-    setAudioSource(nullptr);
     m_writer->stopRecording();
 }
 
-void MediaRecorderPrivateAVFImpl::fetchData(FetchDataCallback&& completionHandler)
+void MediaRecorderPrivateAVFImpl::fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&& completionHandler)
 {
     m_writer->fetchData([completionHandler = WTFMove(completionHandler), mimeType = mimeType()](auto&& buffer) mutable {
         completionHandler(WTFMove(buffer), mimeType);

Modified: trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -33,12 +33,10 @@
 
 class MediaStreamPrivate;
 
-class MediaRecorderPrivateAVFImpl final
-    : public MediaRecorderPrivate {
+class MediaRecorderPrivateAVFImpl final : public MediaRecorderPrivate {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    static std::unique_ptr<MediaRecorderPrivateAVFImpl> create(MediaStreamPrivate&);
-    ~MediaRecorderPrivateAVFImpl();
+    static std::unique_ptr<MediaRecorderPrivateAVFImpl> create(const MediaStreamPrivate&);
 
 private:
     MediaRecorderPrivateAVFImpl(Ref<MediaRecorderPrivateWriter>&&, String&& audioTrackId, String&& videoTrackId);
@@ -45,14 +43,12 @@
 
     friend std::unique_ptr<MediaRecorderPrivateAVFImpl> std::make_unique<MediaRecorderPrivateAVFImpl>(Ref<MediaRecorderPrivateWriter>&&, String&&, String&&);
 
-    // MediaRecorderPrivate
     void sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) final;
-    void fetchData(FetchDataCallback&&) final;
-    void audioSamplesAvailable(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
-
+    void audioSamplesAvailable(const MediaStreamTrackPrivate&, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+    void fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&&) final;
     const String& mimeType();
     void stopRecording();
-
+    
     Ref<MediaRecorderPrivateWriter> m_writer;
     String m_recordedAudioTrackID;
     String m_recordedVideoTrackID;

Modified: trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -33,51 +33,30 @@
 
 namespace WebCore {
 
-MediaRecorderPrivateMock::MediaRecorderPrivateMock(MediaStreamPrivate& stream)
+void MediaRecorderPrivateMock::sampleBufferUpdated(const MediaStreamTrackPrivate& track, MediaSample&)
 {
-    auto selectedTracks = MediaRecorderPrivate::selectTracks(stream);
-    if (selectedTracks.audioTrack) {
-        m_audioTrackID = selectedTracks.audioTrack->id();
-        setAudioSource(&selectedTracks.audioTrack->source());
-    }
-    if (selectedTracks.videoTrack)
-        m_videoTrackID = selectedTracks.videoTrack->id();
+    generateMockString(track);
 }
 
-MediaRecorderPrivateMock::~MediaRecorderPrivateMock()
+void MediaRecorderPrivateMock::audioSamplesAvailable(const MediaStreamTrackPrivate& track, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t)
 {
-    setAudioSource(nullptr);
+    generateMockString(track);
 }
 
-void MediaRecorderPrivateMock::stopRecording()
+void MediaRecorderPrivateMock::generateMockString(const MediaStreamTrackPrivate& track)
 {
-    setAudioSource(nullptr);
-}
-
-void MediaRecorderPrivateMock::sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&)
-{
     auto locker = holdLock(m_bufferLock);
-    m_buffer.append("Video Track ID: ");
-    m_buffer.append(m_videoTrackID);
-    generateMockCounterString();
-}
-
-void MediaRecorderPrivateMock::audioSamplesAvailable(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t)
-{
-    auto locker = holdLock(m_bufferLock);
-    m_buffer.append("Audio Track ID: ");
-    m_buffer.append(m_audioTrackID);
-    generateMockCounterString();
-}
-
-void MediaRecorderPrivateMock::generateMockCounterString()
-{
+    if (track.type() == RealtimeMediaSource::Type::Audio)
+        m_buffer.append("Audio Track ID: ");
+    else
+        m_buffer.append("Video Track ID: ");
+    m_buffer.append(track.id());
     m_buffer.append(" Counter: ");
     m_buffer.appendNumber(++m_counter);
     m_buffer.append("\r\n---------\r\n");
 }
 
-void MediaRecorderPrivateMock::fetchData(FetchDataCallback&& completionHandler)
+void MediaRecorderPrivateMock::fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&& completionHandler)
 {
     auto locker = holdLock(m_bufferLock);
     Vector<uint8_t> value(m_buffer.length());

Modified: trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -34,27 +34,18 @@
 
 class MediaStreamTrackPrivate;
 
-class WEBCORE_EXPORT MediaRecorderPrivateMock final
-    : public MediaRecorderPrivate {
-public:
-    explicit MediaRecorderPrivateMock(MediaStreamPrivate&);
-    ~MediaRecorderPrivateMock();
-
+class WEBCORE_EXPORT MediaRecorderPrivateMock final : public MediaRecorderPrivate {
 private:
-    // MediaRecorderPrivate
     void sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) final;
-    void fetchData(FetchDataCallback&&) final;
-    void audioSamplesAvailable(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
-    void stopRecording() final;
-
+    void audioSamplesAvailable(const MediaStreamTrackPrivate&, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+    void fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&&) final;
     const String& mimeType();
-    void generateMockCounterString();
+    
+    void generateMockString(const MediaStreamTrackPrivate&);
 
     mutable Lock m_bufferLock;
     StringBuilder m_buffer;
     unsigned m_counter { 0 };
-    String m_audioTrackID;
-    String m_videoTrackID;
 };
 
 } // namespace WebCore

Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -35,9 +35,9 @@
 
 AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream(MediaStreamTrackPrivate& track)
     : m_streamTrack(track)
-    , m_audioSource(track.source())
     , m_id(track.id())
     , m_label(track.label())
+    , m_timelineOffset(MediaTime::invalidTime())
     , m_renderer { AudioMediaStreamTrackRenderer::create() }
 {
     track.addObserver(*this);
@@ -62,36 +62,45 @@
         return;
 
     m_isCleared = true;
+    streamTrack().removeObserver(*this);
 
+    m_renderer->clear();
+}
+
+void AudioTrackPrivateMediaStream::playInternal()
+{
+    ASSERT(isMainThread());
+
     if (m_isPlaying)
-        m_audioSource->removeAudioSampleObserver(*this);
+        return;
 
-    streamTrack().removeObserver(*this);
-    m_renderer->clear();
+    m_isPlaying = true;
+    m_autoPlay = false;
+
+    m_renderer->start();
 }
 
 void AudioTrackPrivateMediaStream::play()
 {
-    m_shouldPlay = true;
-    updateRenderer();
+    playInternal();
 }
 
 void AudioTrackPrivateMediaStream::pause()
 {
-    m_shouldPlay = false;
-    updateRenderer();
-}
+    ASSERT(isMainThread());
 
-void AudioTrackPrivateMediaStream::setMuted(bool muted)
-{
-    m_muted = muted;
-    updateRenderer();
+    if (!m_isPlaying)
+        return;
+
+    m_isPlaying = false;
+    m_autoPlay = false;
+
+    m_renderer->stop();
 }
 
 void AudioTrackPrivateMediaStream::setVolume(float volume)
 {
     m_renderer->setVolume(volume);
-    updateRenderer();
 }
 
 float AudioTrackPrivateMediaStream::volume() const
@@ -100,57 +109,48 @@
 }
 
 // May get called on a background thread.
-void AudioTrackPrivateMediaStream::audioSamplesAvailable(const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
+void AudioTrackPrivateMediaStream::audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)
 {
+    if (!m_isPlaying) {
+        m_renderer->stop();
+        return;
+    }
+
     m_renderer->pushSamples(sampleTime, audioData, description, sampleCount);
+
+    if (m_autoPlay && !m_hasStartedAutoplay) {
+        m_hasStartedAutoplay = true;
+        callOnMainThread([this, protectedThis = makeRef(*this)] {
+            if (m_autoPlay)
+                playInternal();
+        });
+    }
 }
 
 void AudioTrackPrivateMediaStream::trackMutedChanged(MediaStreamTrackPrivate&)
 {
-    updateRenderer();
+    updateRendererMutedState();
 }
 
 void AudioTrackPrivateMediaStream::trackEnabledChanged(MediaStreamTrackPrivate&)
 {
-    updateRenderer();
+    updateRendererMutedState();
 }
 
-void AudioTrackPrivateMediaStream::trackEnded(MediaStreamTrackPrivate&)
+void AudioTrackPrivateMediaStream::updateRendererMutedState()
 {
-    updateRenderer();
-}
-
-void AudioTrackPrivateMediaStream::updateRenderer()
-{
-    if (!m_shouldPlay || !volume() || m_muted || streamTrack().muted() || streamTrack().ended() || !streamTrack().enabled()) {
-        stopRenderer();
+    if (streamTrack().muted() || streamTrack().ended() || !streamTrack().enabled()) {
+        pause();
         return;
     }
-    startRenderer();
+    play();
 }
 
-void AudioTrackPrivateMediaStream::startRenderer()
+void AudioTrackPrivateMediaStream::trackEnded(MediaStreamTrackPrivate&)
 {
-    ASSERT(isMainThread());
-    if (m_isPlaying)
-        return;
-
-    m_isPlaying = true;
-    m_audioSource->addAudioSampleObserver(*this);
-    m_renderer->start();
+    pause();
 }
 
-void AudioTrackPrivateMediaStream::stopRenderer()
-{
-    ASSERT(isMainThread());
-    if (!m_isPlaying)
-        return;
-
-    m_isPlaying = false;
-    m_audioSource->removeAudioSampleObserver(*this);
-    m_renderer->stop();
-}
-
 } // namespace WebCore
 
 #endif // ENABLE(VIDEO_TRACK) && ENABLE(MEDIA_STREAM)

Modified: trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -34,10 +34,7 @@
 
 class AudioMediaStreamTrackRenderer;
 
-class AudioTrackPrivateMediaStream final
-    : public AudioTrackPrivate
-    , private MediaStreamTrackPrivate::Observer
-    , private RealtimeMediaSource::AudioSampleObserver {
+class AudioTrackPrivateMediaStream final : public AudioTrackPrivate, private MediaStreamTrackPrivate::Observer {
     WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStream)
 public:
     static RefPtr<AudioTrackPrivateMediaStream> create(MediaStreamTrackPrivate& streamTrack)
@@ -50,6 +47,9 @@
 
     MediaStreamTrackPrivate& streamTrack() { return m_streamTrack.get(); }
 
+    MediaTime timelineOffset() const { return m_timelineOffset; }
+    void setTimelineOffset(const MediaTime& offset) { m_timelineOffset = offset; }
+
     void clear();
 
     void play();
@@ -59,7 +59,7 @@
     void setVolume(float);
     float volume() const;
 
-    void setMuted(bool);
+    void setMuted(bool muted) { m_muted = muted; }
     bool muted() const { return m_muted; }
 
 #if !RELEASE_LOG_DISABLED
@@ -77,32 +77,30 @@
     int trackIndex() const final { return m_index; }
 
     // MediaStreamTrackPrivate::Observer
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     void trackEnded(MediaStreamTrackPrivate&) final;
     void trackMutedChanged(MediaStreamTrackPrivate&)  final;
     void trackEnabledChanged(MediaStreamTrackPrivate&)  final;
     void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
 
-    // RealtimeMediaSource::AudioSampleObserver
-    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
+    void playInternal();
+    void updateRendererMutedState();
 
-    void startRenderer();
-    void stopRenderer();
-    void updateRenderer();
-
     // Main thread writable members
     bool m_isPlaying { false };
-    bool m_shouldPlay { false };
+    bool m_autoPlay { false };
     bool m_muted { false };
     bool m_isCleared { false };
 
     Ref<MediaStreamTrackPrivate> m_streamTrack;
-    Ref<RealtimeMediaSource> m_audioSource;
     AtomString m_id;
     AtomString m_label;
     int m_index { 0 };
+    MediaTime m_timelineOffset;
 
     // Audio thread members
     std::unique_ptr<AudioMediaStreamTrackRenderer> m_renderer;
+    bool m_hasStartedAutoplay { false };
 };
 
 }

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -121,12 +121,6 @@
         callback(*track);
 }
 
-void MediaStreamPrivate::forEachTrack(const Function<void(MediaStreamTrackPrivate&)>& callback)
-{
-    for (auto& track : m_trackSet.values())
-        callback(*track);
-}
-
 void MediaStreamPrivate::updateActiveState(NotifyClientOption notifyClientOption)
 {
     bool newActiveState = false;

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -84,7 +84,6 @@
     MediaStreamTrackPrivateVector tracks() const;
     bool hasTracks() const { return !m_trackSet.isEmpty(); }
     void forEachTrack(const Function<void(const MediaStreamTrackPrivate&)>&) const;
-    void forEachTrack(const Function<void(MediaStreamTrackPrivate&)>&);
     MediaStreamTrackPrivate* activeVideoTrack() { return m_activeVideoTrack; }
 
     bool active() const { return m_isActive; }

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -78,10 +78,16 @@
     m_source->removeObserver(*this);
 }
 
-void MediaStreamTrackPrivate::forEachObserver(const Function<void(Observer&)>& apply) const
+void MediaStreamTrackPrivate::forEachObserver(const WTF::Function<void(Observer&)>& apply) const
 {
-    ASSERT(isMainThread());
-    for (auto* observer : copyToVector(m_observers)) {
+    Vector<Observer*> observersCopy;
+    {
+        auto locker = holdLock(m_observersLock);
+        observersCopy = copyToVector(m_observers);
+    }
+    for (auto* observer : observersCopy) {
+        auto locker = holdLock(m_observersLock);
+        // Make sure the observer has not been destroyed.
         if (!m_observers.contains(observer))
             continue;
         apply(*observer);
@@ -90,13 +96,13 @@
 
 void MediaStreamTrackPrivate::addObserver(MediaStreamTrackPrivate::Observer& observer)
 {
-    ASSERT(isMainThread());
+    auto locker = holdLock(m_observersLock);
     m_observers.add(&observer);
 }
 
 void MediaStreamTrackPrivate::removeObserver(MediaStreamTrackPrivate::Observer& observer)
 {
-    ASSERT(isMainThread());
+    auto locker = holdLock(m_observersLock);
     m_observers.remove(&observer);
 }
 
@@ -255,12 +261,26 @@
     });
 }
 
-void MediaStreamTrackPrivate::hasStartedProducingAudioData()
+// May get called on a background thread.
+void MediaStreamTrackPrivate::audioSamplesAvailable(const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount)
 {
-    if (m_haveProducedData)
+    if (!m_hasSentStartProducedData) {
+        callOnMainThread([this, weakThis = makeWeakPtr(this)] {
+            if (!weakThis)
+                return;
+
+            if (!m_haveProducedData) {
+                m_haveProducedData = true;
+                updateReadyState();
+            }
+            m_hasSentStartProducedData = true;
+        });
         return;
-    m_haveProducedData = true;
-    updateReadyState();
+    }
+
+    forEachObserver([&](auto& observer) {
+        observer.audioSamplesAvailable(*this, mediaTime, data, description, sampleCount);
+    });
 }
 
 void MediaStreamTrackPrivate::updateReadyState()

Modified: trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -62,6 +62,9 @@
         virtual void trackEnabledChanged(MediaStreamTrackPrivate&) = 0;
         virtual void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) { };
         virtual void readyStateChanged(MediaStreamTrackPrivate&) { };
+
+        // May get called on a background thread.
+        virtual void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) { };
     };
 
     static Ref<MediaStreamTrackPrivate> create(Ref<const Logger>&&, Ref<RealtimeMediaSource>&&);
@@ -97,7 +100,6 @@
     Ref<MediaStreamTrackPrivate> clone();
 
     RealtimeMediaSource& source() { return m_source.get(); }
-    const RealtimeMediaSource& source() const { return m_source.get(); }
     WEBCORE_EXPORT RealtimeMediaSource::Type type() const;
 
     void endTrack();
@@ -130,7 +132,7 @@
 private:
     MediaStreamTrackPrivate(Ref<const Logger>&&, Ref<RealtimeMediaSource>&&, String&& id);
 
-    // RealtimeMediaSource::Observer
+    // RealtimeMediaSourceObserver
     void sourceStarted() final;
     void sourceStopped() final;
     void sourceMutedChanged() final;
@@ -137,8 +139,8 @@
     void sourceSettingsChanged() final;
     bool preventSourceFromStopping() final;
     void videoSampleAvailable(MediaSample&) final;
+    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     void audioUnitWillStart() final;
-    void hasStartedProducingAudioData() final;
 
     void updateReadyState();
 

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -60,29 +60,15 @@
     m_hashedID = RealtimeMediaSourceCenter::singleton().hashStringWithSalt(m_persistentID, m_idHashSalt);
 }
 
-void RealtimeMediaSource::addAudioSampleObserver(RealtimeMediaSource::AudioSampleObserver& observer)
-{
-    ASSERT(isMainThread());
-    auto locker = holdLock(m_audioSampleObserversLock);
-    m_audioSampleObservers.add(&observer);
-}
-
-void RealtimeMediaSource::removeAudioSampleObserver(RealtimeMediaSource::AudioSampleObserver& observer)
-{
-    ASSERT(isMainThread());
-    auto locker = holdLock(m_audioSampleObserversLock);
-    m_audioSampleObservers.remove(&observer);
-}
-
 void RealtimeMediaSource::addObserver(RealtimeMediaSource::Observer& observer)
 {
-    ASSERT(isMainThread());
+    auto locker = holdLock(m_observersLock);
     m_observers.add(&observer);
 }
 
 void RealtimeMediaSource::removeObserver(RealtimeMediaSource::Observer& observer)
 {
-    ASSERT(isMainThread());
+    auto locker = holdLock(m_observersLock);
     m_observers.remove(&observer);
     if (m_observers.isEmpty())
         stopBeingObserved();
@@ -130,10 +116,16 @@
     notifyMutedChange(interrupted);
 }
 
-void RealtimeMediaSource::forEachObserver(const Function<void(Observer&)>& apply) const
+void RealtimeMediaSource::forEachObserver(const WTF::Function<void(Observer&)>& apply) const
 {
-    ASSERT(isMainThread());
-    for (auto* observer : copyToVector(m_observers)) {
+    Vector<Observer*> observersCopy;
+    {
+        auto locker = holdLock(m_observersLock);
+        observersCopy = copyToVector(m_observers);
+    }
+    for (auto* observer : observersCopy) {
+        auto locker = holdLock(m_observersLock);
+        // Make sure the observer has not been destroyed.
         if (!m_observers.contains(observer))
             continue;
         apply(*observer);
@@ -190,22 +182,9 @@
 
 void RealtimeMediaSource::audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames)
 {
-    if (!m_hasSentStartProducedAudioData) {
-        callOnMainThread([this, weakThis = makeWeakPtr(this)] {
-            if (!weakThis)
-                return;
-            if (m_hasSentStartProducedAudioData)
-                return;
-            m_hasSentStartProducedAudioData = true;
-            forEachObserver([&](auto& observer) {
-                observer.hasStartedProducingAudioData();
-            });
-        });
-    }
-
-    auto locker = holdLock(m_audioSampleObserversLock);
-    for (auto* observer : m_audioSampleObservers)
-        observer->audioSamplesAvailable(time, audioData, description, numberOfFrames);
+    forEachObserver([&](auto& observer) {
+        observer.audioSamplesAvailable(time, audioData, description, numberOfFrames);
+    });
 }
 
 void RealtimeMediaSource::start()

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -69,7 +69,7 @@
 
 class WEBCORE_EXPORT RealtimeMediaSource
     : public ThreadSafeRefCounted<RealtimeMediaSource, WTF::DestructionThread::MainRunLoop>
-    , public CanMakeWeakPtr<RealtimeMediaSource, WeakPtrFactoryInitialization::Eager>
+    , public CanMakeWeakPtr<RealtimeMediaSource>
 #if !RELEASE_LOG_DISABLED
     , protected LoggerHelper
 #endif
@@ -92,14 +92,8 @@
         // Called on the main thread.
         virtual void videoSampleAvailable(MediaSample&) { }
 
-        virtual void hasStartedProducingAudioData() { }
-    };
-    class AudioSampleObserver {
-    public:
-        virtual ~AudioSampleObserver() = default;
-
         // May be called on a background thread.
-        virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) = 0;
+        virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { }
     };
 
     virtual ~RealtimeMediaSource() = default;
@@ -137,9 +131,6 @@
     WEBCORE_EXPORT void addObserver(Observer&);
     WEBCORE_EXPORT void removeObserver(Observer&);
 
-    WEBCORE_EXPORT void addAudioSampleObserver(AudioSampleObserver&);
-    WEBCORE_EXPORT void removeAudioSampleObserver(AudioSampleObserver&);
-
     const IntSize size() const;
     void setSize(const IntSize&);
 
@@ -262,11 +253,8 @@
     String m_persistentID;
     Type m_type;
     String m_name;
+    mutable RecursiveLock m_observersLock;
     HashSet<Observer*> m_observers;
-
-    mutable RecursiveLock m_audioSampleObserversLock;
-    HashSet<AudioSampleObserver*> m_audioSampleObservers;
-
     IntSize m_size;
     IntSize m_intrinsicSize;
     double m_frameRate { 30 };
@@ -284,7 +272,6 @@
     bool m_interrupted { false };
     bool m_captureDidFailed { false };
     bool m_isEnded { false };
-    bool m_hasSentStartProducedAudioData { false };
 };
 
 struct CaptureSourceOrError {

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -45,7 +45,7 @@
 
 RealtimeOutgoingAudioSource::~RealtimeOutgoingAudioSource()
 {
-    ASSERT(!m_audioSource->hasObserver(*this));
+ASSERT(!m_audioSource->hasObserver(*this));
 #if ASSERT_ENABLED
     auto locker = holdLock(m_sinksLock);
 #endif
@@ -58,13 +58,11 @@
 {
     ASSERT(!m_audioSource->hasObserver(*this));
     m_audioSource->addObserver(*this);
-    m_audioSource->source().addAudioSampleObserver(*this);
     initializeConverter();
 }
 
 void RealtimeOutgoingAudioSource::unobserveSource()
 {
-    m_audioSource->source().removeAudioSampleObserver(*this);
     m_audioSource->removeObserver(*this);
 }
 

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -55,7 +55,6 @@
     : public ThreadSafeRefCounted<RealtimeOutgoingAudioSource, WTF::DestructionThread::Main>
     , public webrtc::AudioSourceInterface
     , private MediaStreamTrackPrivate::Observer
-    , private RealtimeMediaSource::AudioSampleObserver
 #if !RELEASE_LOG_DISABLED
     , private LoggerHelper
 #endif
@@ -109,6 +108,7 @@
 
     void sourceMutedChanged();
     void sourceEnabledChanged();
+    virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) { };
 
     virtual bool isReachingBufferedAudioDataHighLimit() { return false; };
     virtual bool isReachingBufferedAudioDataLowLimit() { return false; };
@@ -118,6 +118,7 @@
     // MediaStreamTrackPrivate::Observer API
     void trackMutedChanged(MediaStreamTrackPrivate&) final { sourceMutedChanged(); }
     void trackEnabledChanged(MediaStreamTrackPrivate&) final { sourceEnabledChanged(); }
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount) { audioSamplesAvailable(mediaTime, data, description, sampleCount); }
     void trackEnded(MediaStreamTrackPrivate&) final { }
     void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
 

Modified: trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -32,7 +32,7 @@
 
 namespace WebCore {
 
-class WebAudioSourceProvider : public ThreadSafeRefCounted<WebAudioSourceProvider, WTF::DestructionThread::Main>, public AudioSourceProvider {
+class WebAudioSourceProvider : public ThreadSafeRefCounted<WebAudioSourceProvider>, public AudioSourceProvider {
 };
 
 }

Modified: trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -106,8 +106,7 @@
 }
 
 class WebKitMediaStreamTrackObserver
-    : public MediaStreamTrackPrivate::Observer
-    , public RealtimeMediaSource::AudioSampleObserver {
+    : public MediaStreamTrackPrivate::Observer {
     WTF_MAKE_FAST_ALLOCATED;
 public:
     virtual ~WebKitMediaStreamTrackObserver() { };
@@ -132,7 +131,7 @@
         webkitMediaStreamSrcPushVideoSample(m_mediaStreamSrc, gstsample);
     }
 
-    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData& audioData, const AudioStreamDescription&, size_t) final
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData& audioData, const AudioStreamDescription&, size_t) final
     {
         auto audiodata = static_cast<const GStreamerAudioData&>(audioData);
 
@@ -376,10 +375,9 @@
 
     GST_OBJECT_LOCK(self);
     if (self->stream) {
-        for (auto& track : self->stream->tracks()) {
-            track->source().removeAudioSampleObserver(*self->mediaStreamTrackObserver.get());
+        for (auto& track : self->stream->tracks())
             track->removeObserver(*self->mediaStreamTrackObserver.get());
-        }
+
         self->stream->removeObserver(*self->mediaStreamObserver);
         self->stream = nullptr;
     }
@@ -398,14 +396,10 @@
 
         GST_OBJECT_LOCK(self);
         if (self->stream) {
-            for (auto& track : self->stream->tracks()) {
-                track->source().removeAudioSampleObserver(*self->mediaStreamTrackObserver.get());
+            for (auto& track : self->stream->tracks())
                 track->removeObserver(*self->mediaStreamTrackObserver.get());
-            }
-        } else if (self->track) {
-            self->track->source().removeAudioSampleObserver(*self->mediaStreamTrackObserver.get());
+        } else if (self->track)
             self->track->removeObserver(*self->mediaStreamTrackObserver.get());
-        }
         GST_OBJECT_UNLOCK(self);
     }
 
@@ -549,10 +543,9 @@
     } else
         webkitMediaStreamSrcAddPad(self, pad.get(), pad_template);
 
-    if (observe_track) {
+    if (observe_track)
         track->addObserver(*self->mediaStreamTrackObserver.get());
-        track->source().addAudioSampleObserver(*self->mediaStreamTrackObserver.get());
-    }
+
     gst_element_sync_state_with_parent(element);
     return TRUE;
 }

Modified: trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -46,10 +46,7 @@
 class AudioSampleDataSource;
 class CAAudioStreamDescription;
 
-class WEBCORE_EXPORT WebAudioSourceProviderAVFObjC final
-    : public WebAudioSourceProvider
-    , MediaStreamTrackPrivate::Observer
-    , RealtimeMediaSource::AudioSampleObserver {
+class WEBCORE_EXPORT WebAudioSourceProviderAVFObjC final : public WebAudioSourceProvider, MediaStreamTrackPrivate::Observer {
 public:
     static Ref<WebAudioSourceProviderAVFObjC> create(MediaStreamTrackPrivate&);
     virtual ~WebAudioSourceProviderAVFObjC();
@@ -65,14 +62,12 @@
     void setClient(AudioSourceProviderClient*) final;
 
     // MediaStreamTrackPrivate::Observer
+    void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
     void trackEnded(MediaStreamTrackPrivate&) final { }
     void trackMutedChanged(MediaStreamTrackPrivate&) final { }
     void trackSettingsChanged(MediaStreamTrackPrivate&) final { }
-    void trackEnabledChanged(MediaStreamTrackPrivate&) final;
+    void trackEnabledChanged(MediaStreamTrackPrivate&) final { }
 
-    // RealtimeMediaSource::AudioSampleObserver
-    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final;
-
     size_t m_listBufferSize { 0 };
     Optional<CAAudioStreamDescription> m_inputDescription;
     Optional<CAAudioStreamDescription> m_outputDescription;
@@ -82,10 +77,8 @@
     uint64_t m_readCount { 0 };
     AudioSourceProviderClient* m_client { nullptr };
     MediaStreamTrackPrivate* m_captureSource { nullptr };
-    Ref<RealtimeMediaSource> m_source;
     Lock m_mutex;
     bool m_connected { false };
-    bool m_enabled { true };
 };
 
 }

Modified: trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm (259823 => 259824)


--- trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm	2020-04-09 20:49:04 UTC (rev 259824)
@@ -54,16 +54,11 @@
 
 WebAudioSourceProviderAVFObjC::WebAudioSourceProviderAVFObjC(MediaStreamTrackPrivate& source)
     : m_captureSource(&source)
-    , m_source(source.source())
-    , m_enabled(source.enabled())
 {
-    m_source->addAudioSampleObserver(*this);
 }
 
 WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC()
 {
-    m_source->removeAudioSampleObserver(*this);
-
     auto locker = holdLock(m_mutex);
 
     if (m_connected && m_captureSource)
@@ -170,15 +165,10 @@
     }
 }
 
-void WebAudioSourceProviderAVFObjC::trackEnabledChanged(MediaStreamTrackPrivate& track)
-{
-    m_enabled = track.enabled();
-}
-
 // May get called on a background thread.
-void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription& description, size_t frameCount)
+void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(MediaStreamTrackPrivate& track, const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription& description, size_t frameCount)
 {
-    if (!m_enabled || !m_connected)
+    if (!track.enabled())
         return;
 
     ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);

Modified: trunk/Source/WebCore/testing/Internals.cpp (259823 => 259824)


--- trunk/Source/WebCore/testing/Internals.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/testing/Internals.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -466,10 +466,8 @@
 Internals::~Internals()
 {
 #if ENABLE(MEDIA_STREAM)
-    if (m_trackSource) {
-        m_trackSource->removeObserver(*this);
-        m_trackSource->removeAudioSampleObserver(*this);
-    }
+    if (m_track)
+        m_track->source().removeObserver(*this);
 #endif
 }
 
@@ -1641,9 +1639,9 @@
         page->settings().setMediaCaptureRequiresSecureConnection(enabled);
 }
 
-static std::unique_ptr<MediaRecorderPrivate> createRecorderMockSource(MediaStreamPrivate& stream)
+static std::unique_ptr<MediaRecorderPrivate> createRecorderMockSource()
 {
-    return std::unique_ptr<MediaRecorderPrivateMock>(new MediaRecorderPrivateMock(stream));
+    return std::unique_ptr<MediaRecorderPrivateMock>(new MediaRecorderPrivateMock);
 }
 
 void Internals::setCustomPrivateRecorderCreator()
@@ -4927,9 +4925,8 @@
 
 void Internals::observeMediaStreamTrack(MediaStreamTrack& track)
 {
-    m_trackSource = &track.source();
-    m_trackSource->addObserver(*this);
-    m_trackSource->addAudioSampleObserver(*this);
+    m_track = &track;
+    m_track->source().addObserver(*this);
 }
 
 void Internals::grabNextMediaStreamTrackFrame(TrackFramePromise&& promise)
@@ -4943,7 +4940,7 @@
     if (!m_nextTrackFramePromise)
         return;
 
-    auto& videoSettings = m_trackSource->settings();
+    auto& videoSettings = m_track->source().settings();
     if (!videoSettings.width() || !videoSettings.height())
         return;
     

Modified: trunk/Source/WebCore/testing/Internals.h (259823 => 259824)


--- trunk/Source/WebCore/testing/Internals.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebCore/testing/Internals.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -123,7 +123,6 @@
 class Internals final : public RefCounted<Internals>, private ContextDestructionObserver
 #if ENABLE(MEDIA_STREAM)
     , private RealtimeMediaSource::Observer
-    , private RealtimeMediaSource::AudioSampleObserver
 #endif
     {
 public:
@@ -970,16 +969,15 @@
 
     ExceptionOr<RenderedDocumentMarker*> markerAt(Node&, const String& markerType, unsigned index);
 
+    // RealtimeMediaSource::Observer API
 #if ENABLE(MEDIA_STREAM)
-    // RealtimeMediaSource::Observer API
     void videoSampleAvailable(MediaSample&) final;
-    // RealtimeMediaSource::AudioSampleObserver API
     void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final { m_trackAudioSampleCount++; }
 
     OrientationNotifier m_orientationNotifier;
     unsigned long m_trackVideoSampleCount { 0 };
     unsigned long m_trackAudioSampleCount { 0 };
-    RefPtr<RealtimeMediaSource> m_trackSource;
+    RefPtr<MediaStreamTrack> m_track;
     std::unique_ptr<TrackFramePromise> m_nextTrackFramePromise;
 #endif
 

Modified: trunk/Source/WebKit/ChangeLog (259823 => 259824)


--- trunk/Source/WebKit/ChangeLog	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebKit/ChangeLog	2020-04-09 20:49:04 UTC (rev 259824)
@@ -1,3 +1,16 @@
+2020-04-09  Jacob Uphoff  <jacob_uph...@apple.com>
+
+        Unreviewed, reverting r259816.
+
+        This commit broke the webkit build for macOS and iOS
+
+        Reverted changeset:
+
+        "Introduce a RealtimeMediaSource observer dedicated to
+        receiving audio samples"
+        https://bugs.webkit.org/show_bug.cgi?id=210180
+        https://trac.webkit.org/changeset/259816
+
 2020-04-09  Simon Fraser  <simon.fra...@apple.com>
 
         eventSender.monitorWheelEvents() should clear latching state

Modified: trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (259823 => 259824)


--- trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -50,7 +50,6 @@
 
 class UserMediaCaptureManagerProxy::SourceProxy
     : public RealtimeMediaSource::Observer
-    , public RealtimeMediaSource::AudioSampleObserver
     , public SharedRingBufferStorage::Client {
     WTF_MAKE_FAST_ALLOCATED;
 public:
@@ -61,13 +60,11 @@
         , m_ringBuffer(makeUniqueRef<SharedRingBufferStorage>(makeUniqueRef<SharedRingBufferStorage>(this)))
     {
         m_source->addObserver(*this);
-        m_source->addAudioSampleObserver(*this);
     }
 
     ~SourceProxy()
     {
         storage().invalidate();
-        m_source->removeAudioSampleObserver(*this);
         m_source->removeObserver(*this);
     }
 

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp (259823 => 259824)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -43,7 +43,7 @@
 namespace WebKit {
 using namespace WebCore;
 
-MediaRecorderPrivate::MediaRecorderPrivate(MediaStreamPrivate& stream)
+MediaRecorderPrivate::MediaRecorderPrivate(const MediaStreamPrivate& stream)
     : m_identifier(MediaRecorderIdentifier::generate())
     , m_connection(WebProcess::singleton().ensureGPUProcessConnection().connection())
 {
@@ -64,19 +64,15 @@
         width = selectedTracks.videoTrack->settings().width();
     }
 
-    m_connection->sendWithAsyncReply(Messages::RemoteMediaRecorderManager::CreateRecorder { m_identifier, !!selectedTracks.audioTrack, width, height }, [this, weakThis = makeWeakPtr(this), audioTrack = makeRefPtr(selectedTracks.audioTrack)](auto&& exception) {
-        if (!weakThis)
+    m_connection->sendWithAsyncReply(Messages::RemoteMediaRecorderManager::CreateRecorder { m_identifier, !!selectedTracks.audioTrack, width, height }, [this, weakThis = makeWeakPtr(this)](auto&& exception) {
+        if (!weakThis || !exception)
             return;
-        if (exception)
-            return m_errorCallback(Exception { exception->code, WTFMove(exception->message) });
-        if (audioTrack)
-            setAudioSource(&audioTrack->source());
+        m_errorCallback(Exception { exception->code, WTFMove(exception->message) });
     }, 0);
 }
 
 MediaRecorderPrivate::~MediaRecorderPrivate()
 {
-    setAudioSource(nullptr);
     m_connection->send(Messages::RemoteMediaRecorderManager::ReleaseRecorder { m_identifier }, 0);
 }
 
@@ -92,8 +88,11 @@
 #endif
 }
 
-void MediaRecorderPrivate::audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames)
+void MediaRecorderPrivate::audioSamplesAvailable(const WebCore::MediaStreamTrackPrivate& track, const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames)
 {
+    if (track.id() != m_recordedAudioTrackID)
+        return;
+
     if (m_description != description) {
         ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
         m_description = *WTF::get<const AudioStreamBasicDescription*>(description.platformDescription().description);
@@ -131,7 +130,6 @@
 
 void MediaRecorderPrivate::stopRecording()
 {
-    setAudioSource(nullptr);
     m_connection->send(Messages::RemoteMediaRecorder::StopRecording { }, m_identifier);
 }
 

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h (259823 => 259824)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -44,21 +44,18 @@
 
 namespace WebKit {
 
-class MediaRecorderPrivate final
-    : public WebCore::MediaRecorderPrivate
-    , public SharedRingBufferStorage::Client
-    , public CanMakeWeakPtr<MediaRecorderPrivate> {
+class MediaRecorderPrivate final : public WebCore::MediaRecorderPrivate, public SharedRingBufferStorage::Client, public CanMakeWeakPtr<MediaRecorderPrivate> {
     WTF_MAKE_FAST_ALLOCATED;
 public:
-    explicit MediaRecorderPrivate(WebCore::MediaStreamPrivate&);
+    explicit MediaRecorderPrivate(const WebCore::MediaStreamPrivate&);
     ~MediaRecorderPrivate();
 
 private:
     // WebCore::MediaRecorderPrivate
     void sampleBufferUpdated(const WebCore::MediaStreamTrackPrivate&, WebCore::MediaSample&) final;
+    void audioSamplesAvailable(const WebCore::MediaStreamTrackPrivate&, const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t) final;
     void fetchData(CompletionHandler<void(RefPtr<WebCore::SharedBuffer>&&, const String& mimeType)>&&) final;
     void stopRecording() final;
-    void audioSamplesAvailable(const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t) final;
 
     // SharedRingBufferStorage::Client
     void storageChanged(SharedMemory*);

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.cpp (259823 => 259824)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.cpp	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.cpp	2020-04-09 20:49:04 UTC (rev 259824)
@@ -34,7 +34,7 @@
 namespace WebKit {
 using namespace WebCore;
 
-std::unique_ptr<WebCore::MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate(MediaStreamPrivate& stream)
+std::unique_ptr<WebCore::MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate(const MediaStreamPrivate& stream)
 {
 #if ENABLE(GPU_PROCESS)
     if (m_useGPUProcess)

Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.h (259823 => 259824)


--- trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.h	2020-04-09 20:43:05 UTC (rev 259823)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.h	2020-04-09 20:49:04 UTC (rev 259824)
@@ -35,7 +35,7 @@
 
 private:
 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
-    std::unique_ptr<WebCore::MediaRecorderPrivate> createMediaRecorderPrivate(WebCore::MediaStreamPrivate&) final;
+    std::unique_ptr<WebCore::MediaRecorderPrivate> createMediaRecorderPrivate(const WebCore::MediaStreamPrivate&) final;
 #endif
 };
 
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to