Changeset 285027 in webkit
- Timestamp:
- Oct 29, 2021 6:36:03 AM (9 months ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 2 added
- 22 edited
- 1 copied
-
ChangeLog (modified) (1 diff)
-
Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp (modified) (2 diffs)
-
Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp (modified) (3 diffs)
-
Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h (modified) (2 diffs)
-
SourcesCocoa.txt (modified) (1 diff)
-
WebCore.xcodeproj/project.pbxproj (modified) (4 diffs)
-
loader/EmptyClients.cpp (modified) (1 diff)
-
platform/audio/cocoa/AudioSampleDataSource.h (modified) (3 diffs)
-
platform/audio/cocoa/AudioSampleDataSource.mm (modified) (2 diffs)
-
platform/mediastream/AudioMediaStreamTrackRenderer.cpp (modified) (2 diffs)
-
platform/mediastream/AudioMediaStreamTrackRenderer.h (modified) (5 diffs)
-
platform/mediastream/AudioTrackPrivateMediaStream.cpp (modified) (2 diffs)
-
platform/mediastream/RealtimeIncomingAudioSource.cpp (modified) (2 diffs)
-
platform/mediastream/RealtimeIncomingAudioSource.h (modified) (3 diffs)
-
platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp (modified) (6 diffs)
-
platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h (modified) (3 diffs)
-
platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h (modified) (3 diffs)
-
platform/mediastream/cocoa/BaseAudioMediaStreamTrackRendererUnit.h (copied) (copied from trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.cpp) (2 diffs)
-
platform/mediastream/cocoa/IncomingAudioMediaStreamTrackRendererUnit.cpp (added)
-
platform/mediastream/cocoa/IncomingAudioMediaStreamTrackRendererUnit.h (added)
-
platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp (modified) (4 diffs)
-
platform/mediastream/libwebrtc/LibWebRTCAudioModule.h (modified) (3 diffs)
-
platform/mediastream/libwebrtc/LibWebRTCProvider.cpp (modified) (2 diffs)
-
platform/mediastream/libwebrtc/LibWebRTCProvider.h (modified) (6 diffs)
-
platform/mediastream/mac/RealtimeIncomingAudioSourceCocoa.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r285024 r285027 1 2021-10-29 Youenn Fablet <youenn@apple.com> 2 3 Ensure synchronized rendering of incoming audio tracks 4 https://bugs.webkit.org/show_bug.cgi?id=232375 5 6 Reviewed by Eric Carlson. 7 8 WebRTC incoming audio tracks are guaranteed to be synchronized based on the audio module clock. 9 Previously, we were mixing all audio tracks together, but we were not handling synchronization of tracks that have the same clock. 10 This can cause some lower quality audio rendering. 11 To prevent this, all WebRTC incoming audio tracks are now mixed together in a single track that is then mixed with all other non synchronized tracks. 12 To do so we introduce IncomingAudioMediaStreamTrackRendererUnit which will receive all incoming audio tracks. 13 It then sends the mix to the actual AudioMediaStreamTrackRendererUnit. 14 To ensure tight synchronization, we introduce AudioSampleDataSource::pullAvailableSampleChunk which reads data using the provided timestamp relative to the input offset. 15 We do a refactoring to make it easy to either use IncomingAudioMediaStreamTrackRendererUnit or AudioMediaStreamTrackRendererUnit by having a base class called BaseAudioMediaStreamTrackRendererUnit. 16 17 Manually tested. 18 19 * Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp: 20 * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp: 21 * Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h: 22 * SourcesCocoa.txt: 23 * WebCore.xcodeproj/project.pbxproj: 24 * loader/EmptyClients.cpp: 25 * platform/audio/cocoa/AudioSampleDataSource.h: 26 * platform/audio/cocoa/AudioSampleDataSource.mm: 27 * platform/mediastream/AudioMediaStreamTrackRenderer.cpp: 28 * platform/mediastream/AudioMediaStreamTrackRenderer.h: 29 * platform/mediastream/AudioTrackPrivateMediaStream.cpp: 30 * platform/mediastream/RealtimeIncomingAudioSource.cpp: 31 * platform/mediastream/RealtimeIncomingAudioSource.h: 32 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp: 33 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h: 34 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: 35 * platform/mediastream/cocoa/BaseAudioMediaStreamTrackRendererUnit.h: Added. 36 * platform/mediastream/cocoa/IncomingAudioMediaStreamTrackRendererUnit.cpp: Added. 37 * platform/mediastream/cocoa/IncomingAudioMediaStreamTrackRendererUnit.h: Added. 38 * platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp: 39 * platform/mediastream/libwebrtc/LibWebRTCAudioModule.h: 40 * platform/mediastream/libwebrtc/LibWebRTCProvider.cpp: 41 * platform/mediastream/libwebrtc/LibWebRTCProvider.h: 42 * platform/mediastream/mac/RealtimeIncomingAudioSourceCocoa.cpp: 43 1 44 2021-10-29 Youenn Fablet <youenn@apple.com> 2 45 -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCPeerConnectionBackend.cpp
r284857 r285027 30 30 #include "Document.h" 31 31 #include "IceCandidate.h" 32 #include "LibWebRTCAudioModule.h" 32 33 #include "LibWebRTCDataChannelHandler.h" 33 34 #include "LibWebRTCMediaEndpoint.h" 35 #include "LibWebRTCProvider.h" 34 36 #include "LibWebRTCRtpReceiverBackend.h" 35 37 #include "LibWebRTCRtpSenderBackend.h" … … 294 296 auto& document = downcast<Document>(*m_peerConnection.scriptExecutionContext()); 295 297 296 auto source = backend->createSource(); 298 auto source = backend->createSource(document); 299 297 300 // Remote source is initially muted and will be unmuted when receiving the first packet. 298 301 source->setMuted(true); -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.cpp
r281225 r285027 26 26 #include "LibWebRTCRtpReceiverBackend.h" 27 27 28 #include "Document.h" 29 #include "LibWebRTCAudioModule.h" 28 30 #include "LibWebRTCDtlsTransportBackend.h" 31 #include "LibWebRTCProvider.h" 29 32 #include "LibWebRTCRtpReceiverTransformBackend.h" 30 33 #include "LibWebRTCUtils.h" 34 #include "Page.h" 31 35 #include "RTCRtpTransformBackend.h" 32 36 #include "RealtimeIncomingAudioSource.h" … … 100 104 } 101 105 102 Ref<RealtimeMediaSource> LibWebRTCRtpReceiverBackend::createSource( )106 Ref<RealtimeMediaSource> LibWebRTCRtpReceiverBackend::createSource(Document& document) 103 107 { 104 108 auto rtcTrack = m_rtcReceiver->track(); … … 109 113 case cricket::MEDIA_TYPE_AUDIO: { 110 114 rtc::scoped_refptr<webrtc::AudioTrackInterface> audioTrack = static_cast<webrtc::AudioTrackInterface*>(rtcTrack.get()); 111 return RealtimeIncomingAudioSource::create(WTFMove(audioTrack), fromStdString(rtcTrack->id())); 115 auto source = RealtimeIncomingAudioSource::create(WTFMove(audioTrack), fromStdString(rtcTrack->id())); 116 if (document.page()) 117 source->setAudioModule(document.page()->libWebRTCProvider().audioModule()); 118 return source; 112 119 } 113 120 case cricket::MEDIA_TYPE_VIDEO: { -
trunk/Source/WebCore/Modules/mediastream/libwebrtc/LibWebRTCRtpReceiverBackend.h
r281225 r285027 36 36 37 37 namespace WebCore { 38 38 class Document; 39 39 class RealtimeMediaSource; 40 40 … … 47 47 webrtc::RtpReceiverInterface* rtcReceiver() { return m_rtcReceiver.get(); } 48 48 49 Ref<RealtimeMediaSource> createSource( );49 Ref<RealtimeMediaSource> createSource(Document&); 50 50 51 51 private: -
trunk/Source/WebCore/SourcesCocoa.txt
r284920 r285027 527 527 platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp 528 528 platform/mediastream/cocoa/DisplayCaptureSourceCocoa.cpp 529 platform/mediastream/cocoa/IncomingAudioMediaStreamTrackRendererUnit.cpp 529 530 platform/mediastream/ios/AVAudioSessionCaptureDevice.mm 530 531 platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm @no-unify -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r285012 r285027 1181 1181 4186BD40213EE3450001826F /* LibWebRTCRtpReceiverBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41D1A04A213EDDFE0063FB6B /* LibWebRTCRtpReceiverBackend.cpp */; }; 1182 1182 4186BD4E2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4186BD4D2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp */; }; 1183 41878FAD27294721002E1EDD /* BaseAudioMediaStreamTrackRendererUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 41878FA827282055002E1EDD /* BaseAudioMediaStreamTrackRendererUnit.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1183 1184 41885B9311B6FDA6003383BB /* FormSubmission.h in Headers */ = {isa = PBXBuildFile; fileRef = 41885B9111B6FDA6003383BB /* FormSubmission.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1184 1185 4188D55C26C54D6F004858C8 /* RTCDtlsTransportBackend.h in Headers */ = {isa = PBXBuildFile; fileRef = 4188D55A26C54D6F004858C8 /* RTCDtlsTransportBackend.h */; }; … … 8159 8160 4186BD4B2140A8050001826F /* LibWebRTCRtpTransceiverBackend.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = LibWebRTCRtpTransceiverBackend.h; path = libwebrtc/LibWebRTCRtpTransceiverBackend.h; sourceTree = "<group>"; }; 8160 8161 4186BD4D2140B9E80001826F /* LibWebRTCRtpTransceiverBackend.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = LibWebRTCRtpTransceiverBackend.cpp; path = libwebrtc/LibWebRTCRtpTransceiverBackend.cpp; sourceTree = "<group>"; }; 8162 41878FA827282055002E1EDD /* BaseAudioMediaStreamTrackRendererUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = BaseAudioMediaStreamTrackRendererUnit.h; sourceTree = "<group>"; }; 8163 41878FAA27282057002E1EDD /* IncomingAudioMediaStreamTrackRendererUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IncomingAudioMediaStreamTrackRendererUnit.h; sourceTree = "<group>"; }; 8164 41878FAB272934E6002E1EDD /* IncomingAudioMediaStreamTrackRendererUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = IncomingAudioMediaStreamTrackRendererUnit.cpp; sourceTree = "<group>"; }; 8161 8165 418807DF24E4558300DDAF94 /* AbortAlgorithm.idl */ = {isa = PBXFileReference; lastKnownFileType = text; path = AbortAlgorithm.idl; sourceTree = "<group>"; }; 8162 8166 418807E124E458C300DDAF94 /* AbortAlgorithm.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AbortAlgorithm.h; sourceTree = "<group>"; }; … … 20173 20177 41C3B8A02649B1B7004ED4DE /* AudioMediaStreamTrackRendererUnit.cpp */, 20174 20178 41C3B89B2649B1B6004ED4DE /* AudioMediaStreamTrackRendererUnit.h */, 20179 41878FA827282055002E1EDD /* BaseAudioMediaStreamTrackRendererUnit.h */, 20175 20180 07BB1E6E27176CCA001DF289 /* DisplayCaptureSourceCocoa.cpp */, 20176 20181 07BB1E6F27176CCA001DF289 /* DisplayCaptureSourceCocoa.h */, 20182 41878FAB272934E6002E1EDD /* IncomingAudioMediaStreamTrackRendererUnit.cpp */, 20183 41878FAA27282057002E1EDD /* IncomingAudioMediaStreamTrackRendererUnit.h */, 20177 20184 ); 20178 20185 path = cocoa; … … 31929 31936 460BB6161D0A1BF000221812 /* Base64Utilities.h in Headers */, 31930 31937 83198FBF24A160DD00420B05 /* BaseAudioContext.h in Headers */, 31938 41878FAD27294721002E1EDD /* BaseAudioMediaStreamTrackRendererUnit.h in Headers */, 31931 31939 412DEF1F23A918A300D840F6 /* BaseAudioSharedUnit.h in Headers */, 31932 31940 379E61CA126CA5C400B63E8D /* BaseButtonInputType.h in Headers */, -
trunk/Source/WebCore/loader/EmptyClients.cpp
r283179 r285027 58 58 #include "IDBConnectionToServer.h" 59 59 #include "InspectorClient.h" 60 #include "LibWebRTCAudioModule.h" 60 61 #include "LibWebRTCProvider.h" 61 62 #include "MediaRecorderPrivate.h" -
trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.h
r284862 r285027 62 62 63 63 bool pullAvailableSamplesAsChunks(AudioBufferList&, size_t frameCount, uint64_t timeStamp, Function<void()>&&); 64 bool pullAvailableSampleChunk(AudioBufferList&, size_t frameCount, uint64_t timeStamp, PullMode); 64 65 65 66 void setVolume(float volume) { m_volume = volume; } … … 70 71 71 72 const CAAudioStreamDescription* inputDescription() const { return m_inputDescription ? &m_inputDescription.value() : nullptr; } 73 const CAAudioStreamDescription* outputDescription() const { return m_outputDescription ? &m_outputDescription.value() : nullptr; } 72 74 73 75 void recomputeSampleOffset() { m_shouldComputeOutputSampleOffset = true; } … … 87 89 88 90 void pushSamplesInternal(const AudioBufferList&, const MediaTime&, size_t frameCount); 91 bool pullSamplesInternal(AudioBufferList&, size_t sampleCount, uint64_t timeStamp, PullMode); 89 92 90 93 std::optional<CAAudioStreamDescription> m_inputDescription; -
trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm
r284862 r285027 287 287 m_isFirstPull = false; 288 288 289 return pullSamplesInternal(buffer, sampleCount, timeStamp, mode); 290 } 291 292 bool AudioSampleDataSource::pullSamplesInternal(AudioBufferList& buffer, size_t sampleCount, uint64_t timeStamp, PullMode mode) 293 { 289 294 if (mode == Copy) { 290 295 m_ringBuffer->fetch(&buffer, sampleCount, timeStamp, CARingBuffer::Copy); … … 308 313 309 314 return true; 315 } 316 317 bool AudioSampleDataSource::pullAvailableSampleChunk(AudioBufferList& buffer, size_t sampleCount, uint64_t timeStamp, PullMode mode) 318 { 319 ASSERT(buffer.mNumberBuffers == m_ringBuffer->channelCount()); 320 if (buffer.mNumberBuffers != m_ringBuffer->channelCount()) 321 return false; 322 323 if (m_muted) 324 return false; 325 326 if (m_shouldComputeOutputSampleOffset) { 327 m_shouldComputeOutputSampleOffset = false; 328 m_outputSampleOffset = m_inputSampleOffset.timeValue() * m_outputDescription->sampleRate() / m_inputSampleOffset.timeScale(); 329 } 330 331 timeStamp += m_outputSampleOffset; 332 333 return pullSamplesInternal(buffer, sampleCount, timeStamp, mode); 310 334 } 311 335 -
trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.cpp
r262695 r285027 41 41 namespace WebCore { 42 42 43 AudioMediaStreamTrackRenderer::RendererCreator AudioMediaStreamTrackRenderer::m_rendererCreator = nullptr; 44 void AudioMediaStreamTrackRenderer::setCreator(RendererCreator creator) 43 std::unique_ptr<AudioMediaStreamTrackRenderer> AudioMediaStreamTrackRenderer::create(Init&& init) 45 44 { 46 m_rendererCreator = creator;47 }48 49 std::unique_ptr<AudioMediaStreamTrackRenderer> AudioMediaStreamTrackRenderer::create()50 {51 if (m_rendererCreator)52 return m_rendererCreator();53 54 45 #if PLATFORM(COCOA) 55 return makeUnique<AudioMediaStreamTrackRendererCocoa>( );46 return makeUnique<AudioMediaStreamTrackRendererCocoa>(WTFMove(init)); 56 47 #else 57 48 return nullptr; … … 59 50 } 60 51 52 AudioMediaStreamTrackRenderer::AudioMediaStreamTrackRenderer(Init&& init) 53 : m_crashCallback(WTFMove(init.crashCallback)) 54 #if USE(LIBWEBRTC) 55 , m_audioModule(WTFMove(init.audioModule)) 56 #endif 61 57 #if !RELEASE_LOG_DISABLED 62 void AudioMediaStreamTrackRenderer::setLogger(const Logger& logger, const void* identifier) 58 , m_logger(init.logger) 59 , m_logIdentifier(init.logIdentifier) 60 #endif 63 61 { 64 m_logger = &logger;65 m_logIdentifier = identifier;66 62 } 67 63 64 #if !RELEASE_LOG_DISABLED 68 65 WTFLogChannel& AudioMediaStreamTrackRenderer::logChannel() const 69 66 { -
trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h
r277364 r285027 38 38 39 39 class AudioStreamDescription; 40 class LibWebRTCAudioModule; 40 41 class PlatformAudioData; 41 42 … … 43 44 WTF_MAKE_FAST_ALLOCATED; 44 45 public: 45 static std::unique_ptr<AudioMediaStreamTrackRenderer> create(); 46 struct Init { 47 Function<void()>&& crashCallback; 48 #if USE(LIBWEBRTC) 49 RefPtr<LibWebRTCAudioModule> audioModule; 50 #endif 51 #if !RELEASE_LOG_DISABLED 52 const Logger& logger; 53 const void* logIdentifier; 54 #endif 55 }; 56 static std::unique_ptr<AudioMediaStreamTrackRenderer> create(Init&&); 46 57 virtual ~AudioMediaStreamTrackRenderer() = default; 47 58 … … 57 68 virtual void setAudioOutputDevice(const String&); 58 69 59 #if !RELEASE_LOG_DISABLED 60 void setLogger(const Logger&, const void*); 61 #endif 70 protected: 71 explicit AudioMediaStreamTrackRenderer(Init&&); 62 72 63 using RendererCreator = std::unique_ptr<AudioMediaStreamTrackRenderer> (*)();64 static void setCreator(RendererCreator);65 66 void setCrashCallback(Function<void()>&& callback) { m_crashCallback = WTFMove(callback); }67 68 protected:69 73 #if !RELEASE_LOG_DISABLED 70 74 const Logger& logger() const final; … … 75 79 #endif 76 80 81 #if USE(LIBWEBRTC) 82 LibWebRTCAudioModule* audioModule(); 83 #endif 84 77 85 void crashed(); 78 86 79 87 private: 80 static RendererCreator m_rendererCreator;81 82 88 // Main thread writable members 83 89 float m_volume { 1 }; 84 90 Function<void()> m_crashCallback; 85 91 92 #if USE(LIBWEBRTC) 93 RefPtr<LibWebRTCAudioModule> m_audioModule; 94 #endif 95 86 96 #if !RELEASE_LOG_DISABLED 87 Ref Ptr<const Logger> m_logger;97 Ref<const Logger> m_logger; 88 98 const void* m_logIdentifier; 89 99 #endif … … 106 116 } 107 117 118 #if USE(LIBWEBRTC) 119 inline LibWebRTCAudioModule* AudioMediaStreamTrackRenderer::audioModule() 120 { 121 return m_audioModule.get(); 122 } 123 #endif 124 108 125 #if !RELEASE_LOG_DISABLED 109 126 inline const Logger& AudioMediaStreamTrackRenderer::logger() const 110 127 { 111 return *m_logger;128 return m_logger.get(); 112 129 113 130 } -
trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp
r284093 r285027 30 30 31 31 #include "AudioMediaStreamTrackRenderer.h" 32 #include "LibWebRTCAudioModule.h" 32 33 #include "Logging.h" 34 #include "RealtimeIncomingAudioSource.h" 33 35 34 36 namespace WebCore { … … 49 51 } 50 52 53 #if USE(LIBWEBRTC) 54 static RefPtr<LibWebRTCAudioModule> audioModuleFromSource(RealtimeMediaSource& source) 55 { 56 if (!is<RealtimeIncomingAudioSource>(source)) 57 return nullptr; 58 return downcast<RealtimeIncomingAudioSource>(source).audioModule(); 59 } 60 #endif 61 51 62 std::unique_ptr<AudioMediaStreamTrackRenderer> AudioTrackPrivateMediaStream::createRenderer(AudioTrackPrivateMediaStream& stream) 52 63 { 53 auto renderer = AudioMediaStreamTrackRenderer::create(); 54 if (!renderer) 55 return nullptr; 64 auto& track = stream.m_streamTrack.get(); 65 return AudioMediaStreamTrackRenderer::create(AudioMediaStreamTrackRenderer::Init { 66 [stream = WeakPtr { stream }] { 67 if (stream) 68 stream->createNewRenderer(); 69 } 70 #if USE(LIBWEBRTC) 71 , audioModuleFromSource(stream.m_audioSource.get()) 72 #endif 56 73 #if !RELEASE_LOG_DISABLED 57 auto& track = stream.m_streamTrack.get();58 renderer->setLogger(track.logger(), track.logIdentifier());74 , track.logger() 75 , track.logIdentifier() 59 76 #endif 60 renderer->setCrashCallback([stream = WeakPtr { stream }] {61 if (stream)62 stream->createNewRenderer();63 77 }); 64 return renderer;65 78 } 66 79 -
trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.cpp
r282755 r285027 35 35 36 36 #include "LibWebRTCAudioFormat.h" 37 #include "LibWebRTCAudioModule.h" 37 38 #include "Logging.h" 38 39 … … 81 82 } 82 83 84 void RealtimeIncomingAudioSource::setAudioModule(RefPtr<LibWebRTCAudioModule>&& audioModule) 85 { 86 ASSERT(!m_audioModule); 87 m_audioModule = WTFMove(audioModule); 88 } 89 83 90 } 84 91 -
trunk/Source/WebCore/platform/mediastream/RealtimeIncomingAudioSource.h
r276633 r285027 46 46 namespace WebCore { 47 47 48 class LibWebRTCAudioModule; 49 48 50 class RealtimeIncomingAudioSource 49 51 : public RealtimeMediaSource … … 53 55 public: 54 56 static Ref<RealtimeIncomingAudioSource> create(rtc::scoped_refptr<webrtc::AudioTrackInterface>&&, String&&); 57 58 void setAudioModule(RefPtr<LibWebRTCAudioModule>&&); 59 LibWebRTCAudioModule* audioModule() { return m_audioModule.get(); } 55 60 56 61 protected: … … 80 85 RealtimeMediaSourceSettings m_currentSettings; 81 86 rtc::scoped_refptr<webrtc::AudioTrackInterface> m_audioTrack; 87 RefPtr<LibWebRTCAudioModule> m_audioModule; 82 88 83 89 #if !RELEASE_LOG_DISABLED -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp
r285024 r285027 37 37 namespace WebCore { 38 38 39 AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() 40 : m_resetObserver([this] { reset(); }) 39 AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa(Init&& init) 40 : AudioMediaStreamTrackRenderer(WTFMove(init)) 41 , m_resetObserver([this] { reset(); }) 41 42 { 42 43 } … … 60 61 } 61 62 63 BaseAudioMediaStreamTrackRendererUnit& AudioMediaStreamTrackRendererCocoa::rendererUnit() 64 { 65 if (auto* audioModule = this->audioModule()) 66 return audioModule->incomingAudioMediaStreamTrackRendererUnit(); 67 return AudioMediaStreamTrackRendererUnit::singleton(); 68 } 69 62 70 void AudioMediaStreamTrackRendererCocoa::stop() 63 71 { … … 65 73 66 74 if (m_registeredDataSource) 67 AudioMediaStreamTrackRendererUnit::singleton().removeSource(*m_registeredDataSource);75 rendererUnit().removeSource(*m_registeredDataSource); 68 76 } 69 77 … … 96 104 { 97 105 // FIXME: We should create a unit for ourselves here or use the default unit if deviceId is matching. 98 AudioMediaStreamTrackRendererUnit::singleton().setAudioOutputDevice(deviceId);106 rendererUnit().setAudioOutputDevice(deviceId); 99 107 m_shouldRecreateDataSource = true; 100 108 } … … 105 113 106 114 if (m_registeredDataSource) 107 AudioMediaStreamTrackRendererUnit::singleton().removeSource(*m_registeredDataSource);115 rendererUnit().removeSource(*m_registeredDataSource); 108 116 109 117 if (!m_outputDescription) … … 116 124 m_registeredDataSource->setLogger(logger(), logIdentifier()); 117 125 m_registeredDataSource->setVolume(volume()); 118 AudioMediaStreamTrackRendererUnit::singleton().addResetObserver(m_resetObserver);119 AudioMediaStreamTrackRendererUnit::singleton().addSource(*m_registeredDataSource);126 rendererUnit().addResetObserver(m_resetObserver); 127 rendererUnit().addSource(*m_registeredDataSource); 120 128 } 121 129 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h
r285024 r285027 40 40 class AudioSampleDataSource; 41 41 class AudioSampleBufferList; 42 class BaseAudioMediaStreamTrackRendererUnit; 42 43 class CAAudioStreamDescription; 43 44 … … 45 46 WTF_MAKE_FAST_ALLOCATED; 46 47 public: 47 AudioMediaStreamTrackRendererCocoa( );48 AudioMediaStreamTrackRendererCocoa(Init&&); 48 49 ~AudioMediaStreamTrackRendererCocoa(); 49 50 … … 60 61 void setRegisteredDataSource(RefPtr<AudioSampleDataSource>&&); 61 62 63 BaseAudioMediaStreamTrackRendererUnit& rendererUnit(); 64 62 65 std::unique_ptr<CAAudioStreamDescription> m_outputDescription; 63 66 RefPtr<AudioSampleDataSource> m_dataSource; // Used in background thread. -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h
r284674 r285027 29 29 30 30 #include "AudioMediaStreamTrackRendererInternalUnit.h" 31 #include <wtf/Forward.h>31 #include "BaseAudioMediaStreamTrackRendererUnit.h" 32 32 #include <wtf/HashSet.h> 33 33 #include <wtf/Lock.h> 34 #include <wtf/Observer.h>35 34 #include <wtf/UniqueRef.h> 36 35 #include <wtf/Vector.h> … … 44 43 class AudioMediaStreamTrackRendererInternalUnit; 45 44 46 class AudioMediaStreamTrackRendererUnit {45 class AudioMediaStreamTrackRendererUnit : public BaseAudioMediaStreamTrackRendererUnit { 47 46 public: 48 47 WEBCORE_EXPORT static AudioMediaStreamTrackRendererUnit& singleton(); … … 57 56 void reset(); 58 57 59 void setAudioOutputDevice(const String&);58 void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&); 60 59 61 void addSource(Ref<AudioSampleDataSource>&&); 62 void removeSource(AudioSampleDataSource&); 63 64 using ResetObserver = Observer<void()>; 65 void addResetObserver(ResetObserver& observer) { m_resetObservers.add(observer); } 66 void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&); 60 // BaseAudioMediaStreamTrackRendererUnit 61 void setAudioOutputDevice(const String&) final; 62 void addSource(Ref<AudioSampleDataSource>&&) final; 63 void removeSource(AudioSampleDataSource&) final; 64 void addResetObserver(ResetObserver& observer) final { m_resetObservers.add(observer); } 67 65 68 66 private: -
trunk/Source/WebCore/platform/mediastream/cocoa/BaseAudioMediaStreamTrackRendererUnit.h
r285026 r285027 1 1 /* 2 * Copyright (C) 202 0Apple Inc. All rights reserved.2 * Copyright (C) 2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 24 24 */ 25 25 26 #include "config.h" 27 #include "AudioMediaStreamTrackRenderer.h" 26 #pragma once 28 27 29 28 #if ENABLE(MEDIA_STREAM) 30 29 31 #include "Logging.h" 32 33 #if PLATFORM(COCOA) 34 #include "AudioMediaStreamTrackRendererCocoa.h" 35 #endif 36 37 namespace WTF { 38 class MediaTime; 39 } 30 #include <wtf/Forward.h> 31 #include <wtf/Observer.h> 40 32 41 33 namespace WebCore { 42 34 43 AudioMediaStreamTrackRenderer::RendererCreator AudioMediaStreamTrackRenderer::m_rendererCreator = nullptr; 44 void AudioMediaStreamTrackRenderer::setCreator(RendererCreator creator) 45 { 46 m_rendererCreator = creator; 47 } 35 class AudioSampleDataSource; 48 36 49 std::unique_ptr<AudioMediaStreamTrackRenderer> AudioMediaStreamTrackRenderer::create() 50 { 51 if (m_rendererCreator) 52 return m_rendererCreator(); 37 class BaseAudioMediaStreamTrackRendererUnit { 38 public: 39 virtual ~BaseAudioMediaStreamTrackRendererUnit() = default; 53 40 54 #if PLATFORM(COCOA) 55 return makeUnique<AudioMediaStreamTrackRendererCocoa>(); 56 #else 57 return nullptr; 58 #endif 59 } 41 virtual void addSource(Ref<AudioSampleDataSource>&&) = 0; 42 virtual void removeSource(AudioSampleDataSource&) = 0; 60 43 61 #if !RELEASE_LOG_DISABLED 62 void AudioMediaStreamTrackRenderer::setLogger(const Logger& logger, const void* identifier) 63 { 64 m_logger = &logger; 65 m_logIdentifier = identifier; 66 } 44 virtual void setAudioOutputDevice(const String&) = 0; 67 45 68 WTFLogChannel& AudioMediaStreamTrackRenderer::logChannel() const 69 { 70 return LogMedia; 71 } 72 #endif 46 using ResetObserver = Observer<void()>; 47 virtual void addResetObserver(ResetObserver&) = 0; 48 }; 73 49 74 50 } -
trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCAudioModule.cpp
r284135 r285027 33 33 #include <wtf/FastMalloc.h> 34 34 35 #if PLATFORM(COCOA) 36 #include "IncomingAudioMediaStreamTrackRendererUnit.h" 37 #endif 38 35 39 namespace WebCore { 36 40 … … 38 42 : m_queue(WorkQueue::create("WebKitWebRTCAudioModule", WorkQueue::QOS::UserInteractive)) 39 43 , m_logTimer(*this, &LibWebRTCAudioModule::logTimerFired) 44 { 45 } 46 47 LibWebRTCAudioModule::~LibWebRTCAudioModule() 40 48 { 41 49 } … … 63 71 m_queue->dispatch([this, protectedThis = rtc::scoped_refptr<webrtc::AudioDeviceModule>(this)] { 64 72 m_pollingTime = MonotonicTime::now(); 73 #if PLATFORM(COCOA) 74 m_currentAudioSampleCount = 0; 75 #endif 65 76 pollAudioData(); 66 77 }); … … 130 141 char data[LibWebRTCAudioFormat::sampleByteSize * channels * LibWebRTCAudioFormat::chunkSampleCount]; 131 142 m_audioTransport->PullRenderData(LibWebRTCAudioFormat::sampleByteSize * 8, LibWebRTCAudioFormat::sampleRate, channels, LibWebRTCAudioFormat::chunkSampleCount, data, &elapsedTime, &ntpTime); 143 #if PLATFORM(COCOA) 144 if (m_isRenderingIncomingAudio) 145 m_incomingAudioMediaStreamTrackRendererUnit->newAudioChunkPushed(); 146 m_currentAudioSampleCount += LibWebRTCAudioFormat::chunkSampleCount; 147 #endif 132 148 } 133 149 } 150 151 #if PLATFORM(COCOA) 152 BaseAudioMediaStreamTrackRendererUnit& LibWebRTCAudioModule::incomingAudioMediaStreamTrackRendererUnit() 153 { 154 if (!m_incomingAudioMediaStreamTrackRendererUnit) 155 m_incomingAudioMediaStreamTrackRendererUnit = makeUnique<IncomingAudioMediaStreamTrackRendererUnit>(*this); 156 return *m_incomingAudioMediaStreamTrackRendererUnit; 157 } 158 #endif 134 159 135 160 } // namespace WebCore -
trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCAudioModule.h
r284860 r285027 40 40 41 41 namespace WebCore { 42 class BaseAudioMediaStreamTrackRendererUnit; 43 class IncomingAudioMediaStreamTrackRendererUnit; 42 44 43 45 // LibWebRTCAudioModule is pulling streamed data to ensure audio data is passed to the audio track. … … 46 48 public: 47 49 LibWebRTCAudioModule(); 50 ~LibWebRTCAudioModule(); 48 51 49 52 static constexpr unsigned PollSamplesCount = 1; 53 void ref() { AddRef(); } 54 void deref() { Release(); } 55 56 #if PLATFORM(COCOA) 57 void startIncomingAudioRendering() { m_isRenderingIncomingAudio = true; } 58 void stopIncomingAudioRendering() { m_isRenderingIncomingAudio = false; } 59 BaseAudioMediaStreamTrackRendererUnit& incomingAudioMediaStreamTrackRendererUnit(); 60 uint64_t currentAudioSampleCount() const { return m_currentAudioSampleCount; } 61 #endif 50 62 51 63 private: … … 136 148 Timer m_logTimer; 137 149 int m_timeSpent { 0 }; 150 151 #if PLATFORM(COCOA) 152 uint64_t m_currentAudioSampleCount { 0 }; 153 bool m_isRenderingIncomingAudio { false }; 154 std::unique_ptr<IncomingAudioMediaStreamTrackRendererUnit> m_incomingAudioMediaStreamTrackRendererUnit; 155 #endif 138 156 }; 139 157 -
trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.cpp
r284085 r285027 71 71 #endif 72 72 73 #if USE(LIBWEBRTC) 74 LibWebRTCProvider::LibWebRTCProvider() 75 { 76 } 77 #endif 78 79 LibWebRTCProvider::~LibWebRTCProvider() 80 { 81 } 82 73 83 #if !USE(LIBWEBRTC) || !PLATFORM(COCOA) 74 84 void LibWebRTCProvider::registerWebKitVP9Decoder() … … 272 282 } 273 283 284 void LibWebRTCProvider::clearFactory() 285 { 286 m_audioModule = nullptr; 287 m_factory = nullptr; 288 } 289 274 290 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> LibWebRTCProvider::createPeerConnectionFactory(rtc::Thread* networkThread, rtc::Thread* signalingThread) 275 291 { 276 auto audioModule = rtc::scoped_refptr<webrtc::AudioDeviceModule>(new rtc::RefCountedObject<LibWebRTCAudioModule>()); 292 ASSERT(!m_audioModule); 293 auto audioModule = rtc::scoped_refptr<LibWebRTCAudioModule>(new rtc::RefCountedObject<LibWebRTCAudioModule>()); 294 m_audioModule = audioModule.get(); 277 295 278 296 return webrtc::CreatePeerConnectionFactory(networkThread, signalingThread, signalingThread, WTFMove(audioModule), webrtc::CreateBuiltinAudioEncoderFactory(), webrtc::CreateBuiltinAudioDecoderFactory(), createEncoderFactory(), createDecoderFactory(), nullptr, nullptr, nullptr); -
trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProvider.h
r284085 r285027 80 80 static UniqueRef<LibWebRTCProvider> create(); 81 81 82 virtual ~LibWebRTCProvider() = default;82 virtual ~LibWebRTCProvider(); 83 83 84 84 static bool webRTCAvailable(); … … 104 104 105 105 webrtc::PeerConnectionFactoryInterface* factory(); 106 LibWebRTCAudioModule* audioModule(); 106 107 107 108 // FIXME: Make these methods not static. … … 135 136 std::optional<RTCRtpCapabilities> senderCapabilities(const String& kind); 136 137 137 void clearFactory() { m_factory = nullptr; }138 void clearFactory(); 138 139 139 140 virtual void setLoggingLevel(WTFLogLevel); … … 151 152 152 153 protected: 153 LibWebRTCProvider() = default;154 LibWebRTCProvider(); 154 155 155 156 rtc::scoped_refptr<webrtc::PeerConnectionInterface> createPeerConnection(webrtc::PeerConnectionObserver&, rtc::NetworkManager&, rtc::PacketSocketFactory&, webrtc::PeerConnectionInterface::RTCConfiguration&&, std::unique_ptr<webrtc::AsyncResolverFactory>&&); … … 172 173 bool m_useNetworkThreadWithSocketServer { true }; 173 174 175 RefPtr<LibWebRTCAudioModule> m_audioModule; 174 176 rtc::scoped_refptr<webrtc::PeerConnectionFactoryInterface> m_factory; 175 177 bool m_disableNonLocalhostConnections { false }; … … 188 190 }; 189 191 192 #if USE(LIBWEBRTC) 193 inline LibWebRTCAudioModule* LibWebRTCProvider::audioModule() 194 { 195 return m_audioModule.get(); 196 } 197 #endif 198 190 199 } // namespace WebCore -
trunk/Source/WebCore/platform/mediastream/mac/RealtimeIncomingAudioSourceCocoa.cpp
r279459 r285027 133 133 } 134 134 135 CMTime startTime = PAL::CMTimeMake( m_numberOfFrames,sampleRate);135 CMTime startTime = PAL::CMTimeMake(audioModule() ? audioModule()->currentAudioSampleCount() : m_numberOfFrames, LibWebRTCAudioFormat::sampleRate); 136 136 auto mediaTime = PAL::toMediaTime(startTime); 137 137 m_numberOfFrames += numberOfFrames;
Note: See TracChangeset
for help on using the changeset viewer.