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
};