void AudioNode::DestroyMediaStream() { if (mStream) { // Remove the node pointer on the engine. AudioNodeStream* ns = mStream; MOZ_ASSERT(ns, "How come we don't have a stream here?"); MOZ_ASSERT(ns->Engine()->NodeMainThread() == this, "Invalid node reference"); ns->Engine()->ClearNode(); mStream->Destroy(); mStream = nullptr; nsCOMPtr<nsIObserverService> obs = services::GetObserverService(); if (obs) { nsAutoString id; id.AppendPrintf("%u", mId); obs->NotifyObservers(nullptr, "webaudio-node-demise", id.get()); } #ifdef DEBUG mDemiseNotified = true; #endif } }
void AudioNode::DestroyMediaStream() { if (mStream) { { // Remove the node reference on the engine, and take care to not // hold the lock when the stream gets destroyed, because that will // cause the engine to be destroyed as well, and we don't want to // be holding the lock as we're trying to destroy it! AudioNodeStream* ns = static_cast<AudioNodeStream*>(mStream.get()); MutexAutoLock lock(ns->Engine()->NodeMutex()); MOZ_ASSERT(ns, "How come we don't have a stream here?"); MOZ_ASSERT(ns->Engine()->Node() == this, "Invalid node reference"); ns->Engine()->ClearNode(); } mStream->Destroy(); mStream = nullptr; } }