Bug 1341555 - Consolidate use of the MSG's AbstractMainThread, and stop having AbstractMainThread on MediaStreams. r=pehrsons
MozReview-Commit-ID: 5hGDQcfpH6a
This commit is contained in:
@@ -4869,8 +4869,7 @@ public:
|
|||||||
mBlocked(false),
|
mBlocked(false),
|
||||||
mFinished(false),
|
mFinished(false),
|
||||||
mMutex(aName),
|
mMutex(aName),
|
||||||
mPendingNotifyOutput(false),
|
mPendingNotifyOutput(false)
|
||||||
mAbstractMainThread(aElement->AbstractMainThread())
|
|
||||||
{}
|
{}
|
||||||
void Forget()
|
void Forget()
|
||||||
{
|
{
|
||||||
@@ -4938,14 +4937,12 @@ public:
|
|||||||
this,
|
this,
|
||||||
&StreamListener::DoNotifyUnblocked);
|
&StreamListener::DoNotifyUnblocked);
|
||||||
}
|
}
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
|
||||||
event.forget());
|
|
||||||
}
|
}
|
||||||
virtual void NotifyHasCurrentData(MediaStreamGraph* aGraph) override
|
virtual void NotifyHasCurrentData(MediaStreamGraph* aGraph) override
|
||||||
{
|
{
|
||||||
MutexAutoLock lock(mMutex);
|
MutexAutoLock lock(mMutex);
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod(
|
NewRunnableMethod(
|
||||||
"dom::HTMLMediaElement::StreamListener::DoNotifyHaveCurrentData",
|
"dom::HTMLMediaElement::StreamListener::DoNotifyHaveCurrentData",
|
||||||
this,
|
this,
|
||||||
@@ -4959,7 +4956,6 @@ public:
|
|||||||
return;
|
return;
|
||||||
mPendingNotifyOutput = true;
|
mPendingNotifyOutput = true;
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod("dom::HTMLMediaElement::StreamListener::DoNotifyOutput",
|
NewRunnableMethod("dom::HTMLMediaElement::StreamListener::DoNotifyOutput",
|
||||||
this,
|
this,
|
||||||
&StreamListener::DoNotifyOutput));
|
&StreamListener::DoNotifyOutput));
|
||||||
@@ -4975,7 +4971,6 @@ private:
|
|||||||
// mMutex protects the fields below; they can be accessed on any thread
|
// mMutex protects the fields below; they can be accessed on any thread
|
||||||
Mutex mMutex;
|
Mutex mMutex;
|
||||||
bool mPendingNotifyOutput;
|
bool mPendingNotifyOutput;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class HTMLMediaElement::MediaStreamTracksAvailableCallback:
|
class HTMLMediaElement::MediaStreamTracksAvailableCallback:
|
||||||
|
|||||||
@@ -30,8 +30,11 @@ namespace mozilla
|
|||||||
// We are mixing to mono until PeerConnection can accept stereo
|
// We are mixing to mono until PeerConnection can accept stereo
|
||||||
static const uint32_t MONO = 1;
|
static const uint32_t MONO = 1;
|
||||||
|
|
||||||
AudioCaptureStream::AudioCaptureStream(TrackID aTrackId, AbstractThread* aMainThread)
|
AudioCaptureStream::AudioCaptureStream(TrackID aTrackId)
|
||||||
: ProcessedMediaStream(aMainThread), mTrackId(aTrackId), mStarted(false), mTrackCreated(false)
|
: ProcessedMediaStream()
|
||||||
|
, mTrackId(aTrackId)
|
||||||
|
, mStarted(false)
|
||||||
|
, mTrackCreated(false)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
MOZ_COUNT_CTOR(AudioCaptureStream);
|
MOZ_COUNT_CTOR(AudioCaptureStream);
|
||||||
|
|||||||
@@ -24,7 +24,7 @@ class AudioCaptureStream : public ProcessedMediaStream,
|
|||||||
public MixerCallbackReceiver
|
public MixerCallbackReceiver
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
AudioCaptureStream(TrackID aTrackId, AbstractThread* aMainThread);
|
AudioCaptureStream(TrackID aTrackId);
|
||||||
virtual ~AudioCaptureStream();
|
virtual ~AudioCaptureStream();
|
||||||
|
|
||||||
void Start();
|
void Start();
|
||||||
|
|||||||
@@ -143,7 +143,6 @@ class DOMMediaStream::OwnedStreamListener : public MediaStreamListener {
|
|||||||
public:
|
public:
|
||||||
explicit OwnedStreamListener(DOMMediaStream* aStream)
|
explicit OwnedStreamListener(DOMMediaStream* aStream)
|
||||||
: mStream(aStream)
|
: mStream(aStream)
|
||||||
, mAbstractMainThread(aStream->mAbstractMainThread)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void Forget() { mStream = nullptr; }
|
void Forget() { mStream = nullptr; }
|
||||||
@@ -224,7 +223,6 @@ public:
|
|||||||
{
|
{
|
||||||
if (aTrackEvents & TrackEventCommand::TRACK_EVENT_CREATED) {
|
if (aTrackEvents & TrackEventCommand::TRACK_EVENT_CREATED) {
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod<TrackID,
|
NewRunnableMethod<TrackID,
|
||||||
MediaSegment::Type,
|
MediaSegment::Type,
|
||||||
RefPtr<MediaStream>,
|
RefPtr<MediaStream>,
|
||||||
@@ -238,7 +236,6 @@ public:
|
|||||||
aInputTrackID));
|
aInputTrackID));
|
||||||
} else if (aTrackEvents & TrackEventCommand::TRACK_EVENT_ENDED) {
|
} else if (aTrackEvents & TrackEventCommand::TRACK_EVENT_ENDED) {
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod<RefPtr<MediaStream>, TrackID, TrackID>(
|
NewRunnableMethod<RefPtr<MediaStream>, TrackID, TrackID>(
|
||||||
"DOMMediaStream::OwnedStreamListener::DoNotifyTrackEnded",
|
"DOMMediaStream::OwnedStreamListener::DoNotifyTrackEnded",
|
||||||
this,
|
this,
|
||||||
@@ -252,8 +249,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
// These fields may only be accessed on the main thread
|
// These fields may only be accessed on the main thread
|
||||||
DOMMediaStream* mStream;
|
DOMMediaStream* mStream;
|
||||||
|
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -265,7 +260,6 @@ class DOMMediaStream::PlaybackStreamListener : public MediaStreamListener {
|
|||||||
public:
|
public:
|
||||||
explicit PlaybackStreamListener(DOMMediaStream* aStream)
|
explicit PlaybackStreamListener(DOMMediaStream* aStream)
|
||||||
: mStream(aStream)
|
: mStream(aStream)
|
||||||
, mAbstractMainThread(aStream->mAbstractMainThread)
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void Forget()
|
void Forget()
|
||||||
@@ -309,7 +303,6 @@ public:
|
|||||||
void NotifyFinishedTrackCreation(MediaStreamGraph* aGraph) override
|
void NotifyFinishedTrackCreation(MediaStreamGraph* aGraph) override
|
||||||
{
|
{
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod(
|
NewRunnableMethod(
|
||||||
"DOMMediaStream::PlaybackStreamListener::DoNotifyFinishedTrackCreation",
|
"DOMMediaStream::PlaybackStreamListener::DoNotifyFinishedTrackCreation",
|
||||||
this,
|
this,
|
||||||
@@ -322,7 +315,6 @@ public:
|
|||||||
{
|
{
|
||||||
if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
|
if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod(
|
NewRunnableMethod(
|
||||||
"DOMMediaStream::PlaybackStreamListener::DoNotifyFinished",
|
"DOMMediaStream::PlaybackStreamListener::DoNotifyFinished",
|
||||||
this,
|
this,
|
||||||
@@ -333,8 +325,6 @@ public:
|
|||||||
private:
|
private:
|
||||||
// These fields may only be accessed on the main thread
|
// These fields may only be accessed on the main thread
|
||||||
DOMMediaStream* mStream;
|
DOMMediaStream* mStream;
|
||||||
|
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class DOMMediaStream::PlaybackTrackListener : public MediaStreamTrackConsumer
|
class DOMMediaStream::PlaybackTrackListener : public MediaStreamTrackConsumer
|
||||||
@@ -436,8 +426,7 @@ DOMMediaStream::DOMMediaStream(nsPIDOMWindowInner* aWindow,
|
|||||||
mTracksPendingRemoval(0), mTrackSourceGetter(aTrackSourceGetter),
|
mTracksPendingRemoval(0), mTrackSourceGetter(aTrackSourceGetter),
|
||||||
mPlaybackTrackListener(MakeAndAddRef<PlaybackTrackListener>(this)),
|
mPlaybackTrackListener(MakeAndAddRef<PlaybackTrackListener>(this)),
|
||||||
mTracksCreated(false), mNotifiedOfMediaStreamGraphShutdown(false),
|
mTracksCreated(false), mNotifiedOfMediaStreamGraphShutdown(false),
|
||||||
mActive(false), mSetInactiveOnFinish(false),
|
mActive(false), mSetInactiveOnFinish(false)
|
||||||
mAbstractMainThread(aWindow ? aWindow->GetDocGroup()->AbstractMainThreadFor(TaskCategory::Other) : nullptr)
|
|
||||||
{
|
{
|
||||||
nsresult rv;
|
nsresult rv;
|
||||||
nsCOMPtr<nsIUUIDGenerator> uuidgen =
|
nsCOMPtr<nsIUUIDGenerator> uuidgen =
|
||||||
@@ -881,8 +870,7 @@ DOMMediaStream::SetInactiveOnFinish()
|
|||||||
void
|
void
|
||||||
DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
|
DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(mAbstractMainThread);
|
InitInputStreamCommon(aGraph->CreateSourceStream(), aGraph);
|
||||||
InitInputStreamCommon(aGraph->CreateSourceStream(mAbstractMainThread), aGraph);
|
|
||||||
InitOwnedStreamCommon(aGraph);
|
InitOwnedStreamCommon(aGraph);
|
||||||
InitPlaybackStreamCommon(aGraph);
|
InitPlaybackStreamCommon(aGraph);
|
||||||
}
|
}
|
||||||
@@ -890,8 +878,7 @@ DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
|
|||||||
void
|
void
|
||||||
DOMMediaStream::InitTrackUnionStream(MediaStreamGraph* aGraph)
|
DOMMediaStream::InitTrackUnionStream(MediaStreamGraph* aGraph)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(mAbstractMainThread);
|
InitInputStreamCommon(aGraph->CreateTrackUnionStream(), aGraph);
|
||||||
InitInputStreamCommon(aGraph->CreateTrackUnionStream(mAbstractMainThread), aGraph);
|
|
||||||
InitOwnedStreamCommon(aGraph);
|
InitOwnedStreamCommon(aGraph);
|
||||||
InitPlaybackStreamCommon(aGraph);
|
InitPlaybackStreamCommon(aGraph);
|
||||||
}
|
}
|
||||||
@@ -899,14 +886,13 @@ DOMMediaStream::InitTrackUnionStream(MediaStreamGraph* aGraph)
|
|||||||
void
|
void
|
||||||
DOMMediaStream::InitAudioCaptureStream(nsIPrincipal* aPrincipal, MediaStreamGraph* aGraph)
|
DOMMediaStream::InitAudioCaptureStream(nsIPrincipal* aPrincipal, MediaStreamGraph* aGraph)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(mAbstractMainThread);
|
|
||||||
const TrackID AUDIO_TRACK = 1;
|
const TrackID AUDIO_TRACK = 1;
|
||||||
|
|
||||||
RefPtr<BasicTrackSource> audioCaptureSource =
|
RefPtr<BasicTrackSource> audioCaptureSource =
|
||||||
new BasicTrackSource(aPrincipal, MediaSourceEnum::AudioCapture);
|
new BasicTrackSource(aPrincipal, MediaSourceEnum::AudioCapture);
|
||||||
|
|
||||||
AudioCaptureStream* audioCaptureStream =
|
AudioCaptureStream* audioCaptureStream =
|
||||||
static_cast<AudioCaptureStream*>(aGraph->CreateAudioCaptureStream(AUDIO_TRACK, mAbstractMainThread));
|
static_cast<AudioCaptureStream*>(aGraph->CreateAudioCaptureStream(AUDIO_TRACK));
|
||||||
InitInputStreamCommon(audioCaptureStream, aGraph);
|
InitInputStreamCommon(audioCaptureStream, aGraph);
|
||||||
InitOwnedStreamCommon(aGraph);
|
InitOwnedStreamCommon(aGraph);
|
||||||
InitPlaybackStreamCommon(aGraph);
|
InitPlaybackStreamCommon(aGraph);
|
||||||
@@ -930,10 +916,9 @@ DOMMediaStream::InitInputStreamCommon(MediaStream* aStream,
|
|||||||
void
|
void
|
||||||
DOMMediaStream::InitOwnedStreamCommon(MediaStreamGraph* aGraph)
|
DOMMediaStream::InitOwnedStreamCommon(MediaStreamGraph* aGraph)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(mAbstractMainThread);
|
|
||||||
MOZ_ASSERT(!mPlaybackStream, "Owned stream must be initialized before playback stream");
|
MOZ_ASSERT(!mPlaybackStream, "Owned stream must be initialized before playback stream");
|
||||||
|
|
||||||
mOwnedStream = aGraph->CreateTrackUnionStream(mAbstractMainThread);
|
mOwnedStream = aGraph->CreateTrackUnionStream();
|
||||||
mOwnedStream->SetAutofinish(true);
|
mOwnedStream->SetAutofinish(true);
|
||||||
mOwnedStream->RegisterUser();
|
mOwnedStream->RegisterUser();
|
||||||
if (mInputStream) {
|
if (mInputStream) {
|
||||||
@@ -948,8 +933,7 @@ DOMMediaStream::InitOwnedStreamCommon(MediaStreamGraph* aGraph)
|
|||||||
void
|
void
|
||||||
DOMMediaStream::InitPlaybackStreamCommon(MediaStreamGraph* aGraph)
|
DOMMediaStream::InitPlaybackStreamCommon(MediaStreamGraph* aGraph)
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(mAbstractMainThread);
|
mPlaybackStream = aGraph->CreateTrackUnionStream();
|
||||||
mPlaybackStream = aGraph->CreateTrackUnionStream(mAbstractMainThread);
|
|
||||||
mPlaybackStream->SetAutofinish(true);
|
mPlaybackStream->SetAutofinish(true);
|
||||||
mPlaybackStream->RegisterUser();
|
mPlaybackStream->RegisterUser();
|
||||||
if (mOwnedStream) {
|
if (mOwnedStream) {
|
||||||
|
|||||||
@@ -590,8 +590,6 @@ public:
|
|||||||
// a dead pointer. Main thread only.
|
// a dead pointer. Main thread only.
|
||||||
void UnregisterTrackListener(TrackListener* aListener);
|
void UnregisterTrackListener(TrackListener* aListener);
|
||||||
|
|
||||||
AbstractThread* AbstractMainThread() const { return mAbstractMainThread; }
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual ~DOMMediaStream();
|
virtual ~DOMMediaStream();
|
||||||
|
|
||||||
@@ -756,7 +754,6 @@ private:
|
|||||||
nsCOMPtr<nsIPrincipal> mVideoPrincipal;
|
nsCOMPtr<nsIPrincipal> mVideoPrincipal;
|
||||||
nsTArray<dom::PrincipalChangeObserver<DOMMediaStream>*> mPrincipalChangeObservers;
|
nsTArray<dom::PrincipalChangeObserver<DOMMediaStream>*> mPrincipalChangeObservers;
|
||||||
CORSMode mCORSMode;
|
CORSMode mCORSMode;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_DEFINE_STATIC_IID_ACCESSOR(DOMMediaStream,
|
NS_DEFINE_STATIC_IID_ACCESSOR(DOMMediaStream,
|
||||||
|
|||||||
@@ -1084,8 +1084,7 @@ public:
|
|||||||
domStream =
|
domStream =
|
||||||
DOMMediaStream::CreateAudioCaptureStreamAsInput(window, principal, msg);
|
DOMMediaStream::CreateAudioCaptureStreamAsInput(window, principal, msg);
|
||||||
|
|
||||||
stream = msg->CreateSourceStream(
|
stream = msg->CreateSourceStream(); // Placeholder
|
||||||
globalWindow->AbstractMainThreadFor(TaskCategory::Other)); // Placeholder
|
|
||||||
msg->RegisterCaptureStreamForWindow(
|
msg->RegisterCaptureStreamForWindow(
|
||||||
mWindowID, domStream->GetInputStream()->AsProcessedStream());
|
mWindowID, domStream->GetInputStream()->AsProcessedStream());
|
||||||
window->SetAudioCapture(true);
|
window->SetAudioCapture(true);
|
||||||
|
|||||||
@@ -433,7 +433,6 @@ public:
|
|||||||
, mIsStartEventFired(false)
|
, mIsStartEventFired(false)
|
||||||
, mNeedSessionEndTask(true)
|
, mNeedSessionEndTask(true)
|
||||||
, mSelectedVideoTrackID(TRACK_NONE)
|
, mSelectedVideoTrackID(TRACK_NONE)
|
||||||
, mAbstractMainThread(aRecorder->mAbstractMainThread)
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
|
|
||||||
@@ -489,7 +488,7 @@ public:
|
|||||||
// Create a Track Union Stream
|
// Create a Track Union Stream
|
||||||
MediaStreamGraph* gm = mRecorder->GetSourceMediaStream()->Graph();
|
MediaStreamGraph* gm = mRecorder->GetSourceMediaStream()->Graph();
|
||||||
TrackRate trackRate = gm->GraphRate();
|
TrackRate trackRate = gm->GraphRate();
|
||||||
mTrackUnionStream = gm->CreateTrackUnionStream(mAbstractMainThread);
|
mTrackUnionStream = gm->CreateTrackUnionStream();
|
||||||
MOZ_ASSERT(mTrackUnionStream, "CreateTrackUnionStream failed");
|
MOZ_ASSERT(mTrackUnionStream, "CreateTrackUnionStream failed");
|
||||||
|
|
||||||
mTrackUnionStream->SetAutofinish(true);
|
mTrackUnionStream->SetAutofinish(true);
|
||||||
@@ -952,7 +951,6 @@ private:
|
|||||||
// Main thread only.
|
// Main thread only.
|
||||||
bool mNeedSessionEndTask;
|
bool mNeedSessionEndTask;
|
||||||
TrackID mSelectedVideoTrackID;
|
TrackID mSelectedVideoTrackID;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
NS_IMPL_ISUPPORTS(MediaRecorder::Session, nsIObserver)
|
NS_IMPL_ISUPPORTS(MediaRecorder::Session, nsIObserver)
|
||||||
@@ -971,7 +969,6 @@ MediaRecorder::MediaRecorder(DOMMediaStream& aSourceMediaStream,
|
|||||||
nsPIDOMWindowInner* aOwnerWindow)
|
nsPIDOMWindowInner* aOwnerWindow)
|
||||||
: DOMEventTargetHelper(aOwnerWindow)
|
: DOMEventTargetHelper(aOwnerWindow)
|
||||||
, mState(RecordingState::Inactive)
|
, mState(RecordingState::Inactive)
|
||||||
, mAbstractMainThread(aSourceMediaStream.AbstractMainThread())
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aOwnerWindow);
|
MOZ_ASSERT(aOwnerWindow);
|
||||||
MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
|
MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
|
||||||
@@ -985,7 +982,6 @@ MediaRecorder::MediaRecorder(AudioNode& aSrcAudioNode,
|
|||||||
nsPIDOMWindowInner* aOwnerWindow)
|
nsPIDOMWindowInner* aOwnerWindow)
|
||||||
: DOMEventTargetHelper(aOwnerWindow)
|
: DOMEventTargetHelper(aOwnerWindow)
|
||||||
, mState(RecordingState::Inactive)
|
, mState(RecordingState::Inactive)
|
||||||
, mAbstractMainThread(aSrcAudioNode.AbstractMainThread())
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aOwnerWindow);
|
MOZ_ASSERT(aOwnerWindow);
|
||||||
MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
|
MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
|
||||||
|
|||||||
@@ -159,7 +159,6 @@ protected:
|
|||||||
uint32_t mVideoBitsPerSecond;
|
uint32_t mVideoBitsPerSecond;
|
||||||
uint32_t mBitsPerSecond;
|
uint32_t mBitsPerSecond;
|
||||||
|
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
private:
|
private:
|
||||||
// Register MediaRecorder into Document to listen the activity changes.
|
// Register MediaRecorder into Document to listen the activity changes.
|
||||||
void RegisterActivityObserver();
|
void RegisterActivityObserver();
|
||||||
|
|||||||
@@ -1012,9 +1012,11 @@ MediaStreamGraphImpl::OpenAudioInput(int aID,
|
|||||||
{
|
{
|
||||||
// So, so, so annoying. Can't AppendMessage except on Mainthread
|
// So, so, so annoying. Can't AppendMessage except on Mainthread
|
||||||
if (!NS_IsMainThread()) {
|
if (!NS_IsMainThread()) {
|
||||||
RefPtr<nsIRunnable> runnable = WrapRunnable(this,
|
RefPtr<nsIRunnable> runnable =
|
||||||
&MediaStreamGraphImpl::OpenAudioInput,
|
WrapRunnable(this,
|
||||||
aID, RefPtr<AudioDataListener>(aListener));
|
&MediaStreamGraphImpl::OpenAudioInput,
|
||||||
|
aID,
|
||||||
|
RefPtr<AudioDataListener>(aListener));
|
||||||
mAbstractMainThread->Dispatch(runnable.forget());
|
mAbstractMainThread->Dispatch(runnable.forget());
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
}
|
}
|
||||||
@@ -1083,9 +1085,10 @@ MediaStreamGraphImpl::CloseAudioInput(AudioDataListener *aListener)
|
|||||||
{
|
{
|
||||||
// So, so, so annoying. Can't AppendMessage except on Mainthread
|
// So, so, so annoying. Can't AppendMessage except on Mainthread
|
||||||
if (!NS_IsMainThread()) {
|
if (!NS_IsMainThread()) {
|
||||||
RefPtr<nsIRunnable> runnable = WrapRunnable(this,
|
RefPtr<nsIRunnable> runnable =
|
||||||
&MediaStreamGraphImpl::CloseAudioInput,
|
WrapRunnable(this,
|
||||||
RefPtr<AudioDataListener>(aListener));
|
&MediaStreamGraphImpl::CloseAudioInput,
|
||||||
|
RefPtr<AudioDataListener>(aListener));
|
||||||
mAbstractMainThread->Dispatch(runnable.forget());
|
mAbstractMainThread->Dispatch(runnable.forget());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -1889,7 +1892,7 @@ MediaStreamGraphImpl::Dispatch(already_AddRefed<nsIRunnable>&& aRunnable)
|
|||||||
mAbstractMainThread->Dispatch(Move(aRunnable));
|
mAbstractMainThread->Dispatch(Move(aRunnable));
|
||||||
}
|
}
|
||||||
|
|
||||||
MediaStream::MediaStream(AbstractThread* aMainThread)
|
MediaStream::MediaStream()
|
||||||
: mTracksStartTime(0)
|
: mTracksStartTime(0)
|
||||||
, mStartBlocking(GRAPH_TIME_MAX)
|
, mStartBlocking(GRAPH_TIME_MAX)
|
||||||
, mSuspendedCount(0)
|
, mSuspendedCount(0)
|
||||||
@@ -1905,7 +1908,6 @@ MediaStream::MediaStream(AbstractThread* aMainThread)
|
|||||||
, mNrOfMainThreadUsers(0)
|
, mNrOfMainThreadUsers(0)
|
||||||
, mGraph(nullptr)
|
, mGraph(nullptr)
|
||||||
, mAudioChannelType(dom::AudioChannel::Normal)
|
, mAudioChannelType(dom::AudioChannel::Normal)
|
||||||
, mAbstractMainThread(aMainThread)
|
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(MediaStream);
|
MOZ_COUNT_CTOR(MediaStream);
|
||||||
}
|
}
|
||||||
@@ -2553,18 +2555,14 @@ MediaStream::RunAfterPendingUpdates(already_AddRefed<nsIRunnable> aRunnable)
|
|||||||
|
|
||||||
class Message : public ControlMessage {
|
class Message : public ControlMessage {
|
||||||
public:
|
public:
|
||||||
Message(MediaStream* aStream,
|
Message(MediaStream* aStream, already_AddRefed<nsIRunnable> aRunnable)
|
||||||
already_AddRefed<nsIRunnable> aRunnable,
|
|
||||||
AbstractThread* aMainThread)
|
|
||||||
: ControlMessage(aStream)
|
: ControlMessage(aStream)
|
||||||
, mRunnable(aRunnable)
|
, mRunnable(aRunnable)
|
||||||
, mAbstractMainThread(aMainThread)
|
{}
|
||||||
{}
|
|
||||||
void Run() override
|
void Run() override
|
||||||
{
|
{
|
||||||
mStream->Graph()->
|
mStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
mRunnable.forget());
|
||||||
mRunnable.forget());
|
|
||||||
}
|
}
|
||||||
void RunDuringShutdown() override
|
void RunDuringShutdown() override
|
||||||
{
|
{
|
||||||
@@ -2575,11 +2573,9 @@ MediaStream::RunAfterPendingUpdates(already_AddRefed<nsIRunnable> aRunnable)
|
|||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
nsCOMPtr<nsIRunnable> mRunnable;
|
nsCOMPtr<nsIRunnable> mRunnable;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
graph->AppendMessage(
|
graph->AppendMessage(MakeUnique<Message>(this, runnable.forget()));
|
||||||
MakeUnique<Message>(this, runnable.forget(), mAbstractMainThread));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -2691,16 +2687,16 @@ MediaStream::AddMainThreadListener(MainThreadMediaStreamListener* aListener)
|
|||||||
};
|
};
|
||||||
|
|
||||||
nsCOMPtr<nsIRunnable> runnable = new NotifyRunnable(this);
|
nsCOMPtr<nsIRunnable> runnable = new NotifyRunnable(this);
|
||||||
mAbstractMainThread->Dispatch(runnable.forget());
|
GraphImpl()->Dispatch(runnable.forget());
|
||||||
}
|
}
|
||||||
|
|
||||||
SourceMediaStream::SourceMediaStream(AbstractThread* aMainThread) :
|
SourceMediaStream::SourceMediaStream()
|
||||||
MediaStream(aMainThread),
|
: MediaStream()
|
||||||
mMutex("mozilla::media::SourceMediaStream"),
|
, mMutex("mozilla::media::SourceMediaStream")
|
||||||
mUpdateKnownTracksTime(0),
|
, mUpdateKnownTracksTime(0)
|
||||||
mPullEnabled(false),
|
, mPullEnabled(false)
|
||||||
mUpdateFinished(false),
|
, mUpdateFinished(false)
|
||||||
mNeedsMixing(false)
|
, mNeedsMixing(false)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3290,18 +3286,20 @@ MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
|
|||||||
Message(MediaInputPort* aPort,
|
Message(MediaInputPort* aPort,
|
||||||
TrackID aTrackId,
|
TrackID aTrackId,
|
||||||
BlockingMode aBlockingMode,
|
BlockingMode aBlockingMode,
|
||||||
already_AddRefed<nsIRunnable> aRunnable,
|
already_AddRefed<nsIRunnable> aRunnable)
|
||||||
AbstractThread* aMainThread)
|
: ControlMessage(aPort->GetDestination())
|
||||||
: ControlMessage(aPort->GetDestination()),
|
, mPort(aPort)
|
||||||
mPort(aPort), mTrackId(aTrackId), mBlockingMode(aBlockingMode),
|
, mTrackId(aTrackId)
|
||||||
mRunnable(aRunnable), mAbstractMainThread(aMainThread) {}
|
, mBlockingMode(aBlockingMode)
|
||||||
|
, mRunnable(aRunnable)
|
||||||
|
{
|
||||||
|
}
|
||||||
void Run() override
|
void Run() override
|
||||||
{
|
{
|
||||||
mPort->BlockSourceTrackIdImpl(mTrackId, mBlockingMode);
|
mPort->BlockSourceTrackIdImpl(mTrackId, mBlockingMode);
|
||||||
if (mRunnable) {
|
if (mRunnable) {
|
||||||
mStream->Graph()->
|
mStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
mRunnable.forget());
|
||||||
mRunnable.forget());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void RunDuringShutdown() override
|
void RunDuringShutdown() override
|
||||||
@@ -3312,7 +3310,6 @@ MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
|
|||||||
TrackID mTrackId;
|
TrackID mTrackId;
|
||||||
BlockingMode mBlockingMode;
|
BlockingMode mBlockingMode;
|
||||||
nsCOMPtr<nsIRunnable> mRunnable;
|
nsCOMPtr<nsIRunnable> mRunnable;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MOZ_ASSERT(IsTrackIDExplicit(aTrackId),
|
MOZ_ASSERT(IsTrackIDExplicit(aTrackId),
|
||||||
@@ -3324,9 +3321,8 @@ MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
|
|||||||
pledge->Resolve(true);
|
pledge->Resolve(true);
|
||||||
return NS_OK;
|
return NS_OK;
|
||||||
});
|
});
|
||||||
GraphImpl()->AppendMessage(MakeUnique<Message>(this, aTrackId, aBlockingMode,
|
GraphImpl()->AppendMessage(
|
||||||
runnable.forget(),
|
MakeUnique<Message>(this, aTrackId, aBlockingMode, runnable.forget()));
|
||||||
mAbstractMainThread));
|
|
||||||
return pledge.forget();
|
return pledge.forget();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3364,9 +3360,8 @@ ProcessedMediaStream::AllocateInputPort(MediaStream* aStream, TrackID aTrackID,
|
|||||||
"Only TRACK_ANY and explicit ID are allowed for destination track");
|
"Only TRACK_ANY and explicit ID are allowed for destination track");
|
||||||
MOZ_ASSERT(aTrackID != TRACK_ANY || aDestTrackID == TRACK_ANY,
|
MOZ_ASSERT(aTrackID != TRACK_ANY || aDestTrackID == TRACK_ANY,
|
||||||
"Generic MediaInputPort cannot produce a single destination track");
|
"Generic MediaInputPort cannot produce a single destination track");
|
||||||
RefPtr<MediaInputPort> port =
|
RefPtr<MediaInputPort> port = new MediaInputPort(
|
||||||
new MediaInputPort(aStream, aTrackID, this, aDestTrackID,
|
aStream, aTrackID, this, aDestTrackID, aInputNumber, aOutputNumber);
|
||||||
aInputNumber, aOutputNumber, mAbstractMainThread);
|
|
||||||
if (aBlockedTracks) {
|
if (aBlockedTracks) {
|
||||||
for (TrackID trackID : *aBlockedTracks) {
|
for (TrackID trackID : *aBlockedTracks) {
|
||||||
port->BlockSourceTrackIdImpl(trackID, BlockingMode::CREATION);
|
port->BlockSourceTrackIdImpl(trackID, BlockingMode::CREATION);
|
||||||
@@ -3449,6 +3444,7 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
|
|||||||
, mNonRealtimeProcessing(false)
|
, mNonRealtimeProcessing(false)
|
||||||
, mStreamOrderDirty(false)
|
, mStreamOrderDirty(false)
|
||||||
, mLatencyLog(AsyncLatencyLogger::Get())
|
, mLatencyLog(AsyncLatencyLogger::Get())
|
||||||
|
, mAbstractMainThread(aMainThread)
|
||||||
#ifdef MOZ_WEBRTC
|
#ifdef MOZ_WEBRTC
|
||||||
, mFarendObserverRef(nullptr)
|
, mFarendObserverRef(nullptr)
|
||||||
#endif
|
#endif
|
||||||
@@ -3457,7 +3453,6 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
|
|||||||
, mCanRunMessagesSynchronously(false)
|
, mCanRunMessagesSynchronously(false)
|
||||||
#endif
|
#endif
|
||||||
, mAudioChannel(aChannel)
|
, mAudioChannel(aChannel)
|
||||||
, mAbstractMainThread(aMainThread)
|
|
||||||
{
|
{
|
||||||
if (mRealtime) {
|
if (mRealtime) {
|
||||||
if (aDriverRequested == AUDIO_THREAD_DRIVER) {
|
if (aDriverRequested == AUDIO_THREAD_DRIVER) {
|
||||||
@@ -3475,6 +3470,13 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
|
|||||||
RegisterWeakAsyncMemoryReporter(this);
|
RegisterWeakAsyncMemoryReporter(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AbstractThread*
|
||||||
|
MediaStreamGraph::AbstractMainThread()
|
||||||
|
{
|
||||||
|
MOZ_ASSERT(static_cast<MediaStreamGraphImpl*>(this)->mAbstractMainThread);
|
||||||
|
return static_cast<MediaStreamGraphImpl*>(this)->mAbstractMainThread;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaStreamGraphImpl::Destroy()
|
MediaStreamGraphImpl::Destroy()
|
||||||
{
|
{
|
||||||
@@ -3580,11 +3582,11 @@ MediaStreamGraph::CreateNonRealtimeInstance(TrackRate aSampleRate,
|
|||||||
NS_ASSERTION(NS_IsMainThread(), "Main thread only");
|
NS_ASSERTION(NS_IsMainThread(), "Main thread only");
|
||||||
|
|
||||||
nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(aWindow);
|
nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(aWindow);
|
||||||
MediaStreamGraphImpl* graph =
|
MediaStreamGraphImpl* graph = new MediaStreamGraphImpl(
|
||||||
new MediaStreamGraphImpl(OFFLINE_THREAD_DRIVER,
|
OFFLINE_THREAD_DRIVER,
|
||||||
aSampleRate,
|
aSampleRate,
|
||||||
AudioChannel::Normal,
|
AudioChannel::Normal,
|
||||||
parentObject->AbstractMainThreadFor(TaskCategory::Other));
|
parentObject->AbstractMainThreadFor(TaskCategory::Other));
|
||||||
|
|
||||||
LOG(LogLevel::Debug, ("Starting up Offline MediaStreamGraph %p", graph));
|
LOG(LogLevel::Debug, ("Starting up Offline MediaStreamGraph %p", graph));
|
||||||
|
|
||||||
@@ -3755,25 +3757,25 @@ FinishCollectReports(nsIHandleReportCallback* aHandleReport, nsISupports* aData,
|
|||||||
}
|
}
|
||||||
|
|
||||||
SourceMediaStream*
|
SourceMediaStream*
|
||||||
MediaStreamGraph::CreateSourceStream(AbstractThread* aMainThread)
|
MediaStreamGraph::CreateSourceStream()
|
||||||
{
|
{
|
||||||
SourceMediaStream* stream = new SourceMediaStream(aMainThread);
|
SourceMediaStream* stream = new SourceMediaStream();
|
||||||
AddStream(stream);
|
AddStream(stream);
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessedMediaStream*
|
ProcessedMediaStream*
|
||||||
MediaStreamGraph::CreateTrackUnionStream(AbstractThread* aMainThread)
|
MediaStreamGraph::CreateTrackUnionStream()
|
||||||
{
|
{
|
||||||
TrackUnionStream* stream = new TrackUnionStream(aMainThread);
|
TrackUnionStream* stream = new TrackUnionStream();
|
||||||
AddStream(stream);
|
AddStream(stream);
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
|
|
||||||
ProcessedMediaStream*
|
ProcessedMediaStream*
|
||||||
MediaStreamGraph::CreateAudioCaptureStream(TrackID aTrackId, AbstractThread* aMainThread)
|
MediaStreamGraph::CreateAudioCaptureStream(TrackID aTrackId)
|
||||||
{
|
{
|
||||||
AudioCaptureStream* stream = new AudioCaptureStream(aTrackId, aMainThread);
|
AudioCaptureStream* stream = new AudioCaptureStream(aTrackId);
|
||||||
AddStream(stream);
|
AddStream(stream);
|
||||||
return stream;
|
return stream;
|
||||||
}
|
}
|
||||||
@@ -4176,14 +4178,12 @@ MediaStreamGraphImpl::ConnectToCaptureStream(uint64_t aWindowId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
MediaStreamGraph::
|
MediaStreamGraph::DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(AbstractThread* aMainThread,
|
already_AddRefed<nsIRunnable> aRunnable)
|
||||||
already_AddRefed<nsIRunnable> aRunnable)
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(aMainThread);
|
|
||||||
AssertOnGraphThreadOrNotRunning();
|
AssertOnGraphThreadOrNotRunning();
|
||||||
*mPendingUpdateRunnables.AppendElement() =
|
*mPendingUpdateRunnables.AppendElement() =
|
||||||
aMainThread->CreateDirectTaskDrainer(Move(aRunnable));
|
AbstractMainThread()->CreateDirectTaskDrainer(Move(aRunnable));
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|||||||
@@ -77,7 +77,6 @@ namespace media {
|
|||||||
* reprocess it. This is triggered automatically by the MediaStreamGraph.
|
* reprocess it. This is triggered automatically by the MediaStreamGraph.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class AbstractThread;
|
|
||||||
class AudioNodeEngine;
|
class AudioNodeEngine;
|
||||||
class AudioNodeExternalInputStream;
|
class AudioNodeExternalInputStream;
|
||||||
class AudioNodeStream;
|
class AudioNodeStream;
|
||||||
@@ -255,7 +254,7 @@ class MediaStream : public mozilla::LinkedListElement<MediaStream>
|
|||||||
public:
|
public:
|
||||||
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStream)
|
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStream)
|
||||||
|
|
||||||
explicit MediaStream(AbstractThread* aMainThread);
|
explicit MediaStream();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// Protected destructor, to discourage deletion outside of Release():
|
// Protected destructor, to discourage deletion outside of Release():
|
||||||
@@ -665,8 +664,6 @@ protected:
|
|||||||
MediaStreamGraphImpl* mGraph;
|
MediaStreamGraphImpl* mGraph;
|
||||||
|
|
||||||
dom::AudioChannel mAudioChannelType;
|
dom::AudioChannel mAudioChannelType;
|
||||||
|
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -678,7 +675,7 @@ protected:
|
|||||||
class SourceMediaStream : public MediaStream
|
class SourceMediaStream : public MediaStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit SourceMediaStream(AbstractThread* aMainThread);
|
explicit SourceMediaStream();
|
||||||
|
|
||||||
SourceMediaStream* AsSourceStream() override { return this; }
|
SourceMediaStream* AsSourceStream() override { return this; }
|
||||||
|
|
||||||
@@ -957,10 +954,12 @@ class MediaInputPort final
|
|||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
// Do not call this constructor directly. Instead call aDest->AllocateInputPort.
|
// Do not call this constructor directly. Instead call aDest->AllocateInputPort.
|
||||||
MediaInputPort(MediaStream* aSource, TrackID& aSourceTrack,
|
MediaInputPort(MediaStream* aSource,
|
||||||
ProcessedMediaStream* aDest, TrackID& aDestTrack,
|
TrackID& aSourceTrack,
|
||||||
uint16_t aInputNumber, uint16_t aOutputNumber,
|
ProcessedMediaStream* aDest,
|
||||||
AbstractThread* aMainThread)
|
TrackID& aDestTrack,
|
||||||
|
uint16_t aInputNumber,
|
||||||
|
uint16_t aOutputNumber)
|
||||||
: mSource(aSource)
|
: mSource(aSource)
|
||||||
, mSourceTrack(aSourceTrack)
|
, mSourceTrack(aSourceTrack)
|
||||||
, mDest(aDest)
|
, mDest(aDest)
|
||||||
@@ -968,7 +967,6 @@ private:
|
|||||||
, mInputNumber(aInputNumber)
|
, mInputNumber(aInputNumber)
|
||||||
, mOutputNumber(aOutputNumber)
|
, mOutputNumber(aOutputNumber)
|
||||||
, mGraph(nullptr)
|
, mGraph(nullptr)
|
||||||
, mAbstractMainThread(aMainThread)
|
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(MediaInputPort);
|
MOZ_COUNT_CTOR(MediaInputPort);
|
||||||
}
|
}
|
||||||
@@ -1111,8 +1109,6 @@ private:
|
|||||||
|
|
||||||
// Our media stream graph
|
// Our media stream graph
|
||||||
MediaStreamGraphImpl* mGraph;
|
MediaStreamGraphImpl* mGraph;
|
||||||
|
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1123,8 +1119,10 @@ private:
|
|||||||
class ProcessedMediaStream : public MediaStream
|
class ProcessedMediaStream : public MediaStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit ProcessedMediaStream(AbstractThread* aMainThread)
|
explicit ProcessedMediaStream()
|
||||||
: MediaStream(aMainThread), mAutofinish(false), mCycleMarker(0)
|
: MediaStream()
|
||||||
|
, mAutofinish(false)
|
||||||
|
, mCycleMarker(0)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
// Control API.
|
// Control API.
|
||||||
@@ -1248,7 +1246,7 @@ protected:
|
|||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* There can be multiple MediaStreamGraph per process: one per AudioChannel.
|
* There is a single MediaStreamGraph per window.
|
||||||
* Additionaly, each OfflineAudioContext object creates its own MediaStreamGraph
|
* Additionaly, each OfflineAudioContext object creates its own MediaStreamGraph
|
||||||
* object too..
|
* object too..
|
||||||
*/
|
*/
|
||||||
@@ -1277,8 +1275,14 @@ public:
|
|||||||
static MediaStreamGraph* GetInstance(GraphDriverType aGraphDriverRequested,
|
static MediaStreamGraph* GetInstance(GraphDriverType aGraphDriverRequested,
|
||||||
dom::AudioChannel aChannel,
|
dom::AudioChannel aChannel,
|
||||||
nsPIDOMWindowInner* aWindow);
|
nsPIDOMWindowInner* aWindow);
|
||||||
static MediaStreamGraph* CreateNonRealtimeInstance(TrackRate aSampleRate,
|
static MediaStreamGraph* CreateNonRealtimeInstance(
|
||||||
nsPIDOMWindowInner* aWindowId);
|
TrackRate aSampleRate,
|
||||||
|
nsPIDOMWindowInner* aWindowId);
|
||||||
|
|
||||||
|
// Return the correct main thread for this graph. This always returns
|
||||||
|
// something that is valid. Thread safe.
|
||||||
|
AbstractThread* AbstractMainThread();
|
||||||
|
|
||||||
// Idempotent
|
// Idempotent
|
||||||
static void DestroyNonRealtimeInstance(MediaStreamGraph* aGraph);
|
static void DestroyNonRealtimeInstance(MediaStreamGraph* aGraph);
|
||||||
|
|
||||||
@@ -1293,7 +1297,7 @@ public:
|
|||||||
* Create a stream that a media decoder (or some other source of
|
* Create a stream that a media decoder (or some other source of
|
||||||
* media data, such as a camera) can write to.
|
* media data, such as a camera) can write to.
|
||||||
*/
|
*/
|
||||||
SourceMediaStream* CreateSourceStream(AbstractThread* aMainThread);
|
SourceMediaStream* CreateSourceStream();
|
||||||
/**
|
/**
|
||||||
* Create a stream that will form the union of the tracks of its input
|
* Create a stream that will form the union of the tracks of its input
|
||||||
* streams.
|
* streams.
|
||||||
@@ -1308,12 +1312,11 @@ public:
|
|||||||
* TODO at some point we will probably need to add API to select
|
* TODO at some point we will probably need to add API to select
|
||||||
* particular tracks of each input stream.
|
* particular tracks of each input stream.
|
||||||
*/
|
*/
|
||||||
ProcessedMediaStream* CreateTrackUnionStream(AbstractThread* aMainThread);
|
ProcessedMediaStream* CreateTrackUnionStream();
|
||||||
/**
|
/**
|
||||||
* Create a stream that will mix all its audio input.
|
* Create a stream that will mix all its audio input.
|
||||||
*/
|
*/
|
||||||
ProcessedMediaStream* CreateAudioCaptureStream(TrackID aTrackId,
|
ProcessedMediaStream* CreateAudioCaptureStream(TrackID aTrackId);
|
||||||
AbstractThread* aMainThread);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add a new stream to the graph. Main thread.
|
* Add a new stream to the graph. Main thread.
|
||||||
@@ -1351,19 +1354,9 @@ public:
|
|||||||
*
|
*
|
||||||
* Should only be called during MediaStreamListener callbacks or during
|
* Should only be called during MediaStreamListener callbacks or during
|
||||||
* ProcessedMediaStream::ProcessInput().
|
* ProcessedMediaStream::ProcessInput().
|
||||||
*
|
|
||||||
* |aMainThread| is the corresponding AbstractThread on the main thread to
|
|
||||||
* drain the direct tasks generated by |aRunnable|.
|
|
||||||
* Note: The reasons for assigning proper |aMainThread| are
|
|
||||||
* - MSG serves media elements in multiple windows run on main thread.
|
|
||||||
* - DocGroup-specific AbstractMainThread is introduced to cluster the tasks
|
|
||||||
* of the same window for prioritizing tasks among different windows.
|
|
||||||
* - Proper |aMainThread| ensures that tasks dispatched to the main thread are
|
|
||||||
* clustered to the right queue and are executed in right order.
|
|
||||||
*/
|
*/
|
||||||
virtual void
|
virtual void DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(AbstractThread* aMainThread,
|
already_AddRefed<nsIRunnable> aRunnable);
|
||||||
already_AddRefed<nsIRunnable> aRunnable);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns graph sample rate in Hz.
|
* Returns graph sample rate in Hz.
|
||||||
|
|||||||
@@ -812,6 +812,7 @@ public:
|
|||||||
*/
|
*/
|
||||||
RefPtr<AsyncLatencyLogger> mLatencyLog;
|
RefPtr<AsyncLatencyLogger> mLatencyLog;
|
||||||
AudioMixer mMixer;
|
AudioMixer mMixer;
|
||||||
|
const RefPtr<AbstractThread> mAbstractMainThread;
|
||||||
#ifdef MOZ_WEBRTC
|
#ifdef MOZ_WEBRTC
|
||||||
RefPtr<AudioOutputObserver> mFarendObserverRef;
|
RefPtr<AudioOutputObserver> mFarendObserverRef;
|
||||||
#endif
|
#endif
|
||||||
@@ -853,7 +854,6 @@ private:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
dom::AudioChannel mAudioChannel;
|
dom::AudioChannel mAudioChannel;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace mozilla
|
} // namespace mozilla
|
||||||
|
|||||||
@@ -88,7 +88,6 @@ class MediaStreamTrack::PrincipalHandleListener : public MediaStreamTrackListene
|
|||||||
public:
|
public:
|
||||||
explicit PrincipalHandleListener(MediaStreamTrack* aTrack)
|
explicit PrincipalHandleListener(MediaStreamTrack* aTrack)
|
||||||
: mTrack(aTrack)
|
: mTrack(aTrack)
|
||||||
, mAbstractMainThread(aTrack->mOwningStream->AbstractMainThread())
|
|
||||||
{}
|
{}
|
||||||
|
|
||||||
void Forget()
|
void Forget()
|
||||||
@@ -112,7 +111,6 @@ public:
|
|||||||
const PrincipalHandle& aNewPrincipalHandle) override
|
const PrincipalHandle& aNewPrincipalHandle) override
|
||||||
{
|
{
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod<StoreCopyPassByConstLRef<PrincipalHandle>>(
|
NewRunnableMethod<StoreCopyPassByConstLRef<PrincipalHandle>>(
|
||||||
"dom::MediaStreamTrack::PrincipalHandleListener::"
|
"dom::MediaStreamTrack::PrincipalHandleListener::"
|
||||||
"DoNotifyPrincipalHandleChanged",
|
"DoNotifyPrincipalHandleChanged",
|
||||||
@@ -124,7 +122,6 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
// These fields may only be accessed on the main thread
|
// These fields may only be accessed on the main thread
|
||||||
MediaStreamTrack* mTrack;
|
MediaStreamTrack* mTrack;
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
MediaStreamTrack::MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
|
MediaStreamTrack::MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,
|
||||||
|
|||||||
@@ -46,8 +46,9 @@ namespace mozilla {
|
|||||||
LazyLogModule gTrackUnionStreamLog("TrackUnionStream");
|
LazyLogModule gTrackUnionStreamLog("TrackUnionStream");
|
||||||
#define STREAM_LOG(type, msg) MOZ_LOG(gTrackUnionStreamLog, type, msg)
|
#define STREAM_LOG(type, msg) MOZ_LOG(gTrackUnionStreamLog, type, msg)
|
||||||
|
|
||||||
TrackUnionStream::TrackUnionStream(AbstractThread* aMainThread) :
|
TrackUnionStream::TrackUnionStream()
|
||||||
ProcessedMediaStream(aMainThread), mNextAvailableTrackID(1)
|
: ProcessedMediaStream()
|
||||||
|
, mNextAvailableTrackID(1)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ namespace mozilla {
|
|||||||
*/
|
*/
|
||||||
class TrackUnionStream : public ProcessedMediaStream {
|
class TrackUnionStream : public ProcessedMediaStream {
|
||||||
public:
|
public:
|
||||||
explicit TrackUnionStream(AbstractThread* aMainThread);
|
explicit TrackUnionStream();
|
||||||
|
|
||||||
virtual TrackUnionStream* AsTrackUnionStream() override { return this; }
|
virtual TrackUnionStream* AsTrackUnionStream() override { return this; }
|
||||||
friend class DOMMediaStream;
|
friend class DOMMediaStream;
|
||||||
|
|||||||
@@ -59,7 +59,6 @@ public:
|
|||||||
{
|
{
|
||||||
if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
|
if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod("DecodedStreamGraphListener::DoNotifyFinished",
|
NewRunnableMethod("DecodedStreamGraphListener::DoNotifyFinished",
|
||||||
this,
|
this,
|
||||||
&DecodedStreamGraphListener::DoNotifyFinished));
|
&DecodedStreamGraphListener::DoNotifyFinished));
|
||||||
@@ -183,7 +182,7 @@ DecodedStreamData::DecodedStreamData(OutputStreamManager* aOutputStreamManager,
|
|||||||
, mHaveSentFinish(false)
|
, mHaveSentFinish(false)
|
||||||
, mHaveSentFinishAudio(false)
|
, mHaveSentFinishAudio(false)
|
||||||
, mHaveSentFinishVideo(false)
|
, mHaveSentFinishVideo(false)
|
||||||
, mStream(aOutputStreamManager->Graph()->CreateSourceStream(aMainThread))
|
, mStream(aOutputStreamManager->Graph()->CreateSourceStream())
|
||||||
// DecodedStreamGraphListener will resolve this promise.
|
// DecodedStreamGraphListener will resolve this promise.
|
||||||
, mListener(new DecodedStreamGraphListener(mStream, Move(aPromise), aMainThread))
|
, mListener(new DecodedStreamGraphListener(mStream, Move(aPromise), aMainThread))
|
||||||
// mPlaying is initially true because MDSM won't start playback until playing
|
// mPlaying is initially true because MDSM won't start playback until playing
|
||||||
|
|||||||
@@ -168,8 +168,7 @@ public:
|
|||||||
|
|
||||||
aNode->ResolvePromise(renderedBuffer);
|
aNode->ResolvePromise(renderedBuffer);
|
||||||
|
|
||||||
mAbstractMainThread->Dispatch(do_AddRef(new OnCompleteTask(context,
|
context->Dispatch(do_AddRef(new OnCompleteTask(context, renderedBuffer)));
|
||||||
renderedBuffer)));
|
|
||||||
|
|
||||||
context->OnStateChanged(nullptr, AudioContextState::Closed);
|
context->OnStateChanged(nullptr, AudioContextState::Closed);
|
||||||
}
|
}
|
||||||
@@ -261,9 +260,8 @@ public:
|
|||||||
|
|
||||||
RefPtr<InputMutedRunnable> runnable =
|
RefPtr<InputMutedRunnable> runnable =
|
||||||
new InputMutedRunnable(aStream, newInputMuted);
|
new InputMutedRunnable(aStream, newInputMuted);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
runnable.forget());
|
||||||
runnable.forget());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -336,9 +334,11 @@ AudioDestinationNode::AudioDestinationNode(AudioContext* aContext,
|
|||||||
, mAudible(AudioChannelService::AudibleState::eAudible)
|
, mAudible(AudioChannelService::AudibleState::eAudible)
|
||||||
{
|
{
|
||||||
nsPIDOMWindowInner* window = aContext->GetParentObject();
|
nsPIDOMWindowInner* window = aContext->GetParentObject();
|
||||||
MediaStreamGraph* graph = aIsOffline ?
|
MediaStreamGraph* graph =
|
||||||
MediaStreamGraph::CreateNonRealtimeInstance(aSampleRate, window) :
|
aIsOffline
|
||||||
MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER, aChannel, window);
|
? MediaStreamGraph::CreateNonRealtimeInstance(aSampleRate, window)
|
||||||
|
: MediaStreamGraph::GetInstance(
|
||||||
|
MediaStreamGraph::AUDIO_THREAD_DRIVER, aChannel, window);
|
||||||
AudioNodeEngine* engine = aIsOffline ?
|
AudioNodeEngine* engine = aIsOffline ?
|
||||||
new OfflineDestinationNodeEngine(this, aNumberOfChannels,
|
new OfflineDestinationNodeEngine(this, aNumberOfChannels,
|
||||||
aLength, aSampleRate) :
|
aLength, aSampleRate) :
|
||||||
|
|||||||
@@ -15,8 +15,9 @@ using namespace mozilla::dom;
|
|||||||
namespace mozilla {
|
namespace mozilla {
|
||||||
|
|
||||||
AudioNodeExternalInputStream::AudioNodeExternalInputStream(
|
AudioNodeExternalInputStream::AudioNodeExternalInputStream(
|
||||||
AudioNodeEngine* aEngine, TrackRate aSampleRate, AbstractThread* aMainThread)
|
AudioNodeEngine* aEngine,
|
||||||
: AudioNodeStream(aEngine, NO_STREAM_FLAGS, aSampleRate, aMainThread)
|
TrackRate aSampleRate)
|
||||||
|
: AudioNodeStream(aEngine, NO_STREAM_FLAGS, aSampleRate)
|
||||||
{
|
{
|
||||||
MOZ_COUNT_CTOR(AudioNodeExternalInputStream);
|
MOZ_COUNT_CTOR(AudioNodeExternalInputStream);
|
||||||
}
|
}
|
||||||
@@ -28,15 +29,14 @@ AudioNodeExternalInputStream::~AudioNodeExternalInputStream()
|
|||||||
|
|
||||||
/* static */ already_AddRefed<AudioNodeExternalInputStream>
|
/* static */ already_AddRefed<AudioNodeExternalInputStream>
|
||||||
AudioNodeExternalInputStream::Create(MediaStreamGraph* aGraph,
|
AudioNodeExternalInputStream::Create(MediaStreamGraph* aGraph,
|
||||||
AudioNodeEngine* aEngine,
|
AudioNodeEngine* aEngine)
|
||||||
AbstractThread* aMainThread)
|
|
||||||
{
|
{
|
||||||
AudioContext* ctx = aEngine->NodeMainThread()->Context();
|
AudioContext* ctx = aEngine->NodeMainThread()->Context();
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
MOZ_ASSERT(aGraph->GraphRate() == ctx->SampleRate());
|
MOZ_ASSERT(aGraph->GraphRate() == ctx->SampleRate());
|
||||||
|
|
||||||
RefPtr<AudioNodeExternalInputStream> stream =
|
RefPtr<AudioNodeExternalInputStream> stream =
|
||||||
new AudioNodeExternalInputStream(aEngine, aGraph->GraphRate(), aMainThread);
|
new AudioNodeExternalInputStream(aEngine, aGraph->GraphRate());
|
||||||
stream->mSuspendedCount += ctx->ShouldSuspendNewStream();
|
stream->mSuspendedCount += ctx->ShouldSuspendNewStream();
|
||||||
aGraph->AddStream(stream);
|
aGraph->AddStream(stream);
|
||||||
return stream.forget();
|
return stream.forget();
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ class AbstractThread;
|
|||||||
class AudioNodeExternalInputStream final : public AudioNodeStream
|
class AudioNodeExternalInputStream final : public AudioNodeStream
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static already_AddRefed<AudioNodeExternalInputStream>
|
static already_AddRefed<AudioNodeExternalInputStream> Create(
|
||||||
Create(MediaStreamGraph* aGraph, AudioNodeEngine* aEngine, AbstractThread* aMainThread);
|
MediaStreamGraph* aGraph,
|
||||||
|
AudioNodeEngine* aEngine);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate,
|
AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate);
|
||||||
AbstractThread* aMainThread);
|
|
||||||
~AudioNodeExternalInputStream();
|
~AudioNodeExternalInputStream();
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|||||||
@@ -29,17 +29,16 @@ namespace mozilla {
|
|||||||
|
|
||||||
AudioNodeStream::AudioNodeStream(AudioNodeEngine* aEngine,
|
AudioNodeStream::AudioNodeStream(AudioNodeEngine* aEngine,
|
||||||
Flags aFlags,
|
Flags aFlags,
|
||||||
TrackRate aSampleRate,
|
TrackRate aSampleRate)
|
||||||
AbstractThread* aMainThread)
|
: ProcessedMediaStream()
|
||||||
: ProcessedMediaStream(aMainThread),
|
, mEngine(aEngine)
|
||||||
mEngine(aEngine),
|
, mSampleRate(aSampleRate)
|
||||||
mSampleRate(aSampleRate),
|
, mFlags(aFlags)
|
||||||
mFlags(aFlags),
|
, mNumberOfInputChannels(2)
|
||||||
mNumberOfInputChannels(2),
|
, mIsActive(aEngine->IsActive())
|
||||||
mIsActive(aEngine->IsActive()),
|
, mMarkAsFinishedAfterThisBlock(false)
|
||||||
mMarkAsFinishedAfterThisBlock(false),
|
, mAudioParamStream(false)
|
||||||
mAudioParamStream(false),
|
, mPassThrough(false)
|
||||||
mPassThrough(false)
|
|
||||||
{
|
{
|
||||||
MOZ_ASSERT(NS_IsMainThread());
|
MOZ_ASSERT(NS_IsMainThread());
|
||||||
mSuspendedCount = !(mIsActive || mFlags & EXTERNAL_OUTPUT);
|
mSuspendedCount = !(mIsActive || mFlags & EXTERNAL_OUTPUT);
|
||||||
@@ -78,8 +77,7 @@ AudioNodeStream::Create(AudioContext* aCtx, AudioNodeEngine* aEngine,
|
|||||||
AudioNode* node = aEngine->NodeMainThread();
|
AudioNode* node = aEngine->NodeMainThread();
|
||||||
|
|
||||||
RefPtr<AudioNodeStream> stream =
|
RefPtr<AudioNodeStream> stream =
|
||||||
new AudioNodeStream(aEngine, aFlags, aGraph->GraphRate(),
|
new AudioNodeStream(aEngine, aFlags, aGraph->GraphRate());
|
||||||
aCtx->GetOwnerGlobal()->AbstractMainThreadFor(TaskCategory::Other));
|
|
||||||
stream->mSuspendedCount += aCtx->ShouldSuspendNewStream();
|
stream->mSuspendedCount += aCtx->ShouldSuspendNewStream();
|
||||||
if (node) {
|
if (node) {
|
||||||
stream->SetChannelMixingParametersImpl(node->ChannelCount(),
|
stream->SetChannelMixingParametersImpl(node->ChannelCount(),
|
||||||
|
|||||||
@@ -76,8 +76,7 @@ protected:
|
|||||||
*/
|
*/
|
||||||
AudioNodeStream(AudioNodeEngine* aEngine,
|
AudioNodeStream(AudioNodeEngine* aEngine,
|
||||||
Flags aFlags,
|
Flags aFlags,
|
||||||
TrackRate aSampleRate,
|
TrackRate aSampleRate);
|
||||||
AbstractThread* aMainThread);
|
|
||||||
|
|
||||||
~AudioNodeStream();
|
~AudioNodeStream();
|
||||||
|
|
||||||
|
|||||||
@@ -159,9 +159,8 @@ public:
|
|||||||
|
|
||||||
RefPtr<PlayingRefChangeHandler> refchanged =
|
RefPtr<PlayingRefChangeHandler> refchanged =
|
||||||
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
|
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||||
@@ -174,9 +173,8 @@ public:
|
|||||||
if (mBiquads.IsEmpty()) {
|
if (mBiquads.IsEmpty()) {
|
||||||
RefPtr<PlayingRefChangeHandler> refchanged =
|
RefPtr<PlayingRefChangeHandler> refchanged =
|
||||||
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
|
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
} else { // Help people diagnose bug 924718
|
} else { // Help people diagnose bug 924718
|
||||||
WebAudioUtils::LogToDeveloperConsole(mWindowID,
|
WebAudioUtils::LogToDeveloperConsole(mWindowID,
|
||||||
"BiquadFilterChannelCountChangeWarning");
|
"BiquadFilterChannelCountChangeWarning");
|
||||||
|
|||||||
@@ -125,9 +125,8 @@ public:
|
|||||||
aStream->ScheduleCheckForInactive();
|
aStream->ScheduleCheckForInactive();
|
||||||
RefPtr<PlayingRefChanged> refchanged =
|
RefPtr<PlayingRefChanged> refchanged =
|
||||||
new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
|
new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||||
return;
|
return;
|
||||||
@@ -147,9 +146,8 @@ public:
|
|||||||
if (mLeftOverData <= 0) {
|
if (mLeftOverData <= 0) {
|
||||||
RefPtr<PlayingRefChanged> refchanged =
|
RefPtr<PlayingRefChanged> refchanged =
|
||||||
new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
|
new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
mLeftOverData = mBufferLength;
|
mLeftOverData = mBufferLength;
|
||||||
MOZ_ASSERT(mLeftOverData > 0);
|
MOZ_ASSERT(mLeftOverData > 0);
|
||||||
|
|||||||
@@ -82,9 +82,8 @@ public:
|
|||||||
if (mLeftOverData <= 0) {
|
if (mLeftOverData <= 0) {
|
||||||
RefPtr<PlayingRefChanged> refchanged =
|
RefPtr<PlayingRefChanged> refchanged =
|
||||||
new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
|
new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
mLeftOverData = mBuffer.MaxDelayTicks();
|
mLeftOverData = mBuffer.MaxDelayTicks();
|
||||||
} else if (mLeftOverData > 0) {
|
} else if (mLeftOverData > 0) {
|
||||||
@@ -99,9 +98,8 @@ public:
|
|||||||
|
|
||||||
RefPtr<PlayingRefChanged> refchanged =
|
RefPtr<PlayingRefChanged> refchanged =
|
||||||
new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
|
new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -56,9 +56,8 @@ public:
|
|||||||
|
|
||||||
RefPtr<PlayingRefChangeHandler> refchanged =
|
RefPtr<PlayingRefChangeHandler> refchanged =
|
||||||
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
|
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
|
|
||||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||||
return;
|
return;
|
||||||
@@ -70,9 +69,8 @@ public:
|
|||||||
if (mIIRFilters.IsEmpty()) {
|
if (mIIRFilters.IsEmpty()) {
|
||||||
RefPtr<PlayingRefChangeHandler> refchanged =
|
RefPtr<PlayingRefChangeHandler> refchanged =
|
||||||
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
|
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
} else {
|
} else {
|
||||||
WebAudioUtils::LogToDeveloperConsole(mWindowID,
|
WebAudioUtils::LogToDeveloperConsole(mWindowID,
|
||||||
"IIRFilterChannelCountChangeWarning");
|
"IIRFilterChannelCountChangeWarning");
|
||||||
|
|||||||
@@ -84,9 +84,7 @@ MediaStreamAudioSourceNode::Init(DOMMediaStream* aMediaStream, ErrorResult& aRv)
|
|||||||
|
|
||||||
mInputStream = aMediaStream;
|
mInputStream = aMediaStream;
|
||||||
AudioNodeEngine* engine = new MediaStreamAudioSourceNodeEngine(this);
|
AudioNodeEngine* engine = new MediaStreamAudioSourceNodeEngine(this);
|
||||||
mStream =
|
mStream = AudioNodeExternalInputStream::Create(graph, engine);
|
||||||
AudioNodeExternalInputStream::Create(graph, engine,
|
|
||||||
aMediaStream->AbstractMainThread());
|
|
||||||
mInputStream->AddConsumerToKeepAlive(static_cast<nsIDOMEventTarget*>(this));
|
mInputStream->AddConsumerToKeepAlive(static_cast<nsIDOMEventTarget*>(this));
|
||||||
|
|
||||||
mInputStream->RegisterTrackListener(this);
|
mInputStream->RegisterTrackListener(this);
|
||||||
|
|||||||
@@ -208,9 +208,8 @@ public:
|
|||||||
|
|
||||||
RefPtr<PlayingRefChangeHandler> refchanged =
|
RefPtr<PlayingRefChangeHandler> refchanged =
|
||||||
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
|
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
|
||||||
return;
|
return;
|
||||||
@@ -219,9 +218,8 @@ public:
|
|||||||
if (mLeftOverData == INT_MIN) {
|
if (mLeftOverData == INT_MIN) {
|
||||||
RefPtr<PlayingRefChangeHandler> refchanged =
|
RefPtr<PlayingRefChangeHandler> refchanged =
|
||||||
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
|
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
|
||||||
aStream->Graph()->
|
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
|
refchanged.forget());
|
||||||
refchanged.forget());
|
|
||||||
}
|
}
|
||||||
mLeftOverData = mHRTFPanner->maxTailFrames();
|
mLeftOverData = mHRTFPanner->maxTailFrames();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ public:
|
|||||||
: mSpeechTask(aSpeechTask)
|
: mSpeechTask(aSpeechTask)
|
||||||
, mStream(aStream)
|
, mStream(aStream)
|
||||||
, mStarted(false)
|
, mStarted(false)
|
||||||
, mAbstractMainThread(aMainThread)
|
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -65,14 +64,12 @@ public:
|
|||||||
if (!mStarted) {
|
if (!mStarted) {
|
||||||
mStarted = true;
|
mStarted = true;
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod("dom::SynthStreamListener::DoNotifyStarted",
|
NewRunnableMethod("dom::SynthStreamListener::DoNotifyStarted",
|
||||||
this,
|
this,
|
||||||
&SynthStreamListener::DoNotifyStarted));
|
&SynthStreamListener::DoNotifyStarted));
|
||||||
}
|
}
|
||||||
|
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod("dom::SynthStreamListener::DoNotifyFinished",
|
NewRunnableMethod("dom::SynthStreamListener::DoNotifyFinished",
|
||||||
this,
|
this,
|
||||||
&SynthStreamListener::DoNotifyFinished));
|
&SynthStreamListener::DoNotifyFinished));
|
||||||
@@ -93,7 +90,6 @@ public:
|
|||||||
if (aBlocked == MediaStreamListener::UNBLOCKED && !mStarted) {
|
if (aBlocked == MediaStreamListener::UNBLOCKED && !mStarted) {
|
||||||
mStarted = true;
|
mStarted = true;
|
||||||
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
|
||||||
mAbstractMainThread,
|
|
||||||
NewRunnableMethod("dom::SynthStreamListener::DoNotifyStarted",
|
NewRunnableMethod("dom::SynthStreamListener::DoNotifyStarted",
|
||||||
this,
|
this,
|
||||||
&SynthStreamListener::DoNotifyStarted));
|
&SynthStreamListener::DoNotifyStarted));
|
||||||
@@ -108,8 +104,6 @@ private:
|
|||||||
RefPtr<MediaStream> mStream;
|
RefPtr<MediaStream> mStream;
|
||||||
|
|
||||||
bool mStarted;
|
bool mStarted;
|
||||||
|
|
||||||
const RefPtr<AbstractThread> mAbstractMainThread;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// nsSpeechTask
|
// nsSpeechTask
|
||||||
@@ -176,7 +170,7 @@ nsSpeechTask::InitDirectAudio()
|
|||||||
// This is a global MSG.
|
// This is a global MSG.
|
||||||
mStream = MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER,
|
mStream = MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER,
|
||||||
AudioChannel::Normal, nullptr)->
|
AudioChannel::Normal, nullptr)->
|
||||||
CreateSourceStream(AbstractThread::MainThread() /* Non DocGroup-version for the task in parent. */);
|
CreateSourceStream();
|
||||||
mIndirectAudio = false;
|
mIndirectAudio = false;
|
||||||
mInited = true;
|
mInited = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class FakeSourceMediaStream : public mozilla::SourceMediaStream {
|
|||||||
public:
|
public:
|
||||||
|
|
||||||
FakeSourceMediaStream()
|
FakeSourceMediaStream()
|
||||||
: SourceMediaStream(nullptr)
|
: SourceMediaStream()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user