⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 284674 in webkit


Ignore:
Timestamp:
Oct 22, 2021, 1:44:57 AM (5 years ago)
Author:
youenn@apple.com
Message:

Audio over peer connection becomes latent when changing the output
https://bugs.webkit.org/show_bug.cgi?id=231110
<rdar://problem/84049005>

Reviewed by Eric Carlson.

Source/WebCore:

Add support for detecting change of timeline by looking at sample times. This happens when changing audio output.
Make AudioMediaStreamTrackRendererInternalUnit call a callback to let the unit deal with it.
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.
The unit can ask its sources to update their offset to not keep extra buffered data.

Manually tested.

  • platform/audio/cocoa/AudioSampleDataSource.h:
  • platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp:
  • platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h:
  • platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp:
  • platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h:
  • platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp:
  • platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h:

Source/WebKit:

When detecting an audio timeline change, send it from GPUProcess to WebProcess.
Let the WebProcess reset the sources to properly restart.

  • GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp:
  • WebProcess/GPU/GPUProcessConnection.cpp:
  • WebProcess/GPU/GPUProcessConnection.h:
  • WebProcess/GPU/GPUProcessConnection.messages.in:
  • WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp:
  • WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.h:
  • WebProcess/WebProcess.cpp:
  • WebProcess/cocoa/UserMediaCaptureManager.cpp:
Location:
trunk/Source
Files:
18 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r284672 r284674  
     12021-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
    1242021-10-22  Antti Koivisto  <antti@apple.com>
    225
  • trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.h

    r280416 r284674  
    7171    const CAAudioStreamDescription* inputDescription() const { return m_inputDescription ? &m_inputDescription.value() : nullptr; }
    7272
     73    void recomputeSampleOffset() { m_shouldComputeOutputSampleOffset = true; }
     74
    7375#if !RELEASE_LOG_DISABLED
    7476    const Logger& logger() const final { return m_logger; }
  • trunk/Source/WebCore/platform/audio/cocoa/AudioSampleDataSource.mm

    r282784 r284674  
    235235        uint64_t buffered = endFrame - startFrame;
    236236        if (m_isFirstPull) {
    237             if (buffered >= m_waitToStartForPushCount * m_lastPushedSampleCount) {
     237            auto minimumBuffer = m_waitToStartForPushCount * m_lastPushedSampleCount;
     238            if (buffered >= minimumBuffer) {
    238239                m_outputSampleOffset = startFrame - timeStamp;
    239240                m_shouldComputeOutputSampleOffset = false;
  • trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.cpp

    r284057 r284674  
    3737namespace WebCore {
    3838
    39 AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa() = default;
     39AudioMediaStreamTrackRendererCocoa::AudioMediaStreamTrackRendererCocoa()
     40    : m_resetObserver([this] { reset(); })
     41{
     42}
    4043
    4144AudioMediaStreamTrackRendererCocoa::~AudioMediaStreamTrackRendererCocoa() = default;
     
    7376}
    7477
     78void AudioMediaStreamTrackRendererCocoa::reset()
     79{
     80    if (m_dataSource)
     81        m_dataSource->recomputeSampleOffset();
     82}
     83
    7584void AudioMediaStreamTrackRendererCocoa::setAudioOutputDevice(const String& deviceId)
    7685{
    7786    // FIXME: We should create a unit for ourselves here or use the default unit if deviceId is matching.
    7887    AudioMediaStreamTrackRendererUnit::singleton().setAudioOutputDevice(deviceId);
    79     m_shouldReset = true;
     88    m_shouldRecreateDataSource = true;
    8089}
    8190
     
    93102    ASSERT(!isMainThread());
    94103    ASSERT(description.platformDescription().type == PlatformDescription::CAAudioStreamBasicType);
    95     if (!m_dataSource || m_shouldReset || !m_dataSource->inputDescription() || *m_dataSource->inputDescription() != description) {
     104    if (!m_dataSource || m_shouldRecreateDataSource || !m_dataSource->inputDescription() || *m_dataSource->inputDescription() != description) {
    96105        DisableMallocRestrictionsForCurrentThreadScope scope;
    97106
     
    121130
    122131            newSource->setVolume(volume());
     132            AudioMediaStreamTrackRendererUnit::singleton().addResetObserver(m_resetObserver);
    123133            AudioMediaStreamTrackRendererUnit::singleton().addSource(WTFMove(newSource));
    124134        });
    125135        m_dataSource = WTFMove(dataSource);
    126         m_shouldReset = false;
     136        m_shouldRecreateDataSource = false;
    127137    }
    128138
  • trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererCocoa.h

    r277364 r284674  
    2929
    3030#include "AudioMediaStreamTrackRenderer.h"
     31#include "AudioMediaStreamTrackRendererUnit.h"
    3132#include "Logging.h"
    3233#include <wtf/WeakPtr.h>
     
    5657    void setAudioOutputDevice(const String&) final;
    5758
     59    void reset();
     60
    5861    std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
    5962    RefPtr<AudioSampleDataSource> m_dataSource;
    60     bool m_shouldReset { false };
     63    bool m_shouldRecreateDataSource { false };
     64    WebCore::AudioMediaStreamTrackRendererUnit::ResetObserver m_resetObserver;
    6165};
    6266
  • trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.cpp

    r279366 r284674  
    5151    WTF_MAKE_FAST_ALLOCATED;
    5252public:
    53     explicit LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&&);
     53    LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&&, ResetCallback&&);
    5454
    5555private:
     
    6262    void setAudioOutputDevice(const String&) final;
    6363
     64    OSStatus render(AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 sampleCount, AudioBufferList*);
    6465    static OSStatus renderingCallback(void*, AudioUnitRenderActionFlags*, const AudioTimeStamp*, UInt32 inBusNumber, UInt32 sampleCount, AudioBufferList*);
    6566
    6667    RenderCallback m_renderCallback;
     68    ResetCallback m_resetCallback;
    6769    std::unique_ptr<CAAudioStreamDescription> m_outputDescription;
    6870    AudioComponentInstance m_remoteIOUnit { nullptr };
    6971    bool m_isStarted { false };
     72    uint64_t m_sampleTime { 0 };
    7073#if PLATFORM(MAC)
    7174    uint32_t m_deviceID { 0 };
     
    7376};
    7477
    75 UniqueRef<AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(RenderCallback&& renderCallback)
    76 {
    77     return makeUniqueRef<LocalAudioMediaStreamTrackRendererInternalUnit>(WTFMove(renderCallback));
    78 }
    79 
    80 LocalAudioMediaStreamTrackRendererInternalUnit::LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&& renderCallback)
     78UniqueRef<AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(RenderCallback&& renderCallback, ResetCallback&& resetCallback)
     79{
     80    return makeUniqueRef<LocalAudioMediaStreamTrackRendererInternalUnit>(WTFMove(renderCallback), WTFMove(resetCallback));
     81}
     82
     83LocalAudioMediaStreamTrackRendererInternalUnit::LocalAudioMediaStreamTrackRendererInternalUnit(RenderCallback&& renderCallback, ResetCallback&& resetCallback)
    8184    : m_renderCallback(WTFMove(renderCallback))
     85    , m_resetCallback(WTFMove(resetCallback))
    8286{
    8387}
     
    126130        return;
    127131
     132    m_sampleTime = 0;
    128133    if (auto error = PAL::AudioOutputUnitStart(m_remoteIOUnit)) {
    129134        RELEASE_LOG_ERROR(WebRTC, "AudioMediaStreamTrackRendererInternalUnit::start AudioOutputUnitStart failed, error = %d", error);
     
    231236}
    232237
     238OSStatus 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
    233249OSStatus LocalAudioMediaStreamTrackRendererInternalUnit::renderingCallback(void* processor, AudioUnitRenderActionFlags* actionFlags, const AudioTimeStamp* timeStamp, UInt32, UInt32 sampleCount, AudioBufferList* ioData)
    234250{
    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);
    236252}
    237253
  • trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererInternalUnit.h

    r277364 r284674  
    4141
    4242    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&&);
    4445
    4546    virtual void start() = 0;
  • trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp

    r278341 r284674  
    4747static UniqueRef<AudioMediaStreamTrackRendererInternalUnit> createInternalUnit(AudioMediaStreamTrackRendererUnit& unit)
    4848{
    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) {
    5050        unit.render(sampleCount, list, sampleTime, hostTime, flags);
    5151        return 0;
    5252    };
     53    AudioMediaStreamTrackRendererInternalUnit::ResetCallback startCallback = [&unit]() { unit.reset(); };
    5354
    5455    auto& function = getCreateInternalUnitFunction();
    5556    if (function)
    56         return function(WTFMove(callback));
     57        return function(WTFMove(renderCallback), WTFMove(startCallback));
    5758
    58     return AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(WTFMove(callback));
     59    return AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(WTFMove(renderCallback), WTFMove(startCallback));
    5960}
    6061
     
    138139}
    139140
     141void AudioMediaStreamTrackRendererUnit::reset()
     142{
     143    RELEASE_LOG(WebRTC, "AudioMediaStreamTrackRendererUnit::reset");
     144    ASSERT(isMainThread());
     145
     146    m_resetObservers.forEach([](auto& observer) {
     147        observer();
     148    });
     149}
     150
    140151void AudioMediaStreamTrackRendererUnit::retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&& callback)
    141152{
  • trunk/Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.h

    r277958 r284674  
    3232#include <wtf/HashSet.h>
    3333#include <wtf/Lock.h>
     34#include <wtf/Observer.h>
    3435#include <wtf/UniqueRef.h>
    3536#include <wtf/Vector.h>
     37#include <wtf/WeakHashSet.h>
    3638
    3739namespace WebCore {
     
    4951    ~AudioMediaStreamTrackRendererUnit();
    5052
    51     using CreateInternalUnitFunction = Function<UniqueRef<AudioMediaStreamTrackRendererInternalUnit>(AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&)>;
     53    using CreateInternalUnitFunction = Function<UniqueRef<AudioMediaStreamTrackRendererInternalUnit>(AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&, AudioMediaStreamTrackRendererInternalUnit::ResetCallback&&)>;
    5254    WEBCORE_EXPORT static void setCreateInternalUnitFunction(CreateInternalUnitFunction&&);
    5355
    5456    WEBCORE_EXPORT void render(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&);
     57    void reset();
    5558
    5659    void setAudioOutputDevice(const String&);
     
    5962    void removeSource(AudioSampleDataSource&);
    6063
     64    using ResetObserver = Observer<void()>;
     65    void addResetObserver(ResetObserver& observer) { m_resetObservers.add(observer); }
    6166    void retrieveFormatDescription(CompletionHandler<void(const CAAudioStreamDescription*)>&&);
    6267
     
    7479    Lock m_pendingRenderSourcesLock;
    7580    UniqueRef<AudioMediaStreamTrackRendererInternalUnit> m_internalUnit;
     81    WeakHashSet<ResetObserver> m_resetObservers;
    7682};
    7783
  • trunk/Source/WebKit/ChangeLog

    r284671 r284674  
     12021-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
    1212021-10-22  Kimmo Kinnunen  <kkinnunen@apple.com>
    222
  • trunk/Source/WebKit/GPUProcess/webrtc/RemoteAudioMediaStreamTrackRendererInternalUnitManager.cpp

    r284057 r284674  
    5858    void setAudioOutputDevice(const String&);
    5959    OSStatus render(size_t sampleCount, AudioBufferList&, uint64_t sampleTime, double hostTime, AudioUnitRenderActionFlags&);
     60    void notifyReset();
    6061
    6162private:
     
    124125}
    125126
     127static WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback resetCallback(RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit& unit)
     128{
     129    return [&unit]() {
     130        return unit.notifyReset();
     131    };
     132}
     133
    126134RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::Unit(AudioMediaStreamTrackRendererInternalUnitIdentifier identifier, Ref<IPC::Connection>&& connection, CompletionHandler<void(const WebCore::CAAudioStreamDescription&, size_t)>&& callback)
    127135    : m_identifier(identifier)
    128136    , m_connection(WTFMove(connection))
    129     , m_localUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(renderCallback(*this)))
     137    , m_localUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::createLocalInternalUnit(renderCallback(*this), resetCallback(*this)))
    130138{
    131139    m_localUnit->retrieveFormatDescription([weakThis = WeakPtr { *this }, this, callback = WTFMove(callback)](auto&& description) mutable {
     
    145153}
    146154
     155void RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::notifyReset()
     156{
     157    m_connection->send(Messages::GPUProcessConnection::ResetAudioMediaStreamTrackRendererInternalUnit { m_identifier }, 0);
     158}
     159
    147160void RemoteAudioMediaStreamTrackRendererInternalUnitManager::Unit::start(const SharedMemory::Handle& handle, const WebCore::CAAudioStreamDescription& description, uint64_t numberOfFrames, IPC::Semaphore&& semaphore)
    148161{
  • trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp

    r283116 r284674  
    2929#if ENABLE(GPU_PROCESS)
    3030
     31#include "AudioMediaStreamTrackRendererInternalUnitManager.h"
    3132#include "DataReference.h"
    3233#include "GPUConnectionToWebProcessMessages.h"
     
    153154    return *m_sampleBufferDisplayLayerManager;
    154155}
     156
     157void GPUProcessConnection::resetAudioMediaStreamTrackRendererInternalUnit(AudioMediaStreamTrackRendererInternalUnitIdentifier identifier)
     158{
     159    WebProcess::singleton().audioMediaStreamTrackRendererInternalUnitManager().reset(identifier);
     160}
    155161#endif
    156162
  • trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.h

    r283116 r284674  
    7575#if PLATFORM(COCOA) && ENABLE(MEDIA_STREAM)
    7676    SampleBufferDisplayLayerManager& sampleBufferDisplayLayerManager();
     77    void resetAudioMediaStreamTrackRendererInternalUnit(AudioMediaStreamTrackRendererInternalUnitIdentifier);
    7778#endif
    7879
  • trunk/Source/WebKit/WebProcess/GPU/GPUProcessConnection.messages.in

    r278374 r284674  
    3030    EndRoutingArbitration();
    3131#endif
     32#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
     33    ResetAudioMediaStreamTrackRendererInternalUnit(WebKit::AudioMediaStreamTrackRendererInternalUnitIdentifier identifier)
     34#endif
    3235}
    3336
  • trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.cpp

    r284142 r284674  
    4646    WTF_MAKE_FAST_ALLOCATED;
    4747public:
    48     explicit Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&);
     48    Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&&);
    4949    ~Proxy();
    5050
    5151    AudioMediaStreamTrackRendererInternalUnitIdentifier identifier() const { return m_identifier; }
    5252
    53     void restartIfNeeded();
     53    enum class IsClosed { No, Yes };
     54    void reset(IsClosed);
    5455
    5556private:
     
    6869
    6970    WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback m_renderCallback;
     71    WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback m_resetCallback;
    7072    AudioMediaStreamTrackRendererInternalUnitIdentifier m_identifier;
    7173
     
    98100}
    99101
    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)
     102UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> AudioMediaStreamTrackRendererInternalUnitManager::createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& renderCallback, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&& resetCallback)
     103{
     104    return makeUniqueRef<AudioMediaStreamTrackRendererInternalUnitManager::Proxy>(WTFMove(renderCallback), WTFMove(resetCallback));
     105}
     106
     107void AudioMediaStreamTrackRendererInternalUnitManager::reset(AudioMediaStreamTrackRendererInternalUnitIdentifier identifier)
     108{
     109    if (auto proxy = m_proxies.get(identifier))
     110        proxy->reset(Proxy::IsClosed::No);
     111}
     112
     113void AudioMediaStreamTrackRendererInternalUnitManager::restartAllUnits()
     114{
     115    auto proxies = std::exchange(m_proxies, { });
     116    for (auto proxy : proxies.values())
     117        proxy->reset(Proxy::IsClosed::Yes);
     118}
     119
     120AudioMediaStreamTrackRendererInternalUnitManager::Proxy::Proxy(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&& renderCallback, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&& resetCallback)
    112121    : m_renderCallback(WTFMove(renderCallback))
     122    , m_resetCallback(WTFMove(resetCallback))
    113123    , m_identifier(AudioMediaStreamTrackRendererInternalUnitIdentifier::generate())
    114124{
     
    259269}
    260270
    261 void AudioMediaStreamTrackRendererInternalUnitManager::Proxy::restartIfNeeded()
     271void AudioMediaStreamTrackRendererInternalUnitManager::Proxy::reset(IsClosed isClosed)
    262272{
    263273    stopThread();
    264     m_didClose = true;
     274    m_didClose = isClosed == IsClosed::Yes;
     275    m_resetCallback();
    265276    if (m_isPlaying)
    266277        start();
  • trunk/Source/WebKit/WebProcess/GPU/webrtc/AudioMediaStreamTrackRendererInternalUnitManager.h

    r277852 r284674  
    4848    AudioMediaStreamTrackRendererInternalUnitManager() = default;
    4949
    50     UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&);
     50    UniqueRef<WebCore::AudioMediaStreamTrackRendererInternalUnit> createRemoteInternalUnit(WebCore::AudioMediaStreamTrackRendererInternalUnit::RenderCallback&&, WebCore::AudioMediaStreamTrackRendererInternalUnit::ResetCallback&&);
    5151
    5252    class Proxy;
     
    5454    void remove(Proxy&);
    5555
    56     void gpuProcessConnectionClosed();
     56    void reset(AudioMediaStreamTrackRendererInternalUnitIdentifier);
     57    void restartAllUnits();
    5758
    5859private:
  • trunk/Source/WebKit/WebProcess/WebProcess.cpp

    r284525 r284674  
    13111311#if ENABLE(MEDIA_STREAM) && PLATFORM(COCOA)
    13121312    if (m_audioMediaStreamTrackRendererInternalUnitManager)
    1313         m_audioMediaStreamTrackRendererInternalUnitManager->gpuProcessConnectionClosed();
     1313        m_audioMediaStreamTrackRendererInternalUnitManager->restartAllUnits();
    13141314#endif
    13151315}
  • trunk/Source/WebKit/WebProcess/cocoa/UserMediaCaptureManager.cpp

    r284444 r284674  
    8282
    8383    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));
    8686        });
    8787    }
Note: See TracChangeset for help on using the changeset viewer.