Changeset 259824 in webkit
- Timestamp:
- Apr 9, 2020, 1:49:04 PM (6 years ago)
- Location:
- trunk/Source
- Files:
-
- 35 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/Modules/mediarecorder/MediaRecorder.cpp (modified) (3 diffs)
-
WebCore/Modules/mediarecorder/MediaRecorder.h (modified) (4 diffs)
-
WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp (modified) (1 diff)
-
WebCore/Modules/mediarecorder/MediaRecorderProvider.h (modified) (1 diff)
-
WebCore/loader/EmptyClients.cpp (modified) (1 diff)
-
WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (modified) (2 diffs)
-
WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp (modified) (1 diff)
-
WebCore/platform/mediarecorder/MediaRecorderPrivate.h (modified) (3 diffs)
-
WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp (modified) (5 diffs)
-
WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h (modified) (2 diffs)
-
WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp (modified) (2 diffs)
-
WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h (modified) (1 diff)
-
WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (modified) (4 diffs)
-
WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h (modified) (5 diffs)
-
WebCore/platform/mediastream/MediaStreamPrivate.cpp (modified) (1 diff)
-
WebCore/platform/mediastream/MediaStreamPrivate.h (modified) (1 diff)
-
WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp (modified) (4 diffs)
-
WebCore/platform/mediastream/MediaStreamTrackPrivate.h (modified) (4 diffs)
-
WebCore/platform/mediastream/RealtimeMediaSource.cpp (modified) (4 diffs)
-
WebCore/platform/mediastream/RealtimeMediaSource.h (modified) (5 diffs)
-
WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp (modified) (3 diffs)
-
WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h (modified) (3 diffs)
-
WebCore/platform/mediastream/WebAudioSourceProvider.h (modified) (1 diff)
-
WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp (modified) (5 diffs)
-
WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h (modified) (3 diffs)
-
WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm (modified) (2 diffs)
-
WebCore/testing/Internals.cpp (modified) (4 diffs)
-
WebCore/testing/Internals.h (modified) (3 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp (modified) (3 diffs)
-
WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp (modified) (5 diffs)
-
WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h (modified) (2 diffs)
-
WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.cpp (modified) (1 diff)
-
WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r259821 r259824 1 2020-04-09 Jacob Uphoff <jacob_uphoff@apple.com> 2 3 Unreviewed, reverting r259816. 4 5 This commit broke the webkit build for macOS and iOS 6 7 Reverted changeset: 8 9 "Introduce a RealtimeMediaSource observer dedicated to 10 receiving audio samples" 11 https://bugs.webkit.org/show_bug.cgi?id=210180 12 https://trac.webkit.org/changeset/259816 13 1 14 2020-04-09 Daniel Bates <dabates@apple.com> 2 15 -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp
r259816 r259824 45 45 WTF_MAKE_ISO_ALLOCATED_IMPL(MediaRecorder); 46 46 47 MediaRecorder::CreatorFunction MediaRecorder::m_customCreator = nullptr;47 creatorFunction MediaRecorder::m_customCreator = nullptr; 48 48 49 49 ExceptionOr<Ref<MediaRecorder>> MediaRecorder::create(Document& document, Ref<MediaStream>&& stream, Options&& options) … … 60 60 } 61 61 62 void MediaRecorder::setCustomPrivateRecorderCreator( CreatorFunction creator)62 void MediaRecorder::setCustomPrivateRecorderCreator(creatorFunction creator) 63 63 { 64 64 m_customCreator = creator; 65 65 } 66 66 67 std::unique_ptr<MediaRecorderPrivate> MediaRecorder::createMediaRecorderPrivate(Document& document, MediaStreamPrivate& stream)67 std::unique_ptr<MediaRecorderPrivate> MediaRecorder::createMediaRecorderPrivate(Document& document, const MediaStreamPrivate& stream) 68 68 { 69 69 if (m_customCreator) 70 return m_customCreator( stream);70 return m_customCreator(); 71 71 72 72 #if PLATFORM(COCOA) … … 228 228 } 229 229 230 void MediaRecorder::audioSamplesAvailable(MediaStreamTrackPrivate& track, const MediaTime& mediaTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount) 231 { 232 m_private->audioSamplesAvailable(track, mediaTime, audioData, description, sampleCount); 233 } 234 230 235 bool MediaRecorder::virtualHasPendingActivity() const 231 236 { -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorder.h
r259816 r259824 39 39 class MediaRecorderPrivate; 40 40 41 typedef std::unique_ptr<MediaRecorderPrivate>(*creatorFunction)(); 42 41 43 class MediaRecorder final 42 44 : public ActiveDOMObject … … 61 63 static ExceptionOr<Ref<MediaRecorder>> create(Document&, Ref<MediaStream>&&, Options&& = { }); 62 64 63 using CreatorFunction = std::unique_ptr<MediaRecorderPrivate>(*)(MediaStreamPrivate&); 64 65 WEBCORE_EXPORT static void setCustomPrivateRecorderCreator(CreatorFunction); 65 WEBCORE_EXPORT static void setCustomPrivateRecorderCreator(creatorFunction); 66 66 67 67 RecordingState state() const { return m_state; } … … 79 79 MediaRecorder(Document&, Ref<MediaStream>&&, std::unique_ptr<MediaRecorderPrivate>&&, Options&& = { }); 80 80 81 static std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(Document&, MediaStreamPrivate&);81 static std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(Document&, const MediaStreamPrivate&); 82 82 83 83 Document* document() const; … … 108 108 void trackEnabledChanged(MediaStreamTrackPrivate&) final { }; 109 109 void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) final; 110 111 static CreatorFunction m_customCreator; 110 void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 111 112 static creatorFunction m_customCreator; 112 113 113 114 Options m_options; -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp
r259816 r259824 33 33 namespace WebCore { 34 34 35 std::unique_ptr<MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate( MediaStreamPrivate& stream)35 std::unique_ptr<MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate(const MediaStreamPrivate& stream) 36 36 { 37 37 return MediaRecorderPrivateAVFImpl::create(stream); -
trunk/Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h
r259816 r259824 38 38 39 39 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 40 virtual std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate( MediaStreamPrivate&);40 virtual std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(const MediaStreamPrivate&); 41 41 #endif 42 42 -
trunk/Source/WebCore/loader/EmptyClients.cpp
r259816 r259824 583 583 private: 584 584 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 585 std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate( MediaStreamPrivate&) final { return nullptr; }585 std::unique_ptr<MediaRecorderPrivate> createMediaRecorderPrivate(const MediaStreamPrivate&) final { return nullptr; } 586 586 #endif 587 587 }; -
trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm
r259816 r259824 561 561 m_volume = volume; 562 562 for (const auto& track : m_audioTrackMap.values()) 563 track->setVolume(m_ volume);563 track->setVolume(m_muted ? 0 : m_volume); 564 564 } 565 565 … … 572 572 m_muted = muted; 573 573 for (const auto& track : m_audioTrackMap.values()) 574 track->set Muted(m_muted);574 track->setVolume(m_muted ? 0 : m_volume); 575 575 } 576 576 -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.cpp
r259816 r259824 33 33 namespace WebCore { 34 34 35 MediaRecorderPrivate::AudioVideoSelectedTracks MediaRecorderPrivate::selectTracks( MediaStreamPrivate& stream)35 MediaRecorderPrivate::AudioVideoSelectedTracks MediaRecorderPrivate::selectTracks(const MediaStreamPrivate& stream) 36 36 { 37 37 AudioVideoSelectedTracks selectedTracks; -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivate.h
r259816 r259824 28 28 #include <wtf/Forward.h> 29 29 #include "Exception.h" 30 #include "RealtimeMediaSource.h"31 30 32 31 #if ENABLE(MEDIA_STREAM) … … 45 44 class SharedBuffer; 46 45 47 class MediaRecorderPrivate : 48 public RealtimeMediaSource::AudioSampleObserver { 46 class MediaRecorderPrivate { 49 47 public: 50 ~MediaRecorderPrivate();48 virtual ~MediaRecorderPrivate() = default; 51 49 52 50 struct AudioVideoSelectedTracks { 53 MediaStreamTrackPrivate* audioTrack { nullptr };54 MediaStreamTrackPrivate* videoTrack { nullptr };51 const MediaStreamTrackPrivate* audioTrack { nullptr }; 52 const MediaStreamTrackPrivate* videoTrack { nullptr }; 55 53 }; 56 WEBCORE_EXPORT static AudioVideoSelectedTracks selectTracks( MediaStreamPrivate&);54 WEBCORE_EXPORT static AudioVideoSelectedTracks selectTracks(const MediaStreamPrivate&); 57 55 58 56 virtual void sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) = 0; 57 virtual void audioSamplesAvailable(const MediaStreamTrackPrivate&, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) = 0; 59 58 60 using FetchDataCallback = CompletionHandler<void(RefPtr<SharedBuffer>&&, const String& mimeType)>; 61 virtual void fetchData(FetchDataCallback&&) = 0; 62 virtual void stopRecording() = 0; 59 virtual void fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String& mimeType)>&&) = 0; 60 virtual void stopRecording() { }; 63 61 64 62 using ErrorCallback = Function<void(Optional<Exception>&&)>; … … 66 64 67 65 protected: 68 void setAudioSource(RefPtr<RealtimeMediaSource>&&);69 70 protected:71 66 ErrorCallback m_errorCallback; 72 73 private:74 RefPtr<RealtimeMediaSource> m_audioSource;75 67 }; 76 77 inline void MediaRecorderPrivate::setAudioSource(RefPtr<RealtimeMediaSource>&& audioSource)78 {79 if (m_audioSource)80 m_audioSource->removeAudioSampleObserver(*this);81 82 m_audioSource = WTFMove(audioSource);83 84 if (m_audioSource)85 m_audioSource->addAudioSampleObserver(*this);86 }87 88 inline MediaRecorderPrivate::~MediaRecorderPrivate()89 {90 if (m_audioSource)91 m_audioSource->removeAudioSampleObserver(*this);92 }93 68 94 69 } // namespace WebCore -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp
r259816 r259824 37 37 namespace WebCore { 38 38 39 std::unique_ptr<MediaRecorderPrivateAVFImpl> MediaRecorderPrivateAVFImpl::create( MediaStreamPrivate& stream)39 std::unique_ptr<MediaRecorderPrivateAVFImpl> MediaRecorderPrivateAVFImpl::create(const MediaStreamPrivate& stream) 40 40 { 41 41 // FIXME: we will need to implement support for multiple audio/video tracks … … 52 52 if (selectedTracks.audioTrack) 53 53 audioTrackId = selectedTracks.audioTrack->id(); 54 55 54 String videoTrackId; 56 55 if (selectedTracks.videoTrack) 57 56 videoTrackId = selectedTracks.videoTrack->id(); 58 57 59 auto recorder = makeUnique<MediaRecorderPrivateAVFImpl>(writer.releaseNonNull(), WTFMove(audioTrackId), WTFMove(videoTrackId)); 60 if (selectedTracks.audioTrack) 61 recorder->setAudioSource(&selectedTracks.audioTrack->source()); 62 return recorder; 58 return makeUnique<MediaRecorderPrivateAVFImpl>(writer.releaseNonNull(), WTFMove(audioTrackId), WTFMove(videoTrackId)); 63 59 } 64 60 … … 70 66 } 71 67 72 MediaRecorderPrivateAVFImpl::~MediaRecorderPrivateAVFImpl()73 {74 setAudioSource(nullptr);75 }76 77 68 void MediaRecorderPrivateAVFImpl::sampleBufferUpdated(const MediaStreamTrackPrivate& track, MediaSample& sampleBuffer) 78 69 { … … 82 73 } 83 74 84 void MediaRecorderPrivateAVFImpl::audioSamplesAvailable(const WTF::MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount)75 void MediaRecorderPrivateAVFImpl::audioSamplesAvailable(const MediaStreamTrackPrivate& track, const WTF::MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount) 85 76 { 77 if (track.id() != m_recordedAudioTrackID) 78 return; 86 79 ASSERT(is<WebAudioBufferList>(data)); 87 80 ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType); … … 91 84 void MediaRecorderPrivateAVFImpl::stopRecording() 92 85 { 93 setAudioSource(nullptr);94 86 m_writer->stopRecording(); 95 87 } 96 88 97 void MediaRecorderPrivateAVFImpl::fetchData( FetchDataCallback&& completionHandler)89 void MediaRecorderPrivateAVFImpl::fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&& completionHandler) 98 90 { 99 91 m_writer->fetchData([completionHandler = WTFMove(completionHandler), mimeType = mimeType()](auto&& buffer) mutable { -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.h
r259816 r259824 34 34 class MediaStreamPrivate; 35 35 36 class MediaRecorderPrivateAVFImpl final 37 : public MediaRecorderPrivate { 36 class MediaRecorderPrivateAVFImpl final : public MediaRecorderPrivate { 38 37 WTF_MAKE_FAST_ALLOCATED; 39 38 public: 40 static std::unique_ptr<MediaRecorderPrivateAVFImpl> create(MediaStreamPrivate&); 41 ~MediaRecorderPrivateAVFImpl(); 39 static std::unique_ptr<MediaRecorderPrivateAVFImpl> create(const MediaStreamPrivate&); 42 40 43 41 private: … … 46 44 friend std::unique_ptr<MediaRecorderPrivateAVFImpl> std::make_unique<MediaRecorderPrivateAVFImpl>(Ref<MediaRecorderPrivateWriter>&&, String&&, String&&); 47 45 48 // MediaRecorderPrivate49 46 void sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) final; 50 void fetchData(FetchDataCallback&&) final; 51 void audioSamplesAvailable(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 52 47 void audioSamplesAvailable(const MediaStreamTrackPrivate&, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 48 void fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&&) final; 53 49 const String& mimeType(); 54 50 void stopRecording(); 55 51 56 52 Ref<MediaRecorderPrivateWriter> m_writer; 57 53 String m_recordedAudioTrackID; -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.cpp
r259816 r259824 34 34 namespace WebCore { 35 35 36 MediaRecorderPrivateMock::MediaRecorderPrivateMock(MediaStreamPrivate& stream)36 void MediaRecorderPrivateMock::sampleBufferUpdated(const MediaStreamTrackPrivate& track, MediaSample&) 37 37 { 38 auto selectedTracks = MediaRecorderPrivate::selectTracks(stream); 39 if (selectedTracks.audioTrack) { 40 m_audioTrackID = selectedTracks.audioTrack->id(); 41 setAudioSource(&selectedTracks.audioTrack->source()); 42 } 43 if (selectedTracks.videoTrack) 44 m_videoTrackID = selectedTracks.videoTrack->id(); 38 generateMockString(track); 45 39 } 46 40 47 MediaRecorderPrivateMock::~MediaRecorderPrivateMock()41 void MediaRecorderPrivateMock::audioSamplesAvailable(const MediaStreamTrackPrivate& track, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) 48 42 { 49 setAudioSource(nullptr);43 generateMockString(track); 50 44 } 51 45 52 void MediaRecorderPrivateMock::stopRecording() 53 { 54 setAudioSource(nullptr); 55 } 56 57 void MediaRecorderPrivateMock::sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) 46 void MediaRecorderPrivateMock::generateMockString(const MediaStreamTrackPrivate& track) 58 47 { 59 48 auto locker = holdLock(m_bufferLock); 60 m_buffer.append("Video Track ID: "); 61 m_buffer.append(m_videoTrackID); 62 generateMockCounterString(); 63 } 64 65 void MediaRecorderPrivateMock::audioSamplesAvailable(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) 66 { 67 auto locker = holdLock(m_bufferLock); 68 m_buffer.append("Audio Track ID: "); 69 m_buffer.append(m_audioTrackID); 70 generateMockCounterString(); 71 } 72 73 void MediaRecorderPrivateMock::generateMockCounterString() 74 { 49 if (track.type() == RealtimeMediaSource::Type::Audio) 50 m_buffer.append("Audio Track ID: "); 51 else 52 m_buffer.append("Video Track ID: "); 53 m_buffer.append(track.id()); 75 54 m_buffer.append(" Counter: "); 76 55 m_buffer.appendNumber(++m_counter); … … 78 57 } 79 58 80 void MediaRecorderPrivateMock::fetchData( FetchDataCallback&& completionHandler)59 void MediaRecorderPrivateMock::fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&& completionHandler) 81 60 { 82 61 auto locker = holdLock(m_bufferLock); -
trunk/Source/WebCore/platform/mediarecorder/MediaRecorderPrivateMock.h
r259816 r259824 35 35 class MediaStreamTrackPrivate; 36 36 37 class WEBCORE_EXPORT MediaRecorderPrivateMock final 38 : public MediaRecorderPrivate { 39 public: 40 explicit MediaRecorderPrivateMock(MediaStreamPrivate&); 41 ~MediaRecorderPrivateMock(); 42 37 class WEBCORE_EXPORT MediaRecorderPrivateMock final : public MediaRecorderPrivate { 43 38 private: 44 // MediaRecorderPrivate45 39 void sampleBufferUpdated(const MediaStreamTrackPrivate&, MediaSample&) final; 46 void fetchData(FetchDataCallback&&) final; 47 void audioSamplesAvailable(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 48 void stopRecording() final; 49 40 void audioSamplesAvailable(const MediaStreamTrackPrivate&, const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 41 void fetchData(CompletionHandler<void(RefPtr<SharedBuffer>&&, const String&)>&&) final; 50 42 const String& mimeType(); 51 void generateMockCounterString(); 43 44 void generateMockString(const MediaStreamTrackPrivate&); 52 45 53 46 mutable Lock m_bufferLock; 54 47 StringBuilder m_buffer; 55 48 unsigned m_counter { 0 }; 56 String m_audioTrackID;57 String m_videoTrackID;58 49 }; 59 50 -
trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp
r259816 r259824 36 36 AudioTrackPrivateMediaStream::AudioTrackPrivateMediaStream(MediaStreamTrackPrivate& track) 37 37 : m_streamTrack(track) 38 , m_audioSource(track.source())39 38 , m_id(track.id()) 40 39 , m_label(track.label()) 40 , m_timelineOffset(MediaTime::invalidTime()) 41 41 , m_renderer { AudioMediaStreamTrackRenderer::create() } 42 42 { … … 63 63 64 64 m_isCleared = true; 65 streamTrack().removeObserver(*this); 66 67 m_renderer->clear(); 68 } 69 70 void AudioTrackPrivateMediaStream::playInternal() 71 { 72 ASSERT(isMainThread()); 65 73 66 74 if (m_isPlaying) 67 m_audioSource->removeAudioSampleObserver(*this);75 return; 68 76 69 streamTrack().removeObserver(*this); 70 m_renderer->clear(); 77 m_isPlaying = true; 78 m_autoPlay = false; 79 80 m_renderer->start(); 71 81 } 72 82 73 83 void AudioTrackPrivateMediaStream::play() 74 84 { 75 m_shouldPlay = true; 76 updateRenderer(); 85 playInternal(); 77 86 } 78 87 79 88 void AudioTrackPrivateMediaStream::pause() 80 89 { 81 m_shouldPlay = false; 82 updateRenderer(); 83 } 90 ASSERT(isMainThread()); 84 91 85 void AudioTrackPrivateMediaStream::setMuted(bool muted) 86 { 87 m_muted = muted; 88 updateRenderer(); 92 if (!m_isPlaying) 93 return; 94 95 m_isPlaying = false; 96 m_autoPlay = false; 97 98 m_renderer->stop(); 89 99 } 90 100 … … 92 102 { 93 103 m_renderer->setVolume(volume); 94 updateRenderer();95 104 } 96 105 … … 101 110 102 111 // May get called on a background thread. 103 void AudioTrackPrivateMediaStream::audioSamplesAvailable( const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount)112 void AudioTrackPrivateMediaStream::audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime& sampleTime, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t sampleCount) 104 113 { 114 if (!m_isPlaying) { 115 m_renderer->stop(); 116 return; 117 } 118 105 119 m_renderer->pushSamples(sampleTime, audioData, description, sampleCount); 120 121 if (m_autoPlay && !m_hasStartedAutoplay) { 122 m_hasStartedAutoplay = true; 123 callOnMainThread([this, protectedThis = makeRef(*this)] { 124 if (m_autoPlay) 125 playInternal(); 126 }); 127 } 106 128 } 107 129 108 130 void AudioTrackPrivateMediaStream::trackMutedChanged(MediaStreamTrackPrivate&) 109 131 { 110 updateRenderer ();132 updateRendererMutedState(); 111 133 } 112 134 113 135 void AudioTrackPrivateMediaStream::trackEnabledChanged(MediaStreamTrackPrivate&) 114 136 { 115 updateRenderer(); 137 updateRendererMutedState(); 138 } 139 140 void AudioTrackPrivateMediaStream::updateRendererMutedState() 141 { 142 if (streamTrack().muted() || streamTrack().ended() || !streamTrack().enabled()) { 143 pause(); 144 return; 145 } 146 play(); 116 147 } 117 148 118 149 void AudioTrackPrivateMediaStream::trackEnded(MediaStreamTrackPrivate&) 119 150 { 120 updateRenderer(); 121 } 122 123 void AudioTrackPrivateMediaStream::updateRenderer() 124 { 125 if (!m_shouldPlay || !volume() || m_muted || streamTrack().muted() || streamTrack().ended() || !streamTrack().enabled()) { 126 stopRenderer(); 127 return; 128 } 129 startRenderer(); 130 } 131 132 void AudioTrackPrivateMediaStream::startRenderer() 133 { 134 ASSERT(isMainThread()); 135 if (m_isPlaying) 136 return; 137 138 m_isPlaying = true; 139 m_audioSource->addAudioSampleObserver(*this); 140 m_renderer->start(); 141 } 142 143 void AudioTrackPrivateMediaStream::stopRenderer() 144 { 145 ASSERT(isMainThread()); 146 if (!m_isPlaying) 147 return; 148 149 m_isPlaying = false; 150 m_audioSource->removeAudioSampleObserver(*this); 151 m_renderer->stop(); 151 pause(); 152 152 } 153 153 -
trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.h
r259816 r259824 35 35 class AudioMediaStreamTrackRenderer; 36 36 37 class AudioTrackPrivateMediaStream final 38 : public AudioTrackPrivate 39 , private MediaStreamTrackPrivate::Observer 40 , private RealtimeMediaSource::AudioSampleObserver { 37 class AudioTrackPrivateMediaStream final : public AudioTrackPrivate, private MediaStreamTrackPrivate::Observer { 41 38 WTF_MAKE_NONCOPYABLE(AudioTrackPrivateMediaStream) 42 39 public: … … 51 48 MediaStreamTrackPrivate& streamTrack() { return m_streamTrack.get(); } 52 49 50 MediaTime timelineOffset() const { return m_timelineOffset; } 51 void setTimelineOffset(const MediaTime& offset) { m_timelineOffset = offset; } 52 53 53 void clear(); 54 54 … … 60 60 float volume() const; 61 61 62 void setMuted(bool );62 void setMuted(bool muted) { m_muted = muted; } 63 63 bool muted() const { return m_muted; } 64 64 … … 78 78 79 79 // MediaStreamTrackPrivate::Observer 80 void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 80 81 void trackEnded(MediaStreamTrackPrivate&) final; 81 82 void trackMutedChanged(MediaStreamTrackPrivate&) final; … … 83 84 void trackSettingsChanged(MediaStreamTrackPrivate&) final { } 84 85 85 // RealtimeMediaSource::AudioSampleObserver 86 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 87 88 void startRenderer(); 89 void stopRenderer(); 90 void updateRenderer(); 86 void playInternal(); 87 void updateRendererMutedState(); 91 88 92 89 // Main thread writable members 93 90 bool m_isPlaying { false }; 94 bool m_ shouldPlay { false };91 bool m_autoPlay { false }; 95 92 bool m_muted { false }; 96 93 bool m_isCleared { false }; 97 94 98 95 Ref<MediaStreamTrackPrivate> m_streamTrack; 99 Ref<RealtimeMediaSource> m_audioSource;100 96 AtomString m_id; 101 97 AtomString m_label; 102 98 int m_index { 0 }; 99 MediaTime m_timelineOffset; 103 100 104 101 // Audio thread members 105 102 std::unique_ptr<AudioMediaStreamTrackRenderer> m_renderer; 103 bool m_hasStartedAutoplay { false }; 106 104 }; 107 105 -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.cpp
r259816 r259824 122 122 } 123 123 124 void MediaStreamPrivate::forEachTrack(const Function<void(MediaStreamTrackPrivate&)>& callback)125 {126 for (auto& track : m_trackSet.values())127 callback(*track);128 }129 130 124 void MediaStreamPrivate::updateActiveState(NotifyClientOption notifyClientOption) 131 125 { -
trunk/Source/WebCore/platform/mediastream/MediaStreamPrivate.h
r259816 r259824 85 85 bool hasTracks() const { return !m_trackSet.isEmpty(); } 86 86 void forEachTrack(const Function<void(const MediaStreamTrackPrivate&)>&) const; 87 void forEachTrack(const Function<void(MediaStreamTrackPrivate&)>&);88 87 MediaStreamTrackPrivate* activeVideoTrack() { return m_activeVideoTrack; } 89 88 -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.cpp
r259816 r259824 79 79 } 80 80 81 void MediaStreamTrackPrivate::forEachObserver(const Function<void(Observer&)>& apply) const 82 { 83 ASSERT(isMainThread()); 84 for (auto* observer : copyToVector(m_observers)) { 81 void MediaStreamTrackPrivate::forEachObserver(const WTF::Function<void(Observer&)>& apply) const 82 { 83 Vector<Observer*> observersCopy; 84 { 85 auto locker = holdLock(m_observersLock); 86 observersCopy = copyToVector(m_observers); 87 } 88 for (auto* observer : observersCopy) { 89 auto locker = holdLock(m_observersLock); 90 // Make sure the observer has not been destroyed. 85 91 if (!m_observers.contains(observer)) 86 92 continue; … … 91 97 void MediaStreamTrackPrivate::addObserver(MediaStreamTrackPrivate::Observer& observer) 92 98 { 93 ASSERT(isMainThread());99 auto locker = holdLock(m_observersLock); 94 100 m_observers.add(&observer); 95 101 } … … 97 103 void MediaStreamTrackPrivate::removeObserver(MediaStreamTrackPrivate::Observer& observer) 98 104 { 99 ASSERT(isMainThread());105 auto locker = holdLock(m_observersLock); 100 106 m_observers.remove(&observer); 101 107 } … … 256 262 } 257 263 258 void MediaStreamTrackPrivate::hasStartedProducingAudioData() 259 { 260 if (m_haveProducedData) 261 return; 262 m_haveProducedData = true; 263 updateReadyState(); 264 // May get called on a background thread. 265 void MediaStreamTrackPrivate::audioSamplesAvailable(const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount) 266 { 267 if (!m_hasSentStartProducedData) { 268 callOnMainThread([this, weakThis = makeWeakPtr(this)] { 269 if (!weakThis) 270 return; 271 272 if (!m_haveProducedData) { 273 m_haveProducedData = true; 274 updateReadyState(); 275 } 276 m_hasSentStartProducedData = true; 277 }); 278 return; 279 } 280 281 forEachObserver([&](auto& observer) { 282 observer.audioSamplesAvailable(*this, mediaTime, data, description, sampleCount); 283 }); 264 284 } 265 285 -
trunk/Source/WebCore/platform/mediastream/MediaStreamTrackPrivate.h
r259816 r259824 63 63 virtual void sampleBufferUpdated(MediaStreamTrackPrivate&, MediaSample&) { }; 64 64 virtual void readyStateChanged(MediaStreamTrackPrivate&) { }; 65 66 // May get called on a background thread. 67 virtual void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) { }; 65 68 }; 66 69 … … 98 101 99 102 RealtimeMediaSource& source() { return m_source.get(); } 100 const RealtimeMediaSource& source() const { return m_source.get(); }101 103 WEBCORE_EXPORT RealtimeMediaSource::Type type() const; 102 104 … … 131 133 MediaStreamTrackPrivate(Ref<const Logger>&&, Ref<RealtimeMediaSource>&&, String&& id); 132 134 133 // RealtimeMediaSource ::Observer135 // RealtimeMediaSourceObserver 134 136 void sourceStarted() final; 135 137 void sourceStopped() final; … … 138 140 bool preventSourceFromStopping() final; 139 141 void videoSampleAvailable(MediaSample&) final; 142 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 140 143 void audioUnitWillStart() final; 141 void hasStartedProducingAudioData() final;142 144 143 145 void updateReadyState(); -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.cpp
r259816 r259824 61 61 } 62 62 63 void RealtimeMediaSource::addAudioSampleObserver(RealtimeMediaSource::AudioSampleObserver& observer)64 {65 ASSERT(isMainThread());66 auto locker = holdLock(m_audioSampleObserversLock);67 m_audioSampleObservers.add(&observer);68 }69 70 void RealtimeMediaSource::removeAudioSampleObserver(RealtimeMediaSource::AudioSampleObserver& observer)71 {72 ASSERT(isMainThread());73 auto locker = holdLock(m_audioSampleObserversLock);74 m_audioSampleObservers.remove(&observer);75 }76 77 63 void RealtimeMediaSource::addObserver(RealtimeMediaSource::Observer& observer) 78 64 { 79 ASSERT(isMainThread());65 auto locker = holdLock(m_observersLock); 80 66 m_observers.add(&observer); 81 67 } … … 83 69 void RealtimeMediaSource::removeObserver(RealtimeMediaSource::Observer& observer) 84 70 { 85 ASSERT(isMainThread());71 auto locker = holdLock(m_observersLock); 86 72 m_observers.remove(&observer); 87 73 if (m_observers.isEmpty()) … … 131 117 } 132 118 133 void RealtimeMediaSource::forEachObserver(const Function<void(Observer&)>& apply) const 134 { 135 ASSERT(isMainThread()); 136 for (auto* observer : copyToVector(m_observers)) { 119 void RealtimeMediaSource::forEachObserver(const WTF::Function<void(Observer&)>& apply) const 120 { 121 Vector<Observer*> observersCopy; 122 { 123 auto locker = holdLock(m_observersLock); 124 observersCopy = copyToVector(m_observers); 125 } 126 for (auto* observer : observersCopy) { 127 auto locker = holdLock(m_observersLock); 128 // Make sure the observer has not been destroyed. 137 129 if (!m_observers.contains(observer)) 138 130 continue; … … 191 183 void RealtimeMediaSource::audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames) 192 184 { 193 if (!m_hasSentStartProducedAudioData) { 194 callOnMainThread([this, weakThis = makeWeakPtr(this)] { 195 if (!weakThis) 196 return; 197 if (m_hasSentStartProducedAudioData) 198 return; 199 m_hasSentStartProducedAudioData = true; 200 forEachObserver([&](auto& observer) { 201 observer.hasStartedProducingAudioData(); 202 }); 203 }); 204 } 205 206 auto locker = holdLock(m_audioSampleObserversLock); 207 for (auto* observer : m_audioSampleObservers) 208 observer->audioSamplesAvailable(time, audioData, description, numberOfFrames); 185 forEachObserver([&](auto& observer) { 186 observer.audioSamplesAvailable(time, audioData, description, numberOfFrames); 187 }); 209 188 } 210 189 -
trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h
r259816 r259824 70 70 class WEBCORE_EXPORT RealtimeMediaSource 71 71 : public ThreadSafeRefCounted<RealtimeMediaSource, WTF::DestructionThread::MainRunLoop> 72 , public CanMakeWeakPtr<RealtimeMediaSource , WeakPtrFactoryInitialization::Eager>72 , public CanMakeWeakPtr<RealtimeMediaSource> 73 73 #if !RELEASE_LOG_DISABLED 74 74 , protected LoggerHelper … … 93 93 virtual void videoSampleAvailable(MediaSample&) { } 94 94 95 virtual void hasStartedProducingAudioData() { }96 };97 class AudioSampleObserver {98 public:99 virtual ~AudioSampleObserver() = default;100 101 95 // May be called on a background thread. 102 virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) = 0;96 virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t /*numberOfFrames*/) { } 103 97 }; 104 98 … … 137 131 WEBCORE_EXPORT void addObserver(Observer&); 138 132 WEBCORE_EXPORT void removeObserver(Observer&); 139 140 WEBCORE_EXPORT void addAudioSampleObserver(AudioSampleObserver&);141 WEBCORE_EXPORT void removeAudioSampleObserver(AudioSampleObserver&);142 133 143 134 const IntSize size() const; … … 263 254 Type m_type; 264 255 String m_name; 256 mutable RecursiveLock m_observersLock; 265 257 HashSet<Observer*> m_observers; 266 267 mutable RecursiveLock m_audioSampleObserversLock;268 HashSet<AudioSampleObserver*> m_audioSampleObservers;269 270 258 IntSize m_size; 271 259 IntSize m_intrinsicSize; … … 285 273 bool m_captureDidFailed { false }; 286 274 bool m_isEnded { false }; 287 bool m_hasSentStartProducedAudioData { false };288 275 }; 289 276 -
trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.cpp
r259816 r259824 46 46 RealtimeOutgoingAudioSource::~RealtimeOutgoingAudioSource() 47 47 { 48 ASSERT(!m_audioSource->hasObserver(*this));48 ASSERT(!m_audioSource->hasObserver(*this)); 49 49 #if ASSERT_ENABLED 50 50 auto locker = holdLock(m_sinksLock); … … 59 59 ASSERT(!m_audioSource->hasObserver(*this)); 60 60 m_audioSource->addObserver(*this); 61 m_audioSource->source().addAudioSampleObserver(*this);62 61 initializeConverter(); 63 62 } … … 65 64 void RealtimeOutgoingAudioSource::unobserveSource() 66 65 { 67 m_audioSource->source().removeAudioSampleObserver(*this);68 66 m_audioSource->removeObserver(*this); 69 67 } -
trunk/Source/WebCore/platform/mediastream/RealtimeOutgoingAudioSource.h
r259816 r259824 56 56 , public webrtc::AudioSourceInterface 57 57 , private MediaStreamTrackPrivate::Observer 58 , private RealtimeMediaSource::AudioSampleObserver59 58 #if !RELEASE_LOG_DISABLED 60 59 , private LoggerHelper … … 110 109 void sourceMutedChanged(); 111 110 void sourceEnabledChanged(); 111 virtual void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) { }; 112 112 113 113 virtual bool isReachingBufferedAudioDataHighLimit() { return false; }; … … 119 119 void trackMutedChanged(MediaStreamTrackPrivate&) final { sourceMutedChanged(); } 120 120 void trackEnabledChanged(MediaStreamTrackPrivate&) final { sourceEnabledChanged(); } 121 void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime& mediaTime, const PlatformAudioData& data, const AudioStreamDescription& description, size_t sampleCount) { audioSamplesAvailable(mediaTime, data, description, sampleCount); } 121 122 void trackEnded(MediaStreamTrackPrivate&) final { } 122 123 void trackSettingsChanged(MediaStreamTrackPrivate&) final { } -
trunk/Source/WebCore/platform/mediastream/WebAudioSourceProvider.h
r259816 r259824 33 33 namespace WebCore { 34 34 35 class WebAudioSourceProvider : public ThreadSafeRefCounted<WebAudioSourceProvider , WTF::DestructionThread::Main>, public AudioSourceProvider {35 class WebAudioSourceProvider : public ThreadSafeRefCounted<WebAudioSourceProvider>, public AudioSourceProvider { 36 36 }; 37 37 -
trunk/Source/WebCore/platform/mediastream/gstreamer/GStreamerMediaStreamSource.cpp
r259816 r259824 107 107 108 108 class WebKitMediaStreamTrackObserver 109 : public MediaStreamTrackPrivate::Observer 110 , public RealtimeMediaSource::AudioSampleObserver { 109 : public MediaStreamTrackPrivate::Observer { 111 110 WTF_MAKE_FAST_ALLOCATED; 112 111 public: … … 133 132 } 134 133 135 void audioSamplesAvailable( const MediaTime&, const PlatformAudioData& audioData, const AudioStreamDescription&, size_t) final134 void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData& audioData, const AudioStreamDescription&, size_t) final 136 135 { 137 136 auto audiodata = static_cast<const GStreamerAudioData&>(audioData); … … 377 376 GST_OBJECT_LOCK(self); 378 377 if (self->stream) { 379 for (auto& track : self->stream->tracks()) { 380 track->source().removeAudioSampleObserver(*self->mediaStreamTrackObserver.get()); 378 for (auto& track : self->stream->tracks()) 381 379 track->removeObserver(*self->mediaStreamTrackObserver.get()); 382 } 380 383 381 self->stream->removeObserver(*self->mediaStreamObserver); 384 382 self->stream = nullptr; … … 399 397 GST_OBJECT_LOCK(self); 400 398 if (self->stream) { 401 for (auto& track : self->stream->tracks()) { 402 track->source().removeAudioSampleObserver(*self->mediaStreamTrackObserver.get()); 399 for (auto& track : self->stream->tracks()) 403 400 track->removeObserver(*self->mediaStreamTrackObserver.get()); 404 } 405 } else if (self->track) { 406 self->track->source().removeAudioSampleObserver(*self->mediaStreamTrackObserver.get()); 401 } else if (self->track) 407 402 self->track->removeObserver(*self->mediaStreamTrackObserver.get()); 408 }409 403 GST_OBJECT_UNLOCK(self); 410 404 } … … 550 544 webkitMediaStreamSrcAddPad(self, pad.get(), pad_template); 551 545 552 if (observe_track) {546 if (observe_track) 553 547 track->addObserver(*self->mediaStreamTrackObserver.get()); 554 track->source().addAudioSampleObserver(*self->mediaStreamTrackObserver.get()); 555 } 548 556 549 gst_element_sync_state_with_parent(element); 557 550 return TRUE; -
trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.h
r259816 r259824 47 47 class CAAudioStreamDescription; 48 48 49 class WEBCORE_EXPORT WebAudioSourceProviderAVFObjC final 50 : public WebAudioSourceProvider 51 , MediaStreamTrackPrivate::Observer 52 , RealtimeMediaSource::AudioSampleObserver { 49 class WEBCORE_EXPORT WebAudioSourceProviderAVFObjC final : public WebAudioSourceProvider, MediaStreamTrackPrivate::Observer { 53 50 public: 54 51 static Ref<WebAudioSourceProviderAVFObjC> create(MediaStreamTrackPrivate&); … … 66 63 67 64 // MediaStreamTrackPrivate::Observer 65 void audioSamplesAvailable(MediaStreamTrackPrivate&, const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 68 66 void trackEnded(MediaStreamTrackPrivate&) final { } 69 67 void trackMutedChanged(MediaStreamTrackPrivate&) final { } 70 68 void trackSettingsChanged(MediaStreamTrackPrivate&) final { } 71 void trackEnabledChanged(MediaStreamTrackPrivate&) final; 72 73 // RealtimeMediaSource::AudioSampleObserver 74 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 69 void trackEnabledChanged(MediaStreamTrackPrivate&) final { } 75 70 76 71 size_t m_listBufferSize { 0 }; … … 83 78 AudioSourceProviderClient* m_client { nullptr }; 84 79 MediaStreamTrackPrivate* m_captureSource { nullptr }; 85 Ref<RealtimeMediaSource> m_source;86 80 Lock m_mutex; 87 81 bool m_connected { false }; 88 bool m_enabled { true };89 82 }; 90 83 -
trunk/Source/WebCore/platform/mediastream/mac/WebAudioSourceProviderAVFObjC.mm
r259816 r259824 55 55 WebAudioSourceProviderAVFObjC::WebAudioSourceProviderAVFObjC(MediaStreamTrackPrivate& source) 56 56 : m_captureSource(&source) 57 , m_source(source.source())58 , m_enabled(source.enabled())59 57 { 60 m_source->addAudioSampleObserver(*this);61 58 } 62 59 63 60 WebAudioSourceProviderAVFObjC::~WebAudioSourceProviderAVFObjC() 64 61 { 65 m_source->removeAudioSampleObserver(*this);66 67 62 auto locker = holdLock(m_mutex); 68 63 … … 171 166 } 172 167 173 void WebAudioSourceProviderAVFObjC::trackEnabledChanged(MediaStreamTrackPrivate& track) 168 // May get called on a background thread. 169 void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(MediaStreamTrackPrivate& track, const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription& description, size_t frameCount) 174 170 { 175 m_enabled = track.enabled(); 176 } 177 178 // May get called on a background thread. 179 void WebAudioSourceProviderAVFObjC::audioSamplesAvailable(const MediaTime&, const PlatformAudioData& data, const AudioStreamDescription& description, size_t frameCount) 180 { 181 if (!m_enabled || !m_connected) 171 if (!track.enabled()) 182 172 return; 183 173 -
trunk/Source/WebCore/testing/Internals.cpp
r259816 r259824 467 467 { 468 468 #if ENABLE(MEDIA_STREAM) 469 if (m_trackSource) { 470 m_trackSource->removeObserver(*this); 471 m_trackSource->removeAudioSampleObserver(*this); 472 } 469 if (m_track) 470 m_track->source().removeObserver(*this); 473 471 #endif 474 472 } … … 1642 1640 } 1643 1641 1644 static std::unique_ptr<MediaRecorderPrivate> createRecorderMockSource( MediaStreamPrivate& stream)1645 { 1646 return std::unique_ptr<MediaRecorderPrivateMock>(new MediaRecorderPrivateMock (stream));1642 static std::unique_ptr<MediaRecorderPrivate> createRecorderMockSource() 1643 { 1644 return std::unique_ptr<MediaRecorderPrivateMock>(new MediaRecorderPrivateMock); 1647 1645 } 1648 1646 … … 4928 4926 void Internals::observeMediaStreamTrack(MediaStreamTrack& track) 4929 4927 { 4930 m_trackSource = &track.source(); 4931 m_trackSource->addObserver(*this); 4932 m_trackSource->addAudioSampleObserver(*this); 4928 m_track = &track; 4929 m_track->source().addObserver(*this); 4933 4930 } 4934 4931 … … 4944 4941 return; 4945 4942 4946 auto& videoSettings = m_track Source->settings();4943 auto& videoSettings = m_track->source().settings(); 4947 4944 if (!videoSettings.width() || !videoSettings.height()) 4948 4945 return; -
trunk/Source/WebCore/testing/Internals.h
r259816 r259824 124 124 #if ENABLE(MEDIA_STREAM) 125 125 , private RealtimeMediaSource::Observer 126 , private RealtimeMediaSource::AudioSampleObserver127 126 #endif 128 127 { … … 971 970 ExceptionOr<RenderedDocumentMarker*> markerAt(Node&, const String& markerType, unsigned index); 972 971 972 // RealtimeMediaSource::Observer API 973 973 #if ENABLE(MEDIA_STREAM) 974 // RealtimeMediaSource::Observer API975 974 void videoSampleAvailable(MediaSample&) final; 976 // RealtimeMediaSource::AudioSampleObserver API977 975 void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final { m_trackAudioSampleCount++; } 978 976 … … 980 978 unsigned long m_trackVideoSampleCount { 0 }; 981 979 unsigned long m_trackAudioSampleCount { 0 }; 982 RefPtr< RealtimeMediaSource> m_trackSource;980 RefPtr<MediaStreamTrack> m_track; 983 981 std::unique_ptr<TrackFramePromise> m_nextTrackFramePromise; 984 982 #endif -
trunk/Source/WebKit/ChangeLog
r259820 r259824 1 2020-04-09 Jacob Uphoff <jacob_uphoff@apple.com> 2 3 Unreviewed, reverting r259816. 4 5 This commit broke the webkit build for macOS and iOS 6 7 Reverted changeset: 8 9 "Introduce a RealtimeMediaSource observer dedicated to 10 receiving audio samples" 11 https://bugs.webkit.org/show_bug.cgi?id=210180 12 https://trac.webkit.org/changeset/259816 13 1 14 2020-04-09 Simon Fraser <simon.fraser@apple.com> 2 15 -
trunk/Source/WebKit/UIProcess/Cocoa/UserMediaCaptureManagerProxy.cpp
r259816 r259824 51 51 class UserMediaCaptureManagerProxy::SourceProxy 52 52 : public RealtimeMediaSource::Observer 53 , public RealtimeMediaSource::AudioSampleObserver54 53 , public SharedRingBufferStorage::Client { 55 54 WTF_MAKE_FAST_ALLOCATED; … … 62 61 { 63 62 m_source->addObserver(*this); 64 m_source->addAudioSampleObserver(*this);65 63 } 66 64 … … 68 66 { 69 67 storage().invalidate(); 70 m_source->removeAudioSampleObserver(*this);71 68 m_source->removeObserver(*this); 72 69 } -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp
r259816 r259824 44 44 using namespace WebCore; 45 45 46 MediaRecorderPrivate::MediaRecorderPrivate( MediaStreamPrivate& stream)46 MediaRecorderPrivate::MediaRecorderPrivate(const MediaStreamPrivate& stream) 47 47 : m_identifier(MediaRecorderIdentifier::generate()) 48 48 , m_connection(WebProcess::singleton().ensureGPUProcessConnection().connection()) … … 65 65 } 66 66 67 m_connection->sendWithAsyncReply(Messages::RemoteMediaRecorderManager::CreateRecorder { m_identifier, !!selectedTracks.audioTrack, width, height }, [this, weakThis = makeWeakPtr(this) , audioTrack = makeRefPtr(selectedTracks.audioTrack)](auto&& exception) {68 if (!weakThis )67 m_connection->sendWithAsyncReply(Messages::RemoteMediaRecorderManager::CreateRecorder { m_identifier, !!selectedTracks.audioTrack, width, height }, [this, weakThis = makeWeakPtr(this)](auto&& exception) { 68 if (!weakThis || !exception) 69 69 return; 70 if (exception) 71 return m_errorCallback(Exception { exception->code, WTFMove(exception->message) }); 72 if (audioTrack) 73 setAudioSource(&audioTrack->source()); 70 m_errorCallback(Exception { exception->code, WTFMove(exception->message) }); 74 71 }, 0); 75 72 } … … 77 74 MediaRecorderPrivate::~MediaRecorderPrivate() 78 75 { 79 setAudioSource(nullptr);80 76 m_connection->send(Messages::RemoteMediaRecorderManager::ReleaseRecorder { m_identifier }, 0); 81 77 } … … 93 89 } 94 90 95 void MediaRecorderPrivate::audioSamplesAvailable(const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames)91 void MediaRecorderPrivate::audioSamplesAvailable(const WebCore::MediaStreamTrackPrivate& track, const MediaTime& time, const PlatformAudioData& audioData, const AudioStreamDescription& description, size_t numberOfFrames) 96 92 { 93 if (track.id() != m_recordedAudioTrackID) 94 return; 95 97 96 if (m_description != description) { 98 97 ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType); … … 132 131 void MediaRecorderPrivate::stopRecording() 133 132 { 134 setAudioSource(nullptr);135 133 m_connection->send(Messages::RemoteMediaRecorder::StopRecording { }, m_identifier); 136 134 } -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.h
r259816 r259824 45 45 namespace WebKit { 46 46 47 class MediaRecorderPrivate final 48 : public WebCore::MediaRecorderPrivate 49 , public SharedRingBufferStorage::Client 50 , public CanMakeWeakPtr<MediaRecorderPrivate> { 47 class MediaRecorderPrivate final : public WebCore::MediaRecorderPrivate, public SharedRingBufferStorage::Client, public CanMakeWeakPtr<MediaRecorderPrivate> { 51 48 WTF_MAKE_FAST_ALLOCATED; 52 49 public: 53 explicit MediaRecorderPrivate( WebCore::MediaStreamPrivate&);50 explicit MediaRecorderPrivate(const WebCore::MediaStreamPrivate&); 54 51 ~MediaRecorderPrivate(); 55 52 … … 57 54 // WebCore::MediaRecorderPrivate 58 55 void sampleBufferUpdated(const WebCore::MediaStreamTrackPrivate&, WebCore::MediaSample&) final; 56 void audioSamplesAvailable(const WebCore::MediaStreamTrackPrivate&, const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t) final; 59 57 void fetchData(CompletionHandler<void(RefPtr<WebCore::SharedBuffer>&&, const String& mimeType)>&&) final; 60 58 void stopRecording() final; 61 void audioSamplesAvailable(const WTF::MediaTime&, const WebCore::PlatformAudioData&, const WebCore::AudioStreamDescription&, size_t) final;62 59 63 60 // SharedRingBufferStorage::Client -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.cpp
r259816 r259824 35 35 using namespace WebCore; 36 36 37 std::unique_ptr<WebCore::MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate( MediaStreamPrivate& stream)37 std::unique_ptr<WebCore::MediaRecorderPrivate> MediaRecorderProvider::createMediaRecorderPrivate(const MediaStreamPrivate& stream) 38 38 { 39 39 #if ENABLE(GPU_PROCESS) -
trunk/Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderProvider.h
r259816 r259824 36 36 private: 37 37 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 38 std::unique_ptr<WebCore::MediaRecorderPrivate> createMediaRecorderPrivate( WebCore::MediaStreamPrivate&) final;38 std::unique_ptr<WebCore::MediaRecorderPrivate> createMediaRecorderPrivate(const WebCore::MediaStreamPrivate&) final; 39 39 #endif 40 40 };
Note:
See TracChangeset
for help on using the changeset viewer.