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:
Paul Adenot
2017-06-29 11:30:57 -07:00
parent 5be210e90e
commit aadd3c3a24
28 changed files with 159 additions and 217 deletions

View File

@@ -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:

View File

@@ -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);

View File

@@ -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();

View File

@@ -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) {

View File

@@ -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,

View File

@@ -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);

View File

@@ -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());

View File

@@ -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();

View File

@@ -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

View File

@@ -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.

View File

@@ -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

View File

@@ -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,

View File

@@ -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)
{ {
} }

View File

@@ -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;

View File

@@ -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

View File

@@ -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) :

View File

@@ -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();

View File

@@ -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:

View File

@@ -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(),

View File

@@ -76,8 +76,7 @@ protected:
*/ */
AudioNodeStream(AudioNodeEngine* aEngine, AudioNodeStream(AudioNodeEngine* aEngine,
Flags aFlags, Flags aFlags,
TrackRate aSampleRate, TrackRate aSampleRate);
AbstractThread* aMainThread);
~AudioNodeStream(); ~AudioNodeStream();

View File

@@ -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");

View File

@@ -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);

View File

@@ -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;

View File

@@ -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");

View File

@@ -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);

View File

@@ -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();
} }

View File

@@ -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;
} }

View File

@@ -43,7 +43,7 @@ class FakeSourceMediaStream : public mozilla::SourceMediaStream {
public: public:
FakeSourceMediaStream() FakeSourceMediaStream()
: SourceMediaStream(nullptr) : SourceMediaStream()
{ {
} }