Bug 1281193 - Lock when touching tracks in SourceAudioStreams. r?pehrsons
MozReview-Commit-ID: 2aSS8esq5jq
--- a/dom/media/MediaStreamGraph.cpp
+++ b/dom/media/MediaStreamGraph.cpp
@@ -482,22 +482,17 @@ MediaStreamGraphImpl::AudioTrackPresent(
audioTrackPresent = true;
} else {
for (StreamTracks::TrackIter tracks(stream->GetStreamTracks(), MediaSegment::AUDIO);
!tracks.IsEnded(); tracks.Next()) {
audioTrackPresent = true;
}
}
if (source) {
- for (auto& data : source->mPendingTracks) {
- if (data.mData->GetType() == MediaSegment::AUDIO) {
- audioTrackPresent = true;
- break;
- }
- }
+ audioTrackPresent = source->HasPendingAudioTrack();
}
}
// XXX For some reason, there are race conditions when starting an audio input where
// we find no active audio tracks. In any case, if we have an active audio input we
// should not allow a switch back to a SystemClockDriver
if (!audioTrackPresent && mInputDeviceUsers.Count() != 0) {
NS_WARNING("No audio tracks, but full-duplex audio is enabled!!!!!");
@@ -3044,16 +3039,32 @@ SourceMediaStream::RegisterForAudioMixin
bool
SourceMediaStream::NeedsMixing()
{
MutexAutoLock lock(mMutex);
return mNeedsMixing;
}
+bool
+SourceMediaStream::HasPendingAudioTrack()
+{
+ MutexAutoLock lock(mMutex);
+ bool audioTrackPresent = false;
+
+ for (auto& data : mPendingTracks) {
+ if (data.mData->GetType() == MediaSegment::AUDIO) {
+ audioTrackPresent = true;
+ break;
+ }
+ }
+
+ return audioTrackPresent;
+}
+
void
MediaInputPort::Init()
{
STREAM_LOG(LogLevel::Debug, ("Adding MediaInputPort %p (from %p to %p) to the graph",
this, mSource, mDest));
mSource->AddConsumer(this);
mDest->AddInput(this);
// mPortCount decremented via MediaInputPort::Destroy's message
--- a/dom/media/MediaStreamGraph.h
+++ b/dom/media/MediaStreamGraph.h
@@ -1087,16 +1087,23 @@ public:
/**
* End all tracks and Finish() this stream. Used to voluntarily revoke access
* to a LocalMediaStream.
*/
void EndAllTrackAndFinish();
void RegisterForAudioMixing();
+ /**
+ * Returns true if this SourceMediaStream contains at least one audio track
+ * that is in pending state.
+ * This is thread safe, and takes the stream monitor.
+ */
+ bool HasPendingAudioTrack();
+
// XXX need a Reset API
friend class MediaStreamGraphImpl;
protected:
enum TrackCommands {
TRACK_CREATE = MediaStreamListener::TRACK_EVENT_CREATED,
TRACK_END = MediaStreamListener::TRACK_EVENT_ENDED,