Changeset 284674 in webkit
- Timestamp:
- Oct 22, 2021, 1:44:57 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 18 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/platform/audio/cocoa/AudioSampleDataSource.h (modified) (1 diff)
-
WebCore/platform/audio/cocoa/AudioSampleDataSource.mm (modified) (1 diff)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp (modified) (4 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h (modified) (2 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp (modified) (5 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h (modified) (1 diff)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp (modified) (2 diffs)
-
WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h (modified) (4 diffs)
-
WebKit/ChangeLog (modified) (1 diff)
-
WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp (modified) (3 diffs)
-
WebKit/WebProcess/GPU/GPUProcessConnection.cpp (modified) (2 diffs)
-
WebKit/WebProcess/GPU/GPUProcessConnection.h (modified) (1 diff)
-
WebKit/WebProcess/GPU/GPUProcessConnection.messages.in (modified) (1 diff)
-
WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp (modified) (4 diffs)
-
WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.h (modified) (2 diffs)
-
WebKit/WebProcess/WebProcess.cpp (modified) (1 diff)
-
WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r284672 r284674 1 2021-10-22 Youenn Fablet <youenn@apple.com> 2 3 Audio over peer connection becomes latent when changing the output 4 https://bugs.webkit.org/show_bug.cgi?id=231110 5 <rdar://problem/84049005> 6 7 Reviewed by Eric Carlson. 8 9 Add support for detecting change of timeline by looking at sample times. This happens when changing audio output. 10 Make AudioMediaStreamTrackRendererInternalUnit call a callback to let the unit deal with it. 11 When switching output, audio data is kept growing but is not read for some time by the remote unit, even though the remote unit is running. 12 The unit can ask its sources to update their offset to not keep extra buffered data. 13 14 Manually tested. 15 16 * platform/audio/cocoa/AudioSampleDataSource.h: 17 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp: 18 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h: 19 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp: 20 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h: 21 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp: 22 * platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h: 23 1 24 2021-10-22 Antti Koivisto <antti@apple.com> 2 25 -
trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.h
r280416 r284674 71 71 const CAAudioStreamDescription* inputDescription() const { return m_inputDescription ? &m_inputDescription.value() : nullptr; } 72 72 73 void recomputeSampleOffset() { m_shouldComputeOutputSampleOffset = true; } 74 73 75 #if !RELEASE_LOG_DISABLED 74 76 const Logger& logger() const final { return m_logger; } -
trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm
r282784 r284674 235 235 uint64_t buffered = endFrame - startFrame; 236 236 if (m_isFirstPull) { 237 if (buffered >= m_waitToStartForPushCount * m_lastPushedSampleCount) { 237 auto minimumBuffer = m_waitToStartForPushCount * m_lastPushedSampleCount; 238 if (buffered >= minimumBuffer) { 238 239 m_outputSampleOffset = startFrame - timeStamp; 239 240 m_shouldComputeOutputSampleOffset = false; -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp
r284057 r284674 37 37 namespace WebCore { 38 38 39 AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() = default; 39 AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() 40 : m_resetObserver([this] { reset(); }) 41 { 42 } 40 43 41 44 AudioMediaStreamTrackRendererCocoa::~AudioMediaStreamTrackRendererCocoa() = default; … … 73 76 } 74 77 78 void AudioMediaStreamTrackRendererCocoa::reset() 79 { 80 if (m_dataSource) 81 m_dataSource->recomputeSampleOffset(); 82 } 83 75 84 void AudioMediaStreamTrackRendererCocoa::setAudioOutputDevice(const String& deviceId) 76 85 { 77 86 // FIXME: We should create a unit for ourselves here or use the default unit if deviceId is matching. 78 87 AudioMediaStreamTrackRendererUnit::singleton().setAudioOutputDevice(deviceId); 79 m_shouldRe set= true;88 m_shouldRecreateDataSource = true; 80 89 } 81 90 … … 93 102 ASSERT(!isMainThread()); 94 103 ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType); 95 if (!m_dataSource || m_shouldRe set|| !m_dataSource->inputDescription() || *m_dataSource->inputDescription() != description) {104 if (!m_dataSource || m_shouldRecreateDataSource || !m_dataSource->inputDescription() || *m_dataSource->inputDescription() != description) { 96 105 DisableMallocRestrictionsForCurrentThreadScope scope; 97 106 … … 121 130 122 131 newSource->setVolume(volume()); 132 AudioMediaStreamTrackRendererUnit::singleton().addResetObserver(m_resetObserver); 123 133 AudioMediaStreamTrackRendererUnit::singleton().addSource(WTFMove(newSource)); 124 134 }); 125 135 m_dataSource = WTFMove(dataSource); 126 m_shouldRe set= false;136 m_shouldRecreateDataSource = false; 127 137 } 128 138 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h
r277364 r284674 29 29 30 30 #include "AudioMediaStreamTrackRenderer.h" 31 #include "AudioMediaStreamTrackRendererUnit.h" 31 32 #include "Logging.h" 32 33 #include <wtf/WeakPtr.h> … … 56 57 void setAudioOutputDevice(const String&) final; 57 58 59 void reset(); 60 58 61 std::unique_ptr<CAAudioStreamDescription> m_outputDescription; 59 62 RefPtr<AudioSampleDataSource> m_dataSource; 60 bool m_shouldReset { false }; 63 bool m_shouldRecreateDataSource { false }; 64 WebCore::AudioMediaStreamTrackRendererUnit::ResetObserver m_resetObserver; 61 65 }; 62 66 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp
r279366 r284674 51 51 WTF_MAKE_FAST_ALLOCATED; 52 52 public: 53 explicit LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&&);53 LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&&, ResetCallback&&); 54 54 55 55 private: … … 62 62 void setAudioOutputDevice(const String&) final; 63 63 64 OSStatus render(AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 sampleCount, AudioBufferList*); 64 65 static OSStatus renderingCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList*); 65 66 66 67 RenderCallback m_renderCallback; 68 ResetCallback m_resetCallback; 67 69 std::unique_ptr<CAAudioStreamDescription> m_outputDescription; 68 70 AudioComponentInstance m_remoteIOUnit { nullptr }; 69 71 bool m_isStarted { false }; 72 uint64_t m_sampleTime { 0 }; 70 73 #if PLATFORM(MAC) 71 74 uint32_t m_deviceID { 0 }; … … 73 76 }; 74 77 75 UniqueRef<AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(RenderCallback&& renderCallback )76 { 77 return makeUniqueRef<LocalAudioMediaStreamTrackRendererInternalUnit>(WTFMove(renderCallback) );78 } 79 80 LocalAudioMediaStreamTrackRendererInternalUnit::LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&& renderCallback )78 UniqueRef<AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(RenderCallback&& renderCallback, ResetCallback&& resetCallback) 79 { 80 return makeUniqueRef<LocalAudioMediaStreamTrackRendererInternalUnit>(WTFMove(renderCallback), WTFMove(resetCallback)); 81 } 82 83 LocalAudioMediaStreamTrackRendererInternalUnit::LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&& renderCallback, ResetCallback&& resetCallback) 81 84 : m_renderCallback(WTFMove(renderCallback)) 85 , m_resetCallback(WTFMove(resetCallback)) 82 86 { 83 87 } … … 126 130 return; 127 131 132 m_sampleTime = 0; 128 133 if (auto error = PAL::AudioOutputUnitStart(m_remoteIOUnit)) { 129 134 RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::start AudioOutputUnitStart failed, error = %d", error); … … 231 236 } 232 237 238 OSStatus LocalAudioMediaStreamTrackRendererInternalUnit::render(AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32 sampleCount, AudioBufferList* ioData) 239 { 240 auto sampleTime = timeStamp->mSampleTime; 241 // If we observe an irregularity in the timeline, we trigger a reset. 242 if (m_sampleTime && (m_sampleTime + 2 * sampleCount < sampleTime || sampleTime <= m_sampleTime)) 243 m_resetCallback(); 244 m_sampleTime = sampleTime < std::numeric_limits<Float64>::max() - sampleCount ? sampleTime : 0; 245 246 return m_renderCallback(sampleCount, *ioData, sampleTime, timeStamp->mHostTime, *actionFlags); 247 } 248 233 249 OSStatus LocalAudioMediaStreamTrackRendererInternalUnit::renderingCallback(void* processor, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32, UInt32 sampleCount, AudioBufferList* ioData) 234 250 { 235 return static_cast<LocalAudioMediaStreamTrackRendererInternalUnit*>(processor)-> m_renderCallback(sampleCount, *ioData, timeStamp->mSampleTime, timeStamp->mHostTime, *actionFlags);251 return static_cast<LocalAudioMediaStreamTrackRendererInternalUnit*>(processor)->render(actionFlags, timeStamp, sampleCount, ioData); 236 252 } 237 253 -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h
r277364 r284674 41 41 42 42 using RenderCallback = Function<OSStatus(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&)>; 43 WEBCORE_EXPORT static UniqueRef<AudioMediaStreamTrackRendererInternalUnit> createLocalInternalUnit(RenderCallback&&); 43 using ResetCallback = Function<void()>; 44 WEBCORE_EXPORT static UniqueRef<AudioMediaStreamTrackRendererInternalUnit> createLocalInternalUnit(RenderCallback&&, ResetCallback&&); 44 45 45 46 virtual void start() = 0; -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp
r278341 r284674 47 47 static UniqueRef<AudioMediaStreamTrackRendererInternalUnit> createInternalUnit(AudioMediaStreamTrackRendererUnit& unit) 48 48 { 49 AudioMediaStreamTrackRendererInternalUnit::RenderCallback callback = [&unit](auto sampleCount, auto& list, auto sampleTime, auto hostTime, auto& flags) {49 AudioMediaStreamTrackRendererInternalUnit::RenderCallback renderCallback = [&unit](auto sampleCount, auto& list, auto sampleTime, auto hostTime, auto& flags) { 50 50 unit.render(sampleCount, list, sampleTime, hostTime, flags); 51 51 return 0; 52 52 }; 53 AudioMediaStreamTrackRendererInternalUnit::ResetCallback startCallback = [&unit]() { unit.reset(); }; 53 54 54 55 auto& function = getCreateInternalUnitFunction(); 55 56 if (function) 56 return function(WTFMove( callback));57 return function(WTFMove(renderCallback), WTFMove(startCallback)); 57 58 58 return AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(WTFMove( callback));59 return AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(WTFMove(renderCallback), WTFMove(startCallback)); 59 60 } 60 61 … … 138 139 } 139 140 141 void AudioMediaStreamTrackRendererUnit::reset() 142 { 143 RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit::reset"); 144 ASSERT(isMainThread()); 145 146 m_resetObservers.forEach([](auto& observer) { 147 observer(); 148 }); 149 } 150 140 151 void AudioMediaStreamTrackRendererUnit::retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&& callback) 141 152 { -
trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h
r277958 r284674 32 32 #include <wtf/HashSet.h> 33 33 #include <wtf/Lock.h> 34 #include <wtf/Observer.h> 34 35 #include <wtf/UniqueRef.h> 35 36 #include <wtf/Vector.h> 37 #include <wtf/WeakHashSet.h> 36 38 37 39 namespace WebCore { … … 49 51 ~AudioMediaStreamTrackRendererUnit(); 50 52 51 using CreateInternalUnitFunction = Function<UniqueRef<AudioMediaStreamTrackRendererInternalUnit>(AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& )>;53 using CreateInternalUnitFunction = Function<UniqueRef<AudioMediaStreamTrackRendererInternalUnit>(AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&, AudioMediaStreamTrackRendererInternalUnit::ResetCallback&&)>; 52 54 WEBCORE_EXPORT static void setCreateInternalUnitFunction(CreateInternalUnitFunction&&); 53 55 54 56 WEBCORE_EXPORT void render(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&); 57 void reset(); 55 58 56 59 void setAudioOutputDevice(const String&); … … 59 62 void removeSource(AudioSampleDataSource&); 60 63 64 using ResetObserver = Observer<void()>; 65 void addResetObserver(ResetObserver& observer) { m_resetObservers.add(observer); } 61 66 void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&); 62 67 … … 74 79 Lock m_pendingRenderSourcesLock; 75 80 UniqueRef<AudioMediaStreamTrackRendererInternalUnit> m_internalUnit; 81 WeakHashSet<ResetObserver> m_resetObservers; 76 82 }; 77 83 -
trunk/Source/WebKit/ChangeLog
r284671 r284674 1 2021-10-22 Youenn Fablet <youenn@apple.com> 2 3 Audio over peer connection becomes latent when changing the output 4 https://bugs.webkit.org/show_bug.cgi?id=231110 5 <rdar://problem/84049005> 6 7 Reviewed by Eric Carlson. 8 9 When detecting an audio timeline change, send it from GPUProcess to WebProcess. 10 Let the WebProcess reset the sources to properly restart. 11 12 * GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp: 13 * WebProcess/GPU/GPUProcessConnection.cpp: 14 * WebProcess/GPU/GPUProcessConnection.h: 15 * WebProcess/GPU/GPUProcessConnection.messages.in: 16 * WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp: 17 * WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.h: 18 * WebProcess/WebProcess.cpp: 19 * WebProcess/cocoa/UserMediaCaptureManager.cpp: 20 1 21 2021-10-22 Kimmo Kinnunen <kkinnunen@apple.com> 2 22 -
trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp
r284057 r284674 58 58 void setAudioOutputDevice(const String&); 59 59 OSStatus render(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&); 60 void notifyReset(); 60 61 61 62 private: … … 124 125 } 125 126 127 static WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback resetCallback(RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit& unit) 128 { 129 return [&unit]() { 130 return unit.notifyReset(); 131 }; 132 } 133 126 134 RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::Unit(AudioMediaStreamTrackRendererInternalUnitIdentifier identifier, Ref<IPC::Connection>&& connection, CompletionHandler<void(const WebCore::CAAudioStreamDescription&, size_t)>&& callback) 127 135 : m_identifier(identifier) 128 136 , m_connection(WTFMove(connection)) 129 , m_localUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(renderCallback(*this) ))137 , m_localUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(renderCallback(*this), resetCallback(*this))) 130 138 { 131 139 m_localUnit->retrieveFormatDescription([weakThis = WeakPtr { *this }, this, callback = WTFMove(callback)](auto&& description) mutable { … … 145 153 } 146 154 155 void RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::notifyReset() 156 { 157 m_connection->send(Messages::GPUProcessConnection::ResetAudioMediaStreamTrackRendererInternalUnit { m_identifier }, 0); 158 } 159 147 160 void RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::start(const SharedMemory::Handle& handle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames, IPC::Semaphore&& semaphore) 148 161 { -
trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp
r283116 r284674 29 29 #if ENABLE(GPU_PROCESS) 30 30 31 #include "AudioMediaStreamTrackRendererInternalUnitManager.h" 31 32 #include "DataReference.h" 32 33 #include "GPUConnectionToWebProcessMessages.h" … … 153 154 return *m_sampleBufferDisplayLayerManager; 154 155 } 156 157 void GPUProcessConnection::resetAudioMediaStreamTrackRendererInternalUnit(AudioMediaStreamTrackRendererInternalUnitIdentifier identifier) 158 { 159 WebProcess::singleton().audioMediaStreamTrackRendererInternalUnitManager().reset(identifier); 160 } 155 161 #endif 156 162 -
trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h
r283116 r284674 75 75 #if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM) 76 76 SampleBufferDisplayLayerManager& sampleBufferDisplayLayerManager(); 77 void resetAudioMediaStreamTrackRendererInternalUnit(AudioMediaStreamTrackRendererInternalUnitIdentifier); 77 78 #endif 78 79 -
trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.messages.in
r278374 r284674 30 30 EndRoutingArbitration(); 31 31 #endif 32 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 33 ResetAudioMediaStreamTrackRendererInternalUnit(WebKit::AudioMediaStreamTrackRendererInternalUnitIdentifier identifier) 34 #endif 32 35 } 33 36 -
trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp
r284142 r284674 46 46 WTF_MAKE_FAST_ALLOCATED; 47 47 public: 48 explicit Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&);48 Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&&); 49 49 ~Proxy(); 50 50 51 51 AudioMediaStreamTrackRendererInternalUnitIdentifier identifier() const { return m_identifier; } 52 52 53 void restartIfNeeded(); 53 enum class IsClosed { No, Yes }; 54 void reset(IsClosed); 54 55 55 56 private: … … 68 69 69 70 WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback m_renderCallback; 71 WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback m_resetCallback; 70 72 AudioMediaStreamTrackRendererInternalUnitIdentifier m_identifier; 71 73 … … 98 100 } 99 101 100 UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnitManager::createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& callback) 101 { 102 return makeUniqueRef<AudioMediaStreamTrackRendererInternalUnitManager::Proxy>(WTFMove(callback)); 103 } 104 105 void AudioMediaStreamTrackRendererInternalUnitManager::gpuProcessConnectionClosed() 106 { 107 for (auto proxy : m_proxies.values()) 108 proxy->restartIfNeeded(); 109 } 110 111 AudioMediaStreamTrackRendererInternalUnitManager::Proxy::Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& renderCallback) 102 UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnitManager::createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& renderCallback, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&& resetCallback) 103 { 104 return makeUniqueRef<AudioMediaStreamTrackRendererInternalUnitManager::Proxy>(WTFMove(renderCallback), WTFMove(resetCallback)); 105 } 106 107 void AudioMediaStreamTrackRendererInternalUnitManager::reset(AudioMediaStreamTrackRendererInternalUnitIdentifier identifier) 108 { 109 if (auto proxy = m_proxies.get(identifier)) 110 proxy->reset(Proxy::IsClosed::No); 111 } 112 113 void AudioMediaStreamTrackRendererInternalUnitManager::restartAllUnits() 114 { 115 auto proxies = std::exchange(m_proxies, { }); 116 for (auto proxy : proxies.values()) 117 proxy->reset(Proxy::IsClosed::Yes); 118 } 119 120 AudioMediaStreamTrackRendererInternalUnitManager::Proxy::Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& renderCallback, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&& resetCallback) 112 121 : m_renderCallback(WTFMove(renderCallback)) 122 , m_resetCallback(WTFMove(resetCallback)) 113 123 , m_identifier(AudioMediaStreamTrackRendererInternalUnitIdentifier::generate()) 114 124 { … … 259 269 } 260 270 261 void AudioMediaStreamTrackRendererInternalUnitManager::Proxy::res tartIfNeeded()271 void AudioMediaStreamTrackRendererInternalUnitManager::Proxy::reset(IsClosed isClosed) 262 272 { 263 273 stopThread(); 264 m_didClose = true; 274 m_didClose = isClosed == IsClosed::Yes; 275 m_resetCallback(); 265 276 if (m_isPlaying) 266 277 start(); -
trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.h
r277852 r284674 48 48 AudioMediaStreamTrackRendererInternalUnitManager() = default; 49 49 50 UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& );50 UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&&); 51 51 52 52 class Proxy; … … 54 54 void remove(Proxy&); 55 55 56 void gpuProcessConnectionClosed(); 56 void reset(AudioMediaStreamTrackRendererInternalUnitIdentifier); 57 void restartAllUnits(); 57 58 58 59 private: -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r284525 r284674 1311 1311 #if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA) 1312 1312 if (m_audioMediaStreamTrackRendererInternalUnitManager) 1313 m_audioMediaStreamTrackRendererInternalUnitManager-> gpuProcessConnectionClosed();1313 m_audioMediaStreamTrackRendererInternalUnitManager->restartAllUnits(); 1314 1314 #endif 1315 1315 } -
trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp
r284444 r284674 82 82 83 83 if (shouldCaptureAudioInGPUProcess) { 84 WebCore::AudioMediaStreamTrackRendererUnit::setCreateInternalUnitFunction([](auto&& renderCallback ) {85 return WebProcess::singleton().audioMediaStreamTrackRendererInternalUnitManager().createRemoteInternalUnit(WTFMove(renderCallback) );84 WebCore::AudioMediaStreamTrackRendererUnit::setCreateInternalUnitFunction([](auto&& renderCallback, auto&& resetCallback) { 85 return WebProcess::singleton().audioMediaStreamTrackRendererInternalUnitManager().createRemoteInternalUnit(WTFMove(renderCallback), WTFMove(resetCallback)); 86 86 }); 87 87 }
Note:
See TracChangeset
for help on using the changeset viewer.