void MediaStreamAudioSourceNode::process(size_t numberOfFrames) { AudioBus* outputBus = output(0)->bus(); if (!audioSourceProvider()) { outputBus->zero(); return; } if (!mediaStream() || m_sourceNumberOfChannels != outputBus->numberOfChannels()) { outputBus->zero(); return; } // Use a tryLock() to avoid contention in the real-time audio thread. // If we fail to acquire the lock then the MediaStream must be in the middle of // a format change, so we output silence in this case. MutexTryLocker tryLocker(m_processLock); if (tryLocker.locked()) audioSourceProvider()->provideInput(outputBus, numberOfFrames); else { // We failed to acquire the lock. outputBus->zero(); } }
void MediaStreamAudioSourceNode::process(size_t numberOfFrames) { AudioBus* outputBus = output(0)->bus(); if (!audioSourceProvider()) { outputBus->zero(); return; } if (!mediaStream() || m_sourceNumberOfChannels != outputBus->numberOfChannels()) { outputBus->zero(); return; } // Use std::try_to_lock to avoid contention in the real-time audio thread. // If we fail to acquire the lock then the MediaStream must be in the middle of // a format change, so we output silence in this case. std::unique_lock<Lock> lock(m_processMutex, std::try_to_lock); if (!lock.owns_lock()) { // We failed to acquire the lock. outputBus->zero(); return; } audioSourceProvider()->provideInput(outputBus, numberOfFrames); }