already_AddRefed<Promise> AudioContext::Close(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject()); nsRefPtr<Promise> promise; promise = Promise::Create(parentObject, aRv); if (aRv.Failed()) { return nullptr; } if (mIsOffline) { promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return promise.forget(); } if (mAudioContextState == AudioContextState::Closed) { promise->MaybeResolve(NS_ERROR_DOM_INVALID_STATE_ERR); return promise.forget(); } mCloseCalled = true; mPromiseGripArray.AppendElement(promise); Graph()->ApplyAudioContextOperation(DestinationStream()->AsAudioNodeStream(), AudioContextOperation::Close, promise); MediaStream* ds = DestinationStream(); if (ds) { ds->BlockStreamIfNeeded(); } return promise.forget(); }
already_AddRefed<Promise> AudioContext::Close(ErrorResult& aRv) { nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(GetParentObject()); nsRefPtr<Promise> promise; promise = Promise::Create(parentObject, aRv); if (aRv.Failed()) { return nullptr; } if (mIsOffline) { promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR); return promise.forget(); } if (mAudioContextState == AudioContextState::Closed) { promise->MaybeResolve(NS_ERROR_DOM_INVALID_STATE_ERR); return promise.forget(); } mCloseCalled = true; if (Destination()) { Destination()->DestroyAudioChannelAgent(); } mPromiseGripArray.AppendElement(promise); // This can be called when freeing a document, and the streams are dead at // this point, so we need extra null-checks. MediaStream* ds = DestinationStream(); if (ds) { Graph()->ApplyAudioContextOperation(ds->AsAudioNodeStream(), AudioContextOperation::Close, promise); if (ds) { ds->BlockStreamIfNeeded(); } } return promise.forget(); }