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),
mFinished(false),
mMutex(aName),
mPendingNotifyOutput(false),
mAbstractMainThread(aElement->AbstractMainThread())
mPendingNotifyOutput(false)
{}
void Forget()
{
@@ -4938,14 +4937,12 @@ public:
this,
&StreamListener::DoNotifyUnblocked);
}
aGraph->DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
event.forget());
aGraph->DispatchToMainThreadAfterStreamStateUpdate(event.forget());
}
virtual void NotifyHasCurrentData(MediaStreamGraph* aGraph) override
{
MutexAutoLock lock(mMutex);
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod(
"dom::HTMLMediaElement::StreamListener::DoNotifyHaveCurrentData",
this,
@@ -4959,7 +4956,6 @@ public:
return;
mPendingNotifyOutput = true;
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod("dom::HTMLMediaElement::StreamListener::DoNotifyOutput",
this,
&StreamListener::DoNotifyOutput));
@@ -4975,7 +4971,6 @@ private:
// mMutex protects the fields below; they can be accessed on any thread
Mutex mMutex;
bool mPendingNotifyOutput;
const RefPtr<AbstractThread> mAbstractMainThread;
};
class HTMLMediaElement::MediaStreamTracksAvailableCallback:

View File

@@ -30,8 +30,11 @@ namespace mozilla
// We are mixing to mono until PeerConnection can accept stereo
static const uint32_t MONO = 1;
AudioCaptureStream::AudioCaptureStream(TrackID aTrackId, AbstractThread* aMainThread)
: ProcessedMediaStream(aMainThread), mTrackId(aTrackId), mStarted(false), mTrackCreated(false)
AudioCaptureStream::AudioCaptureStream(TrackID aTrackId)
: ProcessedMediaStream()
, mTrackId(aTrackId)
, mStarted(false)
, mTrackCreated(false)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_COUNT_CTOR(AudioCaptureStream);

View File

@@ -24,7 +24,7 @@ class AudioCaptureStream : public ProcessedMediaStream,
public MixerCallbackReceiver
{
public:
AudioCaptureStream(TrackID aTrackId, AbstractThread* aMainThread);
AudioCaptureStream(TrackID aTrackId);
virtual ~AudioCaptureStream();
void Start();

View File

@@ -143,7 +143,6 @@ class DOMMediaStream::OwnedStreamListener : public MediaStreamListener {
public:
explicit OwnedStreamListener(DOMMediaStream* aStream)
: mStream(aStream)
, mAbstractMainThread(aStream->mAbstractMainThread)
{}
void Forget() { mStream = nullptr; }
@@ -224,7 +223,6 @@ public:
{
if (aTrackEvents & TrackEventCommand::TRACK_EVENT_CREATED) {
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod<TrackID,
MediaSegment::Type,
RefPtr<MediaStream>,
@@ -238,7 +236,6 @@ public:
aInputTrackID));
} else if (aTrackEvents & TrackEventCommand::TRACK_EVENT_ENDED) {
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod<RefPtr<MediaStream>, TrackID, TrackID>(
"DOMMediaStream::OwnedStreamListener::DoNotifyTrackEnded",
this,
@@ -252,8 +249,6 @@ public:
private:
// These fields may only be accessed on the main thread
DOMMediaStream* mStream;
const RefPtr<AbstractThread> mAbstractMainThread;
};
/**
@@ -265,7 +260,6 @@ class DOMMediaStream::PlaybackStreamListener : public MediaStreamListener {
public:
explicit PlaybackStreamListener(DOMMediaStream* aStream)
: mStream(aStream)
, mAbstractMainThread(aStream->mAbstractMainThread)
{}
void Forget()
@@ -309,7 +303,6 @@ public:
void NotifyFinishedTrackCreation(MediaStreamGraph* aGraph) override
{
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod(
"DOMMediaStream::PlaybackStreamListener::DoNotifyFinishedTrackCreation",
this,
@@ -322,7 +315,6 @@ public:
{
if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod(
"DOMMediaStream::PlaybackStreamListener::DoNotifyFinished",
this,
@@ -333,8 +325,6 @@ public:
private:
// These fields may only be accessed on the main thread
DOMMediaStream* mStream;
const RefPtr<AbstractThread> mAbstractMainThread;
};
class DOMMediaStream::PlaybackTrackListener : public MediaStreamTrackConsumer
@@ -436,8 +426,7 @@ DOMMediaStream::DOMMediaStream(nsPIDOMWindowInner* aWindow,
mTracksPendingRemoval(0), mTrackSourceGetter(aTrackSourceGetter),
mPlaybackTrackListener(MakeAndAddRef<PlaybackTrackListener>(this)),
mTracksCreated(false), mNotifiedOfMediaStreamGraphShutdown(false),
mActive(false), mSetInactiveOnFinish(false),
mAbstractMainThread(aWindow ? aWindow->GetDocGroup()->AbstractMainThreadFor(TaskCategory::Other) : nullptr)
mActive(false), mSetInactiveOnFinish(false)
{
nsresult rv;
nsCOMPtr<nsIUUIDGenerator> uuidgen =
@@ -881,8 +870,7 @@ DOMMediaStream::SetInactiveOnFinish()
void
DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
{
MOZ_ASSERT(mAbstractMainThread);
InitInputStreamCommon(aGraph->CreateSourceStream(mAbstractMainThread), aGraph);
InitInputStreamCommon(aGraph->CreateSourceStream(), aGraph);
InitOwnedStreamCommon(aGraph);
InitPlaybackStreamCommon(aGraph);
}
@@ -890,8 +878,7 @@ DOMMediaStream::InitSourceStream(MediaStreamGraph* aGraph)
void
DOMMediaStream::InitTrackUnionStream(MediaStreamGraph* aGraph)
{
MOZ_ASSERT(mAbstractMainThread);
InitInputStreamCommon(aGraph->CreateTrackUnionStream(mAbstractMainThread), aGraph);
InitInputStreamCommon(aGraph->CreateTrackUnionStream(), aGraph);
InitOwnedStreamCommon(aGraph);
InitPlaybackStreamCommon(aGraph);
}
@@ -899,14 +886,13 @@ DOMMediaStream::InitTrackUnionStream(MediaStreamGraph* aGraph)
void
DOMMediaStream::InitAudioCaptureStream(nsIPrincipal* aPrincipal, MediaStreamGraph* aGraph)
{
MOZ_ASSERT(mAbstractMainThread);
const TrackID AUDIO_TRACK = 1;
RefPtr<BasicTrackSource> audioCaptureSource =
new BasicTrackSource(aPrincipal, MediaSourceEnum::AudioCapture);
AudioCaptureStream* audioCaptureStream =
static_cast<AudioCaptureStream*>(aGraph->CreateAudioCaptureStream(AUDIO_TRACK, mAbstractMainThread));
static_cast<AudioCaptureStream*>(aGraph->CreateAudioCaptureStream(AUDIO_TRACK));
InitInputStreamCommon(audioCaptureStream, aGraph);
InitOwnedStreamCommon(aGraph);
InitPlaybackStreamCommon(aGraph);
@@ -930,10 +916,9 @@ DOMMediaStream::InitInputStreamCommon(MediaStream* aStream,
void
DOMMediaStream::InitOwnedStreamCommon(MediaStreamGraph* aGraph)
{
MOZ_ASSERT(mAbstractMainThread);
MOZ_ASSERT(!mPlaybackStream, "Owned stream must be initialized before playback stream");
mOwnedStream = aGraph->CreateTrackUnionStream(mAbstractMainThread);
mOwnedStream = aGraph->CreateTrackUnionStream();
mOwnedStream->SetAutofinish(true);
mOwnedStream->RegisterUser();
if (mInputStream) {
@@ -948,8 +933,7 @@ DOMMediaStream::InitOwnedStreamCommon(MediaStreamGraph* aGraph)
void
DOMMediaStream::InitPlaybackStreamCommon(MediaStreamGraph* aGraph)
{
MOZ_ASSERT(mAbstractMainThread);
mPlaybackStream = aGraph->CreateTrackUnionStream(mAbstractMainThread);
mPlaybackStream = aGraph->CreateTrackUnionStream();
mPlaybackStream->SetAutofinish(true);
mPlaybackStream->RegisterUser();
if (mOwnedStream) {

View File

@@ -590,8 +590,6 @@ public:
// a dead pointer. Main thread only.
void UnregisterTrackListener(TrackListener* aListener);
AbstractThread* AbstractMainThread() const { return mAbstractMainThread; }
protected:
virtual ~DOMMediaStream();
@@ -756,7 +754,6 @@ private:
nsCOMPtr<nsIPrincipal> mVideoPrincipal;
nsTArray<dom::PrincipalChangeObserver<DOMMediaStream>*> mPrincipalChangeObservers;
CORSMode mCORSMode;
const RefPtr<AbstractThread> mAbstractMainThread;
};
NS_DEFINE_STATIC_IID_ACCESSOR(DOMMediaStream,

View File

@@ -1084,8 +1084,7 @@ public:
domStream =
DOMMediaStream::CreateAudioCaptureStreamAsInput(window, principal, msg);
stream = msg->CreateSourceStream(
globalWindow->AbstractMainThreadFor(TaskCategory::Other)); // Placeholder
stream = msg->CreateSourceStream(); // Placeholder
msg->RegisterCaptureStreamForWindow(
mWindowID, domStream->GetInputStream()->AsProcessedStream());
window->SetAudioCapture(true);

View File

@@ -433,7 +433,6 @@ public:
, mIsStartEventFired(false)
, mNeedSessionEndTask(true)
, mSelectedVideoTrackID(TRACK_NONE)
, mAbstractMainThread(aRecorder->mAbstractMainThread)
{
MOZ_ASSERT(NS_IsMainThread());
@@ -489,7 +488,7 @@ public:
// Create a Track Union Stream
MediaStreamGraph* gm = mRecorder->GetSourceMediaStream()->Graph();
TrackRate trackRate = gm->GraphRate();
mTrackUnionStream = gm->CreateTrackUnionStream(mAbstractMainThread);
mTrackUnionStream = gm->CreateTrackUnionStream();
MOZ_ASSERT(mTrackUnionStream, "CreateTrackUnionStream failed");
mTrackUnionStream->SetAutofinish(true);
@@ -952,7 +951,6 @@ private:
// Main thread only.
bool mNeedSessionEndTask;
TrackID mSelectedVideoTrackID;
const RefPtr<AbstractThread> mAbstractMainThread;
};
NS_IMPL_ISUPPORTS(MediaRecorder::Session, nsIObserver)
@@ -971,7 +969,6 @@ MediaRecorder::MediaRecorder(DOMMediaStream& aSourceMediaStream,
nsPIDOMWindowInner* aOwnerWindow)
: DOMEventTargetHelper(aOwnerWindow)
, mState(RecordingState::Inactive)
, mAbstractMainThread(aSourceMediaStream.AbstractMainThread())
{
MOZ_ASSERT(aOwnerWindow);
MOZ_ASSERT(aOwnerWindow->IsInnerWindow());
@@ -985,7 +982,6 @@ MediaRecorder::MediaRecorder(AudioNode& aSrcAudioNode,
nsPIDOMWindowInner* aOwnerWindow)
: DOMEventTargetHelper(aOwnerWindow)
, mState(RecordingState::Inactive)
, mAbstractMainThread(aSrcAudioNode.AbstractMainThread())
{
MOZ_ASSERT(aOwnerWindow);
MOZ_ASSERT(aOwnerWindow->IsInnerWindow());

View File

@@ -159,7 +159,6 @@ protected:
uint32_t mVideoBitsPerSecond;
uint32_t mBitsPerSecond;
const RefPtr<AbstractThread> mAbstractMainThread;
private:
// Register MediaRecorder into Document to listen the activity changes.
void RegisterActivityObserver();

View File

@@ -1012,9 +1012,11 @@ MediaStreamGraphImpl::OpenAudioInput(int aID,
{
// So, so, so annoying. Can't AppendMessage except on Mainthread
if (!NS_IsMainThread()) {
RefPtr<nsIRunnable> runnable = WrapRunnable(this,
RefPtr<nsIRunnable> runnable =
WrapRunnable(this,
&MediaStreamGraphImpl::OpenAudioInput,
aID, RefPtr<AudioDataListener>(aListener));
aID,
RefPtr<AudioDataListener>(aListener));
mAbstractMainThread->Dispatch(runnable.forget());
return NS_OK;
}
@@ -1083,7 +1085,8 @@ MediaStreamGraphImpl::CloseAudioInput(AudioDataListener *aListener)
{
// So, so, so annoying. Can't AppendMessage except on Mainthread
if (!NS_IsMainThread()) {
RefPtr<nsIRunnable> runnable = WrapRunnable(this,
RefPtr<nsIRunnable> runnable =
WrapRunnable(this,
&MediaStreamGraphImpl::CloseAudioInput,
RefPtr<AudioDataListener>(aListener));
mAbstractMainThread->Dispatch(runnable.forget());
@@ -1889,7 +1892,7 @@ MediaStreamGraphImpl::Dispatch(already_AddRefed<nsIRunnable>&& aRunnable)
mAbstractMainThread->Dispatch(Move(aRunnable));
}
MediaStream::MediaStream(AbstractThread* aMainThread)
MediaStream::MediaStream()
: mTracksStartTime(0)
, mStartBlocking(GRAPH_TIME_MAX)
, mSuspendedCount(0)
@@ -1905,7 +1908,6 @@ MediaStream::MediaStream(AbstractThread* aMainThread)
, mNrOfMainThreadUsers(0)
, mGraph(nullptr)
, mAudioChannelType(dom::AudioChannel::Normal)
, mAbstractMainThread(aMainThread)
{
MOZ_COUNT_CTOR(MediaStream);
}
@@ -2553,17 +2555,13 @@ MediaStream::RunAfterPendingUpdates(already_AddRefed<nsIRunnable> aRunnable)
class Message : public ControlMessage {
public:
Message(MediaStream* aStream,
already_AddRefed<nsIRunnable> aRunnable,
AbstractThread* aMainThread)
Message(MediaStream* aStream, already_AddRefed<nsIRunnable> aRunnable)
: ControlMessage(aStream)
, mRunnable(aRunnable)
, mAbstractMainThread(aMainThread)
{}
void Run() override
{
mStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
mStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
mRunnable.forget());
}
void RunDuringShutdown() override
@@ -2575,11 +2573,9 @@ MediaStream::RunAfterPendingUpdates(already_AddRefed<nsIRunnable> aRunnable)
}
private:
nsCOMPtr<nsIRunnable> mRunnable;
const RefPtr<AbstractThread> mAbstractMainThread;
};
graph->AppendMessage(
MakeUnique<Message>(this, runnable.forget(), mAbstractMainThread));
graph->AppendMessage(MakeUnique<Message>(this, runnable.forget()));
}
void
@@ -2691,16 +2687,16 @@ MediaStream::AddMainThreadListener(MainThreadMediaStreamListener* aListener)
};
nsCOMPtr<nsIRunnable> runnable = new NotifyRunnable(this);
mAbstractMainThread->Dispatch(runnable.forget());
GraphImpl()->Dispatch(runnable.forget());
}
SourceMediaStream::SourceMediaStream(AbstractThread* aMainThread) :
MediaStream(aMainThread),
mMutex("mozilla::media::SourceMediaStream"),
mUpdateKnownTracksTime(0),
mPullEnabled(false),
mUpdateFinished(false),
mNeedsMixing(false)
SourceMediaStream::SourceMediaStream()
: MediaStream()
, mMutex("mozilla::media::SourceMediaStream")
, mUpdateKnownTracksTime(0)
, mPullEnabled(false)
, mUpdateFinished(false)
, mNeedsMixing(false)
{
}
@@ -3290,17 +3286,19 @@ MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
Message(MediaInputPort* aPort,
TrackID aTrackId,
BlockingMode aBlockingMode,
already_AddRefed<nsIRunnable> aRunnable,
AbstractThread* aMainThread)
: ControlMessage(aPort->GetDestination()),
mPort(aPort), mTrackId(aTrackId), mBlockingMode(aBlockingMode),
mRunnable(aRunnable), mAbstractMainThread(aMainThread) {}
already_AddRefed<nsIRunnable> aRunnable)
: ControlMessage(aPort->GetDestination())
, mPort(aPort)
, mTrackId(aTrackId)
, mBlockingMode(aBlockingMode)
, mRunnable(aRunnable)
{
}
void Run() override
{
mPort->BlockSourceTrackIdImpl(mTrackId, mBlockingMode);
if (mRunnable) {
mStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
mStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
mRunnable.forget());
}
}
@@ -3312,7 +3310,6 @@ MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
TrackID mTrackId;
BlockingMode mBlockingMode;
nsCOMPtr<nsIRunnable> mRunnable;
const RefPtr<AbstractThread> mAbstractMainThread;
};
MOZ_ASSERT(IsTrackIDExplicit(aTrackId),
@@ -3324,9 +3321,8 @@ MediaInputPort::BlockSourceTrackId(TrackID aTrackId, BlockingMode aBlockingMode)
pledge->Resolve(true);
return NS_OK;
});
GraphImpl()->AppendMessage(MakeUnique<Message>(this, aTrackId, aBlockingMode,
runnable.forget(),
mAbstractMainThread));
GraphImpl()->AppendMessage(
MakeUnique<Message>(this, aTrackId, aBlockingMode, runnable.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");
MOZ_ASSERT(aTrackID != TRACK_ANY || aDestTrackID == TRACK_ANY,
"Generic MediaInputPort cannot produce a single destination track");
RefPtr<MediaInputPort> port =
new MediaInputPort(aStream, aTrackID, this, aDestTrackID,
aInputNumber, aOutputNumber, mAbstractMainThread);
RefPtr<MediaInputPort> port = new MediaInputPort(
aStream, aTrackID, this, aDestTrackID, aInputNumber, aOutputNumber);
if (aBlockedTracks) {
for (TrackID trackID : *aBlockedTracks) {
port->BlockSourceTrackIdImpl(trackID, BlockingMode::CREATION);
@@ -3449,6 +3444,7 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
, mNonRealtimeProcessing(false)
, mStreamOrderDirty(false)
, mLatencyLog(AsyncLatencyLogger::Get())
, mAbstractMainThread(aMainThread)
#ifdef MOZ_WEBRTC
, mFarendObserverRef(nullptr)
#endif
@@ -3457,7 +3453,6 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
, mCanRunMessagesSynchronously(false)
#endif
, mAudioChannel(aChannel)
, mAbstractMainThread(aMainThread)
{
if (mRealtime) {
if (aDriverRequested == AUDIO_THREAD_DRIVER) {
@@ -3475,6 +3470,13 @@ MediaStreamGraphImpl::MediaStreamGraphImpl(GraphDriverType aDriverRequested,
RegisterWeakAsyncMemoryReporter(this);
}
AbstractThread*
MediaStreamGraph::AbstractMainThread()
{
MOZ_ASSERT(static_cast<MediaStreamGraphImpl*>(this)->mAbstractMainThread);
return static_cast<MediaStreamGraphImpl*>(this)->mAbstractMainThread;
}
void
MediaStreamGraphImpl::Destroy()
{
@@ -3580,8 +3582,8 @@ MediaStreamGraph::CreateNonRealtimeInstance(TrackRate aSampleRate,
NS_ASSERTION(NS_IsMainThread(), "Main thread only");
nsCOMPtr<nsIGlobalObject> parentObject = do_QueryInterface(aWindow);
MediaStreamGraphImpl* graph =
new MediaStreamGraphImpl(OFFLINE_THREAD_DRIVER,
MediaStreamGraphImpl* graph = new MediaStreamGraphImpl(
OFFLINE_THREAD_DRIVER,
aSampleRate,
AudioChannel::Normal,
parentObject->AbstractMainThreadFor(TaskCategory::Other));
@@ -3755,25 +3757,25 @@ FinishCollectReports(nsIHandleReportCallback* aHandleReport, nsISupports* aData,
}
SourceMediaStream*
MediaStreamGraph::CreateSourceStream(AbstractThread* aMainThread)
MediaStreamGraph::CreateSourceStream()
{
SourceMediaStream* stream = new SourceMediaStream(aMainThread);
SourceMediaStream* stream = new SourceMediaStream();
AddStream(stream);
return stream;
}
ProcessedMediaStream*
MediaStreamGraph::CreateTrackUnionStream(AbstractThread* aMainThread)
MediaStreamGraph::CreateTrackUnionStream()
{
TrackUnionStream* stream = new TrackUnionStream(aMainThread);
TrackUnionStream* stream = new TrackUnionStream();
AddStream(stream);
return stream;
}
ProcessedMediaStream*
MediaStreamGraph::CreateAudioCaptureStream(TrackID aTrackId, AbstractThread* aMainThread)
MediaStreamGraph::CreateAudioCaptureStream(TrackID aTrackId)
{
AudioCaptureStream* stream = new AudioCaptureStream(aTrackId, aMainThread);
AudioCaptureStream* stream = new AudioCaptureStream(aTrackId);
AddStream(stream);
return stream;
}
@@ -4176,14 +4178,12 @@ MediaStreamGraphImpl::ConnectToCaptureStream(uint64_t aWindowId,
}
void
MediaStreamGraph::
DispatchToMainThreadAfterStreamStateUpdate(AbstractThread* aMainThread,
MediaStreamGraph::DispatchToMainThreadAfterStreamStateUpdate(
already_AddRefed<nsIRunnable> aRunnable)
{
MOZ_ASSERT(aMainThread);
AssertOnGraphThreadOrNotRunning();
*mPendingUpdateRunnables.AppendElement() =
aMainThread->CreateDirectTaskDrainer(Move(aRunnable));
AbstractMainThread()->CreateDirectTaskDrainer(Move(aRunnable));
}
} // namespace mozilla

View File

@@ -77,7 +77,6 @@ namespace media {
* reprocess it. This is triggered automatically by the MediaStreamGraph.
*/
class AbstractThread;
class AudioNodeEngine;
class AudioNodeExternalInputStream;
class AudioNodeStream;
@@ -255,7 +254,7 @@ class MediaStream : public mozilla::LinkedListElement<MediaStream>
public:
NS_INLINE_DECL_THREADSAFE_REFCOUNTING(MediaStream)
explicit MediaStream(AbstractThread* aMainThread);
explicit MediaStream();
protected:
// Protected destructor, to discourage deletion outside of Release():
@@ -665,8 +664,6 @@ protected:
MediaStreamGraphImpl* mGraph;
dom::AudioChannel mAudioChannelType;
const RefPtr<AbstractThread> mAbstractMainThread;
};
/**
@@ -678,7 +675,7 @@ protected:
class SourceMediaStream : public MediaStream
{
public:
explicit SourceMediaStream(AbstractThread* aMainThread);
explicit SourceMediaStream();
SourceMediaStream* AsSourceStream() override { return this; }
@@ -957,10 +954,12 @@ class MediaInputPort final
{
private:
// Do not call this constructor directly. Instead call aDest->AllocateInputPort.
MediaInputPort(MediaStream* aSource, TrackID& aSourceTrack,
ProcessedMediaStream* aDest, TrackID& aDestTrack,
uint16_t aInputNumber, uint16_t aOutputNumber,
AbstractThread* aMainThread)
MediaInputPort(MediaStream* aSource,
TrackID& aSourceTrack,
ProcessedMediaStream* aDest,
TrackID& aDestTrack,
uint16_t aInputNumber,
uint16_t aOutputNumber)
: mSource(aSource)
, mSourceTrack(aSourceTrack)
, mDest(aDest)
@@ -968,7 +967,6 @@ private:
, mInputNumber(aInputNumber)
, mOutputNumber(aOutputNumber)
, mGraph(nullptr)
, mAbstractMainThread(aMainThread)
{
MOZ_COUNT_CTOR(MediaInputPort);
}
@@ -1111,8 +1109,6 @@ private:
// Our media stream graph
MediaStreamGraphImpl* mGraph;
const RefPtr<AbstractThread> mAbstractMainThread;
};
/**
@@ -1123,8 +1119,10 @@ private:
class ProcessedMediaStream : public MediaStream
{
public:
explicit ProcessedMediaStream(AbstractThread* aMainThread)
: MediaStream(aMainThread), mAutofinish(false), mCycleMarker(0)
explicit ProcessedMediaStream()
: MediaStream()
, mAutofinish(false)
, mCycleMarker(0)
{}
// 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
* object too..
*/
@@ -1277,8 +1275,14 @@ public:
static MediaStreamGraph* GetInstance(GraphDriverType aGraphDriverRequested,
dom::AudioChannel aChannel,
nsPIDOMWindowInner* aWindow);
static MediaStreamGraph* CreateNonRealtimeInstance(TrackRate aSampleRate,
static MediaStreamGraph* CreateNonRealtimeInstance(
TrackRate aSampleRate,
nsPIDOMWindowInner* aWindowId);
// Return the correct main thread for this graph. This always returns
// something that is valid. Thread safe.
AbstractThread* AbstractMainThread();
// Idempotent
static void DestroyNonRealtimeInstance(MediaStreamGraph* aGraph);
@@ -1293,7 +1297,7 @@ public:
* Create a stream that a media decoder (or some other source of
* 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
* streams.
@@ -1308,12 +1312,11 @@ public:
* TODO at some point we will probably need to add API to select
* particular tracks of each input stream.
*/
ProcessedMediaStream* CreateTrackUnionStream(AbstractThread* aMainThread);
ProcessedMediaStream* CreateTrackUnionStream();
/**
* Create a stream that will mix all its audio input.
*/
ProcessedMediaStream* CreateAudioCaptureStream(TrackID aTrackId,
AbstractThread* aMainThread);
ProcessedMediaStream* CreateAudioCaptureStream(TrackID aTrackId);
/**
* Add a new stream to the graph. Main thread.
@@ -1351,18 +1354,8 @@ public:
*
* Should only be called during MediaStreamListener callbacks or during
* 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
DispatchToMainThreadAfterStreamStateUpdate(AbstractThread* aMainThread,
virtual void DispatchToMainThreadAfterStreamStateUpdate(
already_AddRefed<nsIRunnable> aRunnable);
/**

View File

@@ -812,6 +812,7 @@ public:
*/
RefPtr<AsyncLatencyLogger> mLatencyLog;
AudioMixer mMixer;
const RefPtr<AbstractThread> mAbstractMainThread;
#ifdef MOZ_WEBRTC
RefPtr<AudioOutputObserver> mFarendObserverRef;
#endif
@@ -853,7 +854,6 @@ private:
#endif
dom::AudioChannel mAudioChannel;
const RefPtr<AbstractThread> mAbstractMainThread;
};
} // namespace mozilla

View File

@@ -88,7 +88,6 @@ class MediaStreamTrack::PrincipalHandleListener : public MediaStreamTrackListene
public:
explicit PrincipalHandleListener(MediaStreamTrack* aTrack)
: mTrack(aTrack)
, mAbstractMainThread(aTrack->mOwningStream->AbstractMainThread())
{}
void Forget()
@@ -112,7 +111,6 @@ public:
const PrincipalHandle& aNewPrincipalHandle) override
{
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod<StoreCopyPassByConstLRef<PrincipalHandle>>(
"dom::MediaStreamTrack::PrincipalHandleListener::"
"DoNotifyPrincipalHandleChanged",
@@ -124,7 +122,6 @@ public:
protected:
// These fields may only be accessed on the main thread
MediaStreamTrack* mTrack;
const RefPtr<AbstractThread> mAbstractMainThread;
};
MediaStreamTrack::MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID,

View File

@@ -46,8 +46,9 @@ namespace mozilla {
LazyLogModule gTrackUnionStreamLog("TrackUnionStream");
#define STREAM_LOG(type, msg) MOZ_LOG(gTrackUnionStreamLog, type, msg)
TrackUnionStream::TrackUnionStream(AbstractThread* aMainThread) :
ProcessedMediaStream(aMainThread), mNextAvailableTrackID(1)
TrackUnionStream::TrackUnionStream()
: ProcessedMediaStream()
, mNextAvailableTrackID(1)
{
}

View File

@@ -17,7 +17,7 @@ namespace mozilla {
*/
class TrackUnionStream : public ProcessedMediaStream {
public:
explicit TrackUnionStream(AbstractThread* aMainThread);
explicit TrackUnionStream();
virtual TrackUnionStream* AsTrackUnionStream() override { return this; }
friend class DOMMediaStream;

View File

@@ -59,7 +59,6 @@ public:
{
if (event == MediaStreamGraphEvent::EVENT_FINISHED) {
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod("DecodedStreamGraphListener::DoNotifyFinished",
this,
&DecodedStreamGraphListener::DoNotifyFinished));
@@ -183,7 +182,7 @@ DecodedStreamData::DecodedStreamData(OutputStreamManager* aOutputStreamManager,
, mHaveSentFinish(false)
, mHaveSentFinishAudio(false)
, mHaveSentFinishVideo(false)
, mStream(aOutputStreamManager->Graph()->CreateSourceStream(aMainThread))
, mStream(aOutputStreamManager->Graph()->CreateSourceStream())
// DecodedStreamGraphListener will resolve this promise.
, mListener(new DecodedStreamGraphListener(mStream, Move(aPromise), aMainThread))
// mPlaying is initially true because MDSM won't start playback until playing

View File

@@ -168,8 +168,7 @@ public:
aNode->ResolvePromise(renderedBuffer);
mAbstractMainThread->Dispatch(do_AddRef(new OnCompleteTask(context,
renderedBuffer)));
context->Dispatch(do_AddRef(new OnCompleteTask(context, renderedBuffer)));
context->OnStateChanged(nullptr, AudioContextState::Closed);
}
@@ -261,8 +260,7 @@ public:
RefPtr<InputMutedRunnable> runnable =
new InputMutedRunnable(aStream, newInputMuted);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
runnable.forget());
}
}
@@ -336,9 +334,11 @@ AudioDestinationNode::AudioDestinationNode(AudioContext* aContext,
, mAudible(AudioChannelService::AudibleState::eAudible)
{
nsPIDOMWindowInner* window = aContext->GetParentObject();
MediaStreamGraph* graph = aIsOffline ?
MediaStreamGraph::CreateNonRealtimeInstance(aSampleRate, window) :
MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER, aChannel, window);
MediaStreamGraph* graph =
aIsOffline
? MediaStreamGraph::CreateNonRealtimeInstance(aSampleRate, window)
: MediaStreamGraph::GetInstance(
MediaStreamGraph::AUDIO_THREAD_DRIVER, aChannel, window);
AudioNodeEngine* engine = aIsOffline ?
new OfflineDestinationNodeEngine(this, aNumberOfChannels,
aLength, aSampleRate) :

View File

@@ -15,8 +15,9 @@ using namespace mozilla::dom;
namespace mozilla {
AudioNodeExternalInputStream::AudioNodeExternalInputStream(
AudioNodeEngine* aEngine, TrackRate aSampleRate, AbstractThread* aMainThread)
: AudioNodeStream(aEngine, NO_STREAM_FLAGS, aSampleRate, aMainThread)
AudioNodeEngine* aEngine,
TrackRate aSampleRate)
: AudioNodeStream(aEngine, NO_STREAM_FLAGS, aSampleRate)
{
MOZ_COUNT_CTOR(AudioNodeExternalInputStream);
}
@@ -28,15 +29,14 @@ AudioNodeExternalInputStream::~AudioNodeExternalInputStream()
/* static */ already_AddRefed<AudioNodeExternalInputStream>
AudioNodeExternalInputStream::Create(MediaStreamGraph* aGraph,
AudioNodeEngine* aEngine,
AbstractThread* aMainThread)
AudioNodeEngine* aEngine)
{
AudioContext* ctx = aEngine->NodeMainThread()->Context();
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aGraph->GraphRate() == ctx->SampleRate());
RefPtr<AudioNodeExternalInputStream> stream =
new AudioNodeExternalInputStream(aEngine, aGraph->GraphRate(), aMainThread);
new AudioNodeExternalInputStream(aEngine, aGraph->GraphRate());
stream->mSuspendedCount += ctx->ShouldSuspendNewStream();
aGraph->AddStream(stream);
return stream.forget();

View File

@@ -23,12 +23,12 @@ class AbstractThread;
class AudioNodeExternalInputStream final : public AudioNodeStream
{
public:
static already_AddRefed<AudioNodeExternalInputStream>
Create(MediaStreamGraph* aGraph, AudioNodeEngine* aEngine, AbstractThread* aMainThread);
static already_AddRefed<AudioNodeExternalInputStream> Create(
MediaStreamGraph* aGraph,
AudioNodeEngine* aEngine);
protected:
AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate,
AbstractThread* aMainThread);
AudioNodeExternalInputStream(AudioNodeEngine* aEngine, TrackRate aSampleRate);
~AudioNodeExternalInputStream();
public:

View File

@@ -29,17 +29,16 @@ namespace mozilla {
AudioNodeStream::AudioNodeStream(AudioNodeEngine* aEngine,
Flags aFlags,
TrackRate aSampleRate,
AbstractThread* aMainThread)
: ProcessedMediaStream(aMainThread),
mEngine(aEngine),
mSampleRate(aSampleRate),
mFlags(aFlags),
mNumberOfInputChannels(2),
mIsActive(aEngine->IsActive()),
mMarkAsFinishedAfterThisBlock(false),
mAudioParamStream(false),
mPassThrough(false)
TrackRate aSampleRate)
: ProcessedMediaStream()
, mEngine(aEngine)
, mSampleRate(aSampleRate)
, mFlags(aFlags)
, mNumberOfInputChannels(2)
, mIsActive(aEngine->IsActive())
, mMarkAsFinishedAfterThisBlock(false)
, mAudioParamStream(false)
, mPassThrough(false)
{
MOZ_ASSERT(NS_IsMainThread());
mSuspendedCount = !(mIsActive || mFlags & EXTERNAL_OUTPUT);
@@ -78,8 +77,7 @@ AudioNodeStream::Create(AudioContext* aCtx, AudioNodeEngine* aEngine,
AudioNode* node = aEngine->NodeMainThread();
RefPtr<AudioNodeStream> stream =
new AudioNodeStream(aEngine, aFlags, aGraph->GraphRate(),
aCtx->GetOwnerGlobal()->AbstractMainThreadFor(TaskCategory::Other));
new AudioNodeStream(aEngine, aFlags, aGraph->GraphRate());
stream->mSuspendedCount += aCtx->ShouldSuspendNewStream();
if (node) {
stream->SetChannelMixingParametersImpl(node->ChannelCount(),

View File

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

View File

@@ -159,8 +159,7 @@ public:
RefPtr<PlayingRefChangeHandler> refchanged =
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
@@ -174,8 +173,7 @@ public:
if (mBiquads.IsEmpty()) {
RefPtr<PlayingRefChangeHandler> refchanged =
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
} else { // Help people diagnose bug 924718
WebAudioUtils::LogToDeveloperConsole(mWindowID,

View File

@@ -125,8 +125,7 @@ public:
aStream->ScheduleCheckForInactive();
RefPtr<PlayingRefChanged> refchanged =
new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
@@ -147,8 +146,7 @@ public:
if (mLeftOverData <= 0) {
RefPtr<PlayingRefChanged> refchanged =
new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
mLeftOverData = mBufferLength;

View File

@@ -82,8 +82,7 @@ public:
if (mLeftOverData <= 0) {
RefPtr<PlayingRefChanged> refchanged =
new PlayingRefChanged(aStream, PlayingRefChanged::ADDREF);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
mLeftOverData = mBuffer.MaxDelayTicks();
@@ -99,8 +98,7 @@ public:
RefPtr<PlayingRefChanged> refchanged =
new PlayingRefChanged(aStream, PlayingRefChanged::RELEASE);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);

View File

@@ -56,8 +56,7 @@ public:
RefPtr<PlayingRefChangeHandler> refchanged =
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
@@ -70,8 +69,7 @@ public:
if (mIIRFilters.IsEmpty()) {
RefPtr<PlayingRefChangeHandler> refchanged =
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
} else {
WebAudioUtils::LogToDeveloperConsole(mWindowID,

View File

@@ -84,9 +84,7 @@ MediaStreamAudioSourceNode::Init(DOMMediaStream* aMediaStream, ErrorResult& aRv)
mInputStream = aMediaStream;
AudioNodeEngine* engine = new MediaStreamAudioSourceNodeEngine(this);
mStream =
AudioNodeExternalInputStream::Create(graph, engine,
aMediaStream->AbstractMainThread());
mStream = AudioNodeExternalInputStream::Create(graph, engine);
mInputStream->AddConsumerToKeepAlive(static_cast<nsIDOMEventTarget*>(this));
mInputStream->RegisterTrackListener(this);

View File

@@ -208,8 +208,7 @@ public:
RefPtr<PlayingRefChangeHandler> refchanged =
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::RELEASE);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
aOutput->SetNull(WEBAUDIO_BLOCK_SIZE);
@@ -219,8 +218,7 @@ public:
if (mLeftOverData == INT_MIN) {
RefPtr<PlayingRefChangeHandler> refchanged =
new PlayingRefChangeHandler(aStream, PlayingRefChangeHandler::ADDREF);
aStream->Graph()->
DispatchToMainThreadAfterStreamStateUpdate(mAbstractMainThread,
aStream->Graph()->DispatchToMainThreadAfterStreamStateUpdate(
refchanged.forget());
}
mLeftOverData = mHRTFPanner->maxTailFrames();

View File

@@ -37,7 +37,6 @@ public:
: mSpeechTask(aSpeechTask)
, mStream(aStream)
, mStarted(false)
, mAbstractMainThread(aMainThread)
{
}
@@ -65,14 +64,12 @@ public:
if (!mStarted) {
mStarted = true;
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod("dom::SynthStreamListener::DoNotifyStarted",
this,
&SynthStreamListener::DoNotifyStarted));
}
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod("dom::SynthStreamListener::DoNotifyFinished",
this,
&SynthStreamListener::DoNotifyFinished));
@@ -93,7 +90,6 @@ public:
if (aBlocked == MediaStreamListener::UNBLOCKED && !mStarted) {
mStarted = true;
aGraph->DispatchToMainThreadAfterStreamStateUpdate(
mAbstractMainThread,
NewRunnableMethod("dom::SynthStreamListener::DoNotifyStarted",
this,
&SynthStreamListener::DoNotifyStarted));
@@ -108,8 +104,6 @@ private:
RefPtr<MediaStream> mStream;
bool mStarted;
const RefPtr<AbstractThread> mAbstractMainThread;
};
// nsSpeechTask
@@ -176,7 +170,7 @@ nsSpeechTask::InitDirectAudio()
// This is a global MSG.
mStream = MediaStreamGraph::GetInstance(MediaStreamGraph::AUDIO_THREAD_DRIVER,
AudioChannel::Normal, nullptr)->
CreateSourceStream(AbstractThread::MainThread() /* Non DocGroup-version for the task in parent. */);
CreateSourceStream();
mIndirectAudio = false;
mInited = true;
}

View File

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