예제 #1
0
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
  }
}
예제 #2
0
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;
  }
}