// Constructor for rendering to the audio hardware. AudioContext::AudioContext(Document& document) : ActiveDOMObject(&document) , m_isStopScheduled(false) , m_isInitialized(false) , m_isAudioThreadFinished(false) , m_destinationNode(0) , m_isDeletionScheduled(false) , m_automaticPullNodesNeedUpdating(false) , m_connectionCount(0) , m_audioThread(0) , m_graphOwnerThread(UndefinedThreadIdentifier) , m_isOfflineContext(false) , m_activeSourceCount(0) , m_restrictions(NoRestrictions) { constructCommon(); m_destinationNode = DefaultAudioDestinationNode::create(this); // This sets in motion an asynchronous loading mechanism on another thread. // We can check m_hrtfDatabaseLoader->isLoaded() to find out whether or not it has been fully loaded. // It's not that useful to have a callback function for this since the audio thread automatically starts rendering on the graph // when this has finished (see AudioDestinationNode). m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(sampleRate()); }
// Constructor for rendering to the audio hardware. AudioContext::AudioContext(Document* document) : ActiveDOMObject(document, this) , m_isInitialized(false) , m_isAudioThreadFinished(false) , m_document(document) , m_destinationNode(0) , m_connectionCount(0) , m_audioThread(0) , m_graphOwnerThread(UndefinedThreadIdentifier) , m_isOfflineContext(false) { constructCommon(); m_destinationNode = DefaultAudioDestinationNode::create(this); // This sets in motion an asynchronous loading mechanism on another thread. // We can check m_hrtfDatabaseLoader->isLoaded() to find out whether or not it has been fully loaded. // It's not that useful to have a callback function for this since the audio thread automatically starts rendering on the graph // when this has finished (see AudioDestinationNode). m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(sampleRate()); // FIXME: for now default AudioContext does not need an explicit startRendering() call. // We may want to consider requiring it for symmetry with OfflineAudioContext m_destinationNode->startRendering(); }
// Constructor for offline (non-realtime) rendering. AudioContext::AudioContext(Document& document, unsigned numberOfChannels, size_t numberOfFrames, float sampleRate) : ActiveDOMObject(&document) , m_isOfflineContext(true) , m_mediaSession(PlatformMediaSession::create(*this)) , m_eventQueue(std::make_unique<GenericEventQueue>(*this)) , m_graphOwnerThread(UndefinedThreadIdentifier) { constructCommon(); // Create a new destination for offline rendering. m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampleRate); m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTarget.get()); }
// Constructor for rendering to the audio hardware. AudioContext::AudioContext(Document& document) : ActiveDOMObject(&document) , m_mediaSession(PlatformMediaSession::create(*this)) , m_eventQueue(std::make_unique<GenericEventQueue>(*this)) , m_graphOwnerThread(UndefinedThreadIdentifier) { constructCommon(); m_destinationNode = DefaultAudioDestinationNode::create(this); // Initialize the destination node's muted state to match the page's current muted state. pageMutedStateDidChange(); }
// Constructor for offline (non-realtime) rendering. AudioContext::AudioContext(Document* document, unsigned numberOfChannels, size_t numberOfFrames, double sampleRate) : ActiveDOMObject(document, this) , m_isInitialized(false) , m_isAudioThreadFinished(false) , m_document(document) , m_destinationNode(0) , m_connectionCount(0) , m_audioThread(0) , m_graphOwnerThread(UndefinedThreadIdentifier) , m_isOfflineContext(true) { constructCommon(); // FIXME: the passed in sampleRate MUST match the hardware sample-rate since HRTFDatabaseLoader is a singleton. m_hrtfDatabaseLoader = HRTFDatabaseLoader::createAndLoadAsynchronouslyIfNecessary(sampleRate); // Create a new destination for offline rendering. m_renderTarget = AudioBuffer::create(numberOfChannels, numberOfFrames, sampleRate); m_destinationNode = OfflineAudioDestinationNode::create(this, m_renderTarget.get()); }