void PannerNode::process(size_t framesToProcess) { AudioBus* destination = output(0)->bus(); if (!isInitialized() || !input(0)->isConnected() || !m_panner.get()) { destination->zero(); return; } AudioBus* source = input(0)->bus(); if (!source) { destination->zero(); return; } // Apply the panning effect. double azimuth; double elevation; getAzimuthElevation(&azimuth, &elevation); m_panner->pan(azimuth, elevation, source, destination, framesToProcess); // Get the distance and cone gain. double totalGain = distanceConeGain(); // Snap to desired gain at the beginning. if (m_lastGain == -1.0) m_lastGain = totalGain; // Apply gain in-place with de-zippering. destination->copyWithGainFrom(*destination, &m_lastGain, totalGain); }
void PannerNode::process(size_t framesToProcess) { AudioBus* destination = output(0)->bus(); if (!isInitialized() || !input(0)->isConnected() || !m_panner.get()) { destination->zero(); return; } AudioBus* source = input(0)->bus(); if (!source) { destination->zero(); return; } // HRTFDatabase should be loaded before proceeding for offline audio context when panningModel() is "HRTF". if (panningModel() == "HRTF" && !m_hrtfDatabaseLoader->isLoaded()) { if (context()->isOfflineContext()) m_hrtfDatabaseLoader->waitForLoaderThreadCompletion(); else { destination->zero(); return; } } // The audio thread can't block on this lock, so we use std::try_to_lock instead. std::unique_lock<std::mutex> lock(m_pannerMutex, std::try_to_lock); if (!lock.owns_lock()) { // Too bad - The try_lock() failed. We must be in the middle of changing the panner. destination->zero(); return; } // Apply the panning effect. double azimuth; double elevation; getAzimuthElevation(&azimuth, &elevation); m_panner->pan(azimuth, elevation, source, destination, framesToProcess); // Get the distance and cone gain. double totalGain = distanceConeGain(); // Snap to desired gain at the beginning. if (m_lastGain == -1.0) m_lastGain = totalGain; // Apply gain in-place with de-zippering. destination->copyWithGainFrom(*destination, &m_lastGain, totalGain); }
void PannerNode::process(size_t framesToProcess) { AudioBus* destination = output(0)->bus(); if (!isInitialized() || !input(0)->isConnected() || !m_panner.get()) { destination->zero(); return; } AudioBus* source = input(0)->bus(); if (!source) { destination->zero(); return; } // The audio thread can't block on this lock, so we call tryLock() instead. MutexTryLocker tryLocker(m_pannerLock); if (tryLocker.locked()) { // Apply the panning effect. double azimuth; double elevation; getAzimuthElevation(&azimuth, &elevation); m_panner->pan(azimuth, elevation, source, destination, framesToProcess); // Get the distance and cone gain. double totalGain = distanceConeGain(); // Snap to desired gain at the beginning. if (m_lastGain == -1.0) m_lastGain = totalGain; // Apply gain in-place with de-zippering. destination->copyWithGainFrom(*destination, &m_lastGain, totalGain); } else { // Too bad - The tryLock() failed. We must be in the middle of changing the panner. destination->zero(); } }