Changeset 277364 in webkit
- Timestamp:
- May 12, 2021, 1:57:38 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 2 added
- 10 edited
- 1 copied
- 4 moved
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/SourcesCocoa.txt (modified) (2 diffs)
-
WebCore/WebCore.xcodeproj/project.pbxproj (modified) (8 diffs)
-
WebCore/platform/audio/cocoa/AudioSampleBufferList.h (modified) (1 diff)
-
WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h (modified) (1 diff)
-
WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp (modified) (1 diff)
-
WebCore/platform/mediastream/cocoa (added)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp (moved) (moved from trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp ) (2 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h (moved) (moved from trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h ) (2 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp (moved) (moved from trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp ) (16 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h (copied) (copied from trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h ) (3 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp (added)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h (moved) (moved from trunk/Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h ) (5 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp (modified) (1 diff)
-
WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp (modified) (1 diff)
-
WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r277361 r277364 1 2021-05-12 Youenn Fablet <youenn@apple.com> 2 3 Introduce an internal unit to render audio MediaStreamTrack(s) 4 https://bugs.webkit.org/show_bug.cgi?id=225601 5 6 Reviewed by Eric Carlson. 7 8 Move files from platform/mediastream/mac to platform/mediastream/cocoa since they are used in both iOS and macOS. 9 Move Audio Unit functionality out of AudioMediaStreamTrackRendererUnit. 10 AudioMediaStreamTrackRendererUnit is responsible to manage sources and do the mixing. 11 To actually render audio, it will use an InternalUnit, which is currently done in process. 12 13 A future work will add support for a remote InternalUnit, that would run on GPUProcess. 14 To prepare for that, a callback allows customizing the Internal Unit creation. 15 We also change renderer start to be asynchronous, since it requires fetching the audio description from GPUProcess. 16 17 No change of behavior, covered by existing tests. 18 19 * SourcesCocoa.txt: 20 * WebCore.xcodeproj/project.pbxproj: 21 * platform/audio/cocoa/AudioSampleBufferList.h: 22 * platform/mediastream/AudioMediaStreamTrackRenderer.h: 23 * platform/mediastream/AudioTrackPrivateMediaStream.cpp: 24 (WebCore::AudioTrackPrivateMediaStream::startRenderer): 25 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp: Renamed from Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp. 26 (WebCore::AudioMediaStreamTrackRendererCocoa::start): 27 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h: Copied from Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h. 28 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp: Renamed from Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp. 29 (WebCore::AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit): 30 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::LocalAudioMediaStreamTrackRendererInternalUnit): 31 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::retrieveFormatDescription): 32 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::setAudioOutputDevice): 33 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::start): 34 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::stop): 35 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::createAudioUnitIfNeeded): 36 (WebCore::LocalAudioMediaStreamTrackRendererInternalUnit::renderingCallback): 37 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h: Renamed from Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.h. 38 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp: Added. 39 (WebCore::getCreateInternalUnitFunction): 40 (WebCore::AudioMediaStreamTrackRendererUnit::setCreateInternalUnitFunction): 41 (WebCore::createInternalUnit): 42 (WebCore::AudioMediaStreamTrackRendererUnit::singleton): 43 (WebCore::AudioMediaStreamTrackRendererUnit::AudioMediaStreamTrackRendererUnit): 44 (WebCore::AudioMediaStreamTrackRendererUnit::~AudioMediaStreamTrackRendererUnit): 45 (WebCore::AudioMediaStreamTrackRendererUnit::setAudioOutputDevice): 46 (WebCore::AudioMediaStreamTrackRendererUnit::addSource): 47 (WebCore::AudioMediaStreamTrackRendererUnit::removeSource): 48 (WebCore::AudioMediaStreamTrackRendererUnit::start): 49 (WebCore::AudioMediaStreamTrackRendererUnit::stop): 50 (WebCore::AudioMediaStreamTrackRendererUnit::retrieveFormatDescription): 51 (WebCore::AudioMediaStreamTrackRendererUnit::render): 52 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: Renamed from Source/WebCore/platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.h. 53 1 54 2021-05-12 Youenn Fablet <youenn@apple.com> 2 55 -
trunk/Source/WebCore/SourcesCocoa.txt
r277330 r277364 528 528 platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm 529 529 platform/mediarecorder/cocoa/VideoSampleBufferCompressor.mm 530 platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp 531 platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp 532 platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp 530 533 platform/mediastream/ios/AVAudioSessionCaptureDevice.mm 531 534 platform/mediastream/ios/AVAudioSessionCaptureDeviceManager.mm @no-unify … … 534 537 platform/mediastream/mac/AVCaptureDeviceManager.mm @no-unify 535 538 platform/mediastream/mac/AVVideoCaptureSource.mm @no-unify 536 platform/mediastream/mac/AudioMediaStreamTrackRendererCocoa.cpp537 platform/mediastream/mac/AudioMediaStreamTrackRendererUnit.cpp538 539 platform/mediastream/mac/BaseAudioSharedUnit.cpp 539 540 platform/mediastream/mac/CoreAudioCaptureDevice.cpp -
trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj
r277330 r277364 1176 1176 41BBA866257E373B00AC7F6D /* SFrameUtils.h in Headers */ = {isa = PBXBuildFile; fileRef = 41209E24257A2FBB00120ACA /* SFrameUtils.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1177 1177 41BF204922BA7BE80004F812 /* RealtimeVideoSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 41BF204022B947160004F812 /* RealtimeVideoSource.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1178 41C3B8A12649B1E0004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C3B89F2649B1B7004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1179 41C3B8A22649B1E5004ED4DE /* AudioMediaStreamTrackRendererUnit.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C3B89B2649B1B6004ED4DE /* AudioMediaStreamTrackRendererUnit.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1178 1180 41C760B10EDE03D300C1655F /* ScriptState.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C760B00EDE03D300C1655F /* ScriptState.h */; settings = {ATTRIBUTES = (Private, ); }; }; 1179 1181 41CB840125CAB7B30010E2B1 /* RealtimeIncomingVideoSourceCocoa.h in Headers */ = {isa = PBXBuildFile; fileRef = 41CB840025CAB7B00010E2B1 /* RealtimeIncomingVideoSourceCocoa.h */; settings = {ATTRIBUTES = (Private, ); }; }; … … 7698 7700 41024FC823CF254F00FDF98E /* SampleBufferDisplayLayer.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = SampleBufferDisplayLayer.cpp; sourceTree = "<group>"; }; 7699 7701 4107908A1FC3E4F20061B27A /* ClientOrigin.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ClientOrigin.h; sourceTree = "<group>"; }; 7700 41087F01248E59C800680E91 /* AudioMediaStreamTrackRendererUnit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererUnit.cpp; sourceTree = "<group>"; };7701 41087F03248E59C900680E91 /* AudioMediaStreamTrackRendererUnit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererUnit.h; sourceTree = "<group>"; };7702 7702 410938282347799A009428BA /* JSAbortControllerCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSAbortControllerCustom.cpp; sourceTree = "<group>"; }; 7703 7703 4109382C2347850E009428BA /* JSAbortSignalCustom.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = JSAbortSignalCustom.cpp; sourceTree = "<group>"; }; … … 7865 7865 4162A4551011464700DFF3ED /* JSDedicatedWorkerGlobalScope.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSDedicatedWorkerGlobalScope.cpp; sourceTree = "<group>"; }; 7866 7866 4162A4561011464700DFF3ED /* JSDedicatedWorkerGlobalScope.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSDedicatedWorkerGlobalScope.h; sourceTree = "<group>"; }; 7867 416A069223CCAA9300347109 /* AudioMediaStreamTrackRendererCocoa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererCocoa.h; sourceTree = "<group>"; };7868 416A069323CCAA9400347109 /* AudioMediaStreamTrackRendererCocoa.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererCocoa.cpp; sourceTree = "<group>"; };7869 7867 416A069423CCAA9E00347109 /* AudioTrackPrivateMediaStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioTrackPrivateMediaStream.cpp; sourceTree = "<group>"; }; 7870 7868 416A069523CCAA9E00347109 /* AudioMediaStreamTrackRenderer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRenderer.cpp; sourceTree = "<group>"; }; … … 8024 8022 41BF204022B947160004F812 /* RealtimeVideoSource.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RealtimeVideoSource.h; sourceTree = "<group>"; }; 8025 8023 41BF204222B947170004F812 /* RealtimeVideoSource.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = RealtimeVideoSource.cpp; sourceTree = "<group>"; }; 8024 41C3B89B2649B1B6004ED4DE /* AudioMediaStreamTrackRendererUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererUnit.h; sourceTree = "<group>"; }; 8025 41C3B89C2649B1B6004ED4DE /* AudioMediaStreamTrackRendererCocoa.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererCocoa.h; sourceTree = "<group>"; }; 8026 41C3B89D2649B1B6004ED4DE /* AudioMediaStreamTrackRendererCocoa.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererCocoa.cpp; sourceTree = "<group>"; }; 8027 41C3B89E2649B1B7004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererInternalUnit.cpp; sourceTree = "<group>"; }; 8028 41C3B89F2649B1B7004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AudioMediaStreamTrackRendererInternalUnit.h; sourceTree = "<group>"; }; 8029 41C3B8A02649B1B7004ED4DE /* AudioMediaStreamTrackRendererUnit.cpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; path = AudioMediaStreamTrackRendererUnit.cpp; sourceTree = "<group>"; }; 8026 8030 41C760B00EDE03D300C1655F /* ScriptState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptState.h; sourceTree = "<group>"; }; 8027 8031 41C7E1051E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CanvasCaptureMediaStreamTrack.cpp; sourceTree = "<group>"; }; … … 17549 17553 isa = PBXGroup; 17550 17554 children = ( 17555 41C3B89A2649B18E004ED4DE /* cocoa */, 17551 17556 CDC6751F1EAEA99600727C84 /* ios */, 17552 17557 415747421E38698000E914D8 /* libwebrtc */, … … 17633 17638 isa = PBXGroup; 17634 17639 children = ( 17635 416A069323CCAA9400347109 /* AudioMediaStreamTrackRendererCocoa.cpp */,17636 416A069223CCAA9300347109 /* AudioMediaStreamTrackRendererCocoa.h */,17637 41087F01248E59C800680E91 /* AudioMediaStreamTrackRendererUnit.cpp */,17638 41087F03248E59C900680E91 /* AudioMediaStreamTrackRendererUnit.h */,17639 17640 070363DA181A1CDC00C074A5 /* AVCaptureDeviceManager.h */, 17640 17641 070363DB181A1CDC00C074A5 /* AVCaptureDeviceManager.mm */, … … 19873 19874 ); 19874 19875 name = Streams; 19876 sourceTree = "<group>"; 19877 }; 19878 41C3B89A2649B18E004ED4DE /* cocoa */ = { 19879 isa = PBXGroup; 19880 children = ( 19881 41C3B89D2649B1B6004ED4DE /* AudioMediaStreamTrackRendererCocoa.cpp */, 19882 41C3B89C2649B1B6004ED4DE /* AudioMediaStreamTrackRendererCocoa.h */, 19883 41C3B89E2649B1B7004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.cpp */, 19884 41C3B89F2649B1B7004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h */, 19885 41C3B8A02649B1B7004ED4DE /* AudioMediaStreamTrackRendererUnit.cpp */, 19886 41C3B89B2649B1B6004ED4DE /* AudioMediaStreamTrackRendererUnit.h */, 19887 ); 19888 path = cocoa; 19875 19889 sourceTree = "<group>"; 19876 19890 }; … … 31553 31567 FD31601012B0267600C1A359 /* AudioListener.h in Headers */, 31554 31568 416A06A123CCAD0300347109 /* AudioMediaStreamTrackRenderer.h in Headers */, 31569 41C3B8A12649B1E0004ED4DE /* AudioMediaStreamTrackRendererInternalUnit.h in Headers */, 31570 41C3B8A22649B1E5004ED4DE /* AudioMediaStreamTrackRendererUnit.h in Headers */, 31555 31571 FD31601312B0267600C1A359 /* AudioNode.h in Headers */, 31556 31572 FD31601612B0267600C1A359 /* AudioNodeInput.h in Headers */, -
trunk/Source/WebCore/platform/audio/cocoa/AudioSampleBufferList.h
r268521 r277364 73 73 void reset(); 74 74 75 static void zeroABL(AudioBufferList&, size_t);75 WEBCORE_EXPORT static void zeroABL(AudioBufferList&, size_t); 76 76 void zero(); 77 77 -
trunk/Source/WebCore/platform/mediastream/AudioMediaStreamTrackRenderer.h
r272213 r277364 46 46 virtual ~AudioMediaStreamTrackRenderer() = default; 47 47 48 virtual void start( ) = 0;48 virtual void start(CompletionHandler<void()>&&) = 0; 49 49 virtual void stop() = 0; 50 50 virtual void clear() = 0; -
trunk/Source/WebCore/platform/mediastream/AudioTrackPrivateMediaStream.cpp
r276197 r277364 160 160 { 161 161 ASSERT(isMainThread()); 162 if (m_isPlaying )162 if (m_isPlaying || !m_renderer) 163 163 return; 164 164 165 165 m_isPlaying = true; 166 if (m_renderer) 167 m_renderer->start(); 168 m_audioSource->addAudioSampleObserver(*this); 166 m_renderer->start([protectedThis = makeRef(*this)] { 167 if (protectedThis->m_isPlaying) 168 protectedThis->m_audioSource->addAudioSampleObserver(protectedThis.get()); 169 }); 169 170 } 170 171 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp
r277363 r277364 1 1 /* 2 * Copyright (C) 2017-202 0Apple Inc. All rights reserved.2 * Copyright (C) 2017-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 40 40 AudioMediaStreamTrackRendererCocoa::~AudioMediaStreamTrackRendererCocoa() = default; 41 41 42 void AudioMediaStreamTrackRendererCocoa::start( )42 void AudioMediaStreamTrackRendererCocoa::start(CompletionHandler<void()>&& callback) 43 43 { 44 44 clear(); 45 45 46 if (auto* formatDescription = AudioMediaStreamTrackRendererUnit::singleton().formatDescription()) 47 m_outputDescription = makeUnique<CAAudioStreamDescription>(*formatDescription); 46 AudioMediaStreamTrackRendererUnit::singleton().retrieveFormatDescription([weakThis = makeWeakPtr(this), callback = WTFMove(callback)](auto* formatDescription) mutable { 47 if (weakThis) 48 weakThis->m_outputDescription = makeUnique<CAAudioStreamDescription>(*formatDescription); 49 callback(); 50 }); 48 51 } 49 52 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h
r277363 r277364 1 1 /* 2 * Copyright (C) 2017 Apple Inc. All rights reserved.2 * Copyright (C) 2017-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 50 50 // AudioMediaStreamTrackRenderer 51 51 void pushSamples(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 52 void start( ) final;52 void start(CompletionHandler<void()>&&) final; 53 53 void stop() final; 54 54 void clear() final; -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp
r277363 r277364 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 … … 25 25 26 26 #include "config.h" 27 #include "AudioMediaStreamTrackRenderer Unit.h"27 #include "AudioMediaStreamTrackRendererInternalUnit.h" 28 28 29 29 #if ENABLE(MEDIA_STREAM) … … 47 47 namespace WebCore { 48 48 49 AudioMediaStreamTrackRendererUnit& AudioMediaStreamTrackRendererUnit::singleton() 50 { 51 static NeverDestroyed<AudioMediaStreamTrackRendererUnit> registry; 52 return registry; 53 } 54 55 AudioMediaStreamTrackRendererUnit::~AudioMediaStreamTrackRendererUnit() 56 { 57 stop(); 58 } 59 60 void AudioMediaStreamTrackRendererUnit::setAudioOutputDevice(const String& deviceID) 49 class LocalAudioMediaStreamTrackRendererInternalUnit final : public AudioMediaStreamTrackRendererInternalUnit { 50 WTF_MAKE_FAST_ALLOCATED; 51 public: 52 explicit LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&&); 53 54 private: 55 void createAudioUnitIfNeeded(); 56 57 // AudioMediaStreamTrackRendererInternalUnit API. 58 void start() final; 59 void stop() final; 60 void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&) final; 61 void setAudioOutputDevice(const String&) final; 62 63 static OSStatus renderingCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList*); 64 65 RenderCallback m_renderCallback; 66 std::unique_ptr<CAAudioStreamDescription> m_outputDescription; 67 AudioComponentInstance m_remoteIOUnit { nullptr }; 68 bool m_isStarted { false }; 69 #if PLATFORM(MAC) 70 uint32_t m_deviceID { 0 }; 71 #endif 72 }; 73 74 UniqueRef<AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(RenderCallback&& renderCallback) 75 { 76 return makeUniqueRef<LocalAudioMediaStreamTrackRendererInternalUnit>(WTFMove(renderCallback)); 77 } 78 79 LocalAudioMediaStreamTrackRendererInternalUnit::LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&& renderCallback) 80 : m_renderCallback(WTFMove(renderCallback)) 81 { 82 } 83 84 void LocalAudioMediaStreamTrackRendererInternalUnit::retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&& callback) 85 { 86 createAudioUnitIfNeeded(); 87 callback(m_outputDescription.get()); 88 } 89 90 void LocalAudioMediaStreamTrackRendererInternalUnit::setAudioOutputDevice(const String& deviceID) 61 91 { 62 92 #if PLATFORM(MAC) … … 64 94 65 95 if (!device && !deviceID.isEmpty()) { 66 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRenderer Unit::setAudioOutputDeviceId - did not find device");96 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::setAudioOutputDeviceId - did not find device"); 67 97 return; 68 98 } … … 85 115 } 86 116 87 void AudioMediaStreamTrackRendererUnit::addSource(Ref<AudioSampleDataSource>&& source) 88 { 89 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit::addSource"); 90 91 { 92 auto locker = holdLock(m_sourcesLock); 93 ASSERT(!m_sources.contains(source.get())); 94 m_sources.add(WTFMove(source)); 95 m_sourcesCopy = copyToVector(m_sources); 96 m_shouldUpdateRenderSources = true; 97 } 98 start(); 99 } 100 101 void AudioMediaStreamTrackRendererUnit::removeSource(AudioSampleDataSource& source) 102 { 103 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit::removeSource"); 104 105 bool shouldStop = false; 106 { 107 auto locker = holdLock(m_sourcesLock); 108 m_sources.remove(source); 109 shouldStop = m_sources.isEmpty(); 110 m_sourcesCopy = copyToVector(m_sources); 111 m_shouldUpdateRenderSources = true; 112 } 113 if (shouldStop) 114 stop(); 115 } 116 117 void AudioMediaStreamTrackRendererUnit::start() 118 { 119 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit::start"); 120 117 void LocalAudioMediaStreamTrackRendererInternalUnit::start() 118 { 121 119 if (m_isStarted) 122 120 return; … … 127 125 128 126 if (auto error = AudioOutputUnitStart(m_remoteIOUnit)) { 129 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::start AudioOutputUnitStart failed, error = %d", error);127 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::start AudioOutputUnitStart failed, error = %d", error); 130 128 AudioComponentInstanceDispose(m_remoteIOUnit); 131 129 m_remoteIOUnit = nullptr; 130 return; 132 131 } 133 132 m_isStarted = true; 134 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit is started"); 135 } 136 137 void AudioMediaStreamTrackRendererUnit::stop() 138 { 139 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit::stop"); 140 133 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererInternalUnit is started"); 134 } 135 136 void LocalAudioMediaStreamTrackRendererInternalUnit::stop() 137 { 141 138 if (!m_remoteIOUnit) 142 139 return; … … 151 148 } 152 149 153 CAAudioStreamDescription* AudioMediaStreamTrackRendererUnit::formatDescription() 154 { 155 createAudioUnitIfNeeded(); 156 return m_outputDescription.get(); 157 } 158 159 void AudioMediaStreamTrackRendererUnit::createAudioUnitIfNeeded() 150 void LocalAudioMediaStreamTrackRendererInternalUnit::createAudioUnitIfNeeded() 160 151 { 161 152 ASSERT(!m_remoteIOUnit || m_outputDescription); … … 176 167 ASSERT(ioComponent); 177 168 if (!ioComponent) { 178 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to find remote IO unit component");169 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to find remote IO unit component"); 179 170 return; 180 171 } … … 182 173 auto error = AudioComponentInstanceNew(ioComponent, &remoteIOUnit); 183 174 if (error) { 184 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to open vpio unit, error = %d", error);175 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to open vpio unit, error = %d", error); 185 176 return; 186 177 } … … 190 181 error = AudioUnitSetProperty(remoteIOUnit, kAudioOutputUnitProperty_EnableIO, kAudioUnitScope_Output, 0, ¶m, sizeof(param)); 191 182 if (error) { 192 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to enable vpio unit output, error = %d", error);183 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to enable vpio unit output, error = %d", error); 193 184 return; 194 185 } … … 199 190 error = AudioUnitSetProperty(remoteIOUnit, kAudioOutputUnitProperty_CurrentDevice, kAudioUnitScope_Global, 0, &m_deviceID, sizeof(m_deviceID)); 200 191 if (error) { 201 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to set unit device ID %d, error %d (%.4s)", (int)m_deviceID, (int)error, (char*)&error);192 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to set unit device ID %d, error %d (%.4s)", (int)m_deviceID, (int)error, (char*)&error); 202 193 return; 203 194 } … … 205 196 #endif 206 197 207 AURenderCallbackStruct callback = { renderingCallback, this };198 AURenderCallbackStruct callback = { LocalAudioMediaStreamTrackRendererInternalUnit::renderingCallback, this }; 208 199 error = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_SetRenderCallback, kAudioUnitScope_Global, 0, &callback, sizeof(callback)); 209 200 if (error) { 210 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to set vpio unit speaker proc, error = %d", error);201 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to set vpio unit speaker proc, error = %d", error); 211 202 return; 212 203 } … … 215 206 error = AudioUnitGetProperty(remoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputDescription.streamDescription(), &size); 216 207 if (error) { 217 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to get input stream format, error = %d", error);208 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to get input stream format, error = %d", error); 218 209 return; 219 210 } … … 223 214 error = AudioUnitSetProperty(remoteIOUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Input, 0, &outputDescription.streamDescription(), sizeof(outputDescription.streamDescription())); 224 215 if (error) { 225 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit unable to set input stream format, error = %d", error);216 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit unable to set input stream format, error = %d", error); 226 217 return; 227 218 } … … 229 220 error = AudioUnitInitialize(remoteIOUnit); 230 221 if (error) { 231 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRenderer Unit::createAudioUnit AudioUnitInitialize() failed, error = %d", error);222 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::createAudioUnit AudioUnitInitialize() failed, error = %d", error); 232 223 return; 233 224 } … … 237 228 } 238 229 239 OSStatus AudioMediaStreamTrackRendererUnit::render(UInt32 sampleCount, AudioBufferList& ioData, UInt32 /*inBusNumber*/, const AudioTimeStamp& timeStamp, AudioUnitRenderActionFlags& actionFlags) 240 { 241 // For performance reasons, we forbid heap allocations while doing rendering on the audio thread. 242 ForbidMallocUseForCurrentThreadScope forbidMallocUse; 243 244 ASSERT(!isMainThread()); 245 if (m_shouldUpdateRenderSources) { 246 auto locker = tryHoldLock(m_sourcesLock); 247 if (!locker) 248 return 0; 249 250 m_renderSources = WTFMove(m_sourcesCopy); 251 m_shouldUpdateRenderSources = false; 252 } 253 254 if (m_renderSources.isEmpty()) { 255 if (m_outputDescription) 256 AudioSampleBufferList::zeroABL(ioData, static_cast<size_t>(sampleCount * m_outputDescription->bytesPerFrame())); 257 actionFlags = kAudioUnitRenderAction_OutputIsSilence; 258 return 0; 259 } 260 261 // Mix all sources. 262 bool isFirstSource = true; 263 for (auto& source : m_renderSources) { 264 source->pullSamples(ioData, static_cast<size_t>(sampleCount), timeStamp.mSampleTime, timeStamp.mHostTime, isFirstSource ? AudioSampleDataSource::Copy : AudioSampleDataSource::Mix); 265 isFirstSource = false; 266 } 267 return 0; 268 } 269 270 OSStatus AudioMediaStreamTrackRendererUnit::renderingCallback(void* processor, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList* ioData) 271 { 272 return static_cast<AudioMediaStreamTrackRendererUnit*>(processor)->render(sampleCount, *ioData, inBusNumber, *timeStamp, *actionFlags); 230 OSStatus LocalAudioMediaStreamTrackRendererInternalUnit::renderingCallback(void* processor, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32, UInt32 sampleCount, AudioBufferList* ioData) 231 { 232 return static_cast<LocalAudioMediaStreamTrackRendererInternalUnit*>(processor)->m_renderCallback(sampleCount, *ioData, timeStamp->mSampleTime, timeStamp->mHostTime, *actionFlags); 273 233 } 274 234 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h
r277363 r277364 1 1 /* 2 * Copyright (C) 20 17Apple 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 … … 28 28 #if ENABLE(MEDIA_STREAM) 29 29 30 #include "AudioMediaStreamTrackRenderer.h"31 #include "Logging.h"32 #include <wtf/WeakPtr.h>33 34 30 #include <AudioToolbox/AudioToolbox.h> 35 31 #include <CoreAudio/CoreAudioTypes.h> … … 37 33 namespace WebCore { 38 34 39 class AudioSampleDataSource; 40 class AudioSampleBufferList; 35 class AudioMediaStreamTrackRendererUnit; 41 36 class CAAudioStreamDescription; 42 37 43 class AudioMediaStreamTrackRendererCocoa : public AudioMediaStreamTrackRenderer, public CanMakeWeakPtr<AudioMediaStreamTrackRendererCocoa, WeakPtrFactoryInitialization::Eager> { 44 WTF_MAKE_FAST_ALLOCATED; 38 class AudioMediaStreamTrackRendererInternalUnit { 45 39 public: 46 AudioMediaStreamTrackRendererCocoa(); 47 ~AudioMediaStreamTrackRendererCocoa(); 40 virtual ~AudioMediaStreamTrackRendererInternalUnit() = default; 48 41 49 private: 50 // AudioMediaStreamTrackRenderer 51 void pushSamples(const WTF::MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final; 52 void start() final; 53 void stop() final; 54 void clear() final; 55 void setVolume(float) final; 56 void setAudioOutputDevice(const String&) final; 42 using RenderCallback = Function<OSStatus(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&)>; 43 WEBCORE_EXPORT static UniqueRef<AudioMediaStreamTrackRendererInternalUnit> createLocalInternalUnit(RenderCallback&&); 57 44 58 std::unique_ptr<CAAudioStreamDescription> m_outputDescription; 59 RefPtr<AudioSampleDataSource> m_dataSource; 60 bool m_shouldReset { false }; 45 virtual void start() = 0; 46 virtual void stop() = 0; 47 virtual void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&) = 0; 48 virtual void setAudioOutputDevice(const String&) = 0; 61 49 }; 62 50 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h
r277363 r277364 1 1 /* 2 * Copyright (C) 2020 Apple Inc. All rights reserved.2 * Copyright (C) 2020-2021 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 28 28 #if ENABLE(MEDIA_STREAM) 29 29 30 #include <AudioToolbox/AudioToolbox.h> 31 #include <CoreAudio/CoreAudioTypes.h> 30 #include "AudioMediaStreamTrackRendererInternalUnit.h" 32 31 #include <wtf/Forward.h> 33 32 #include <wtf/HashSet.h> 33 #include <wtf/UniqueRef.h> 34 34 #include <wtf/Vector.h> 35 35 … … 39 39 class AudioSampleBufferList; 40 40 class CAAudioStreamDescription; 41 class AudioMediaStreamTrackRendererInternalUnit; 41 42 42 43 class AudioMediaStreamTrackRendererUnit { 43 44 public: 44 static AudioMediaStreamTrackRendererUnit& singleton();45 WEBCORE_EXPORT static AudioMediaStreamTrackRendererUnit& singleton(); 45 46 46 AudioMediaStreamTrackRendererUnit() = default;47 AudioMediaStreamTrackRendererUnit(); 47 48 ~AudioMediaStreamTrackRendererUnit(); 48 49 49 static OSStatus renderingCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 numberOfFrames, AudioBufferList*); 50 using CreateInternalUnitFunction = Function<UniqueRef<AudioMediaStreamTrackRendererInternalUnit>(AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&)>; 51 WEBCORE_EXPORT static void setCreateInternalUnitFunction(CreateInternalUnitFunction&&); 50 52 51 void start(); 52 void stop(); 53 WEBCORE_EXPORT void render(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&); 53 54 54 55 void setAudioOutputDevice(const String&); … … 57 58 void removeSource(AudioSampleDataSource&); 58 59 59 CAAudioStreamDescription* formatDescription();60 void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&); 60 61 61 62 private: 63 void start(); 64 void stop(); 65 62 66 void createAudioUnitIfNeeded(); 63 OSStatus render(UInt32 sampleCount, AudioBufferList&, UInt32 inBusNumber, const AudioTimeStamp&, AudioUnitRenderActionFlags&);64 67 65 AudioComponentInstance m_remoteIOUnit { nullptr };66 std::unique_ptr<CAAudioStreamDescription> m_outputDescription;67 68 HashSet<Ref<AudioSampleDataSource>> m_sources; 68 69 Vector<Ref<AudioSampleDataSource>> m_sourcesCopy; … … 70 71 bool m_shouldUpdateRenderSources { false }; 71 72 Lock m_sourcesLock; 72 bool m_isStarted { false }; 73 #if PLATFORM(MAC) 74 uint32_t m_deviceID { 0 }; 75 #endif 73 UniqueRef<AudioMediaStreamTrackRendererInternalUnit> m_internalUnit; 76 74 }; 77 75 -
trunk/Source/WebKit/ChangeLog
r277362 r277364 1 2021-05-12 Youenn Fablet <youenn@apple.com> 2 3 Introduce an internal unit to render audio MediaStreamTrack(s) 4 https://bugs.webkit.org/show_bug.cgi?id=225601 5 6 Reviewed by Eric Carlson. 7 8 Update according new WebCore API. 9 10 * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp: 11 (WebKit::RemoteAudioMediaStreamTrackRenderer::start): 12 * WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp: 13 (WebKit::AudioMediaStreamTrackRenderer::start): 14 * WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h: 15 1 16 2021-05-12 Martin Robinson <mrobinson@igalia.com> 2 17 -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRenderer.cpp
r271041 r277364 78 78 void RemoteAudioMediaStreamTrackRenderer::start() 79 79 { 80 m_renderer->start( );80 m_renderer->start([] { }); 81 81 } 82 82 -
trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.cpp
r276633 r277364 65 65 } 66 66 67 void AudioMediaStreamTrackRenderer::start( )67 void AudioMediaStreamTrackRenderer::start(CompletionHandler<void()>&& callback) 68 68 { 69 69 m_isPlaying = true; 70 70 m_connection->send(Messages::RemoteAudioMediaStreamTrackRenderer::Start { }, m_identifier); 71 callback(); 71 72 } 72 73 -
trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRenderer.h
r272213 r277364 55 55 56 56 // WebCore::AudioMediaStreamTrackRenderer 57 void start( ) final;57 void start(CompletionHandler<void()>&&) final; 58 58 void stop() final; 59 59 void clear() final;
Note:
See TracChangeset
for help on using the changeset viewer.