Bug 1281193 - Lock when touching tracks in SourceAudioStreams. r?pehrsons draft
authorPaul Adenot <paul@paul.cx>
Wed, 22 Jun 2016 17:44:46 +0200
changeset 380664 4ee98983d6d7aeb3c52cd8017a1db3a9068b2f87
parent 380663 24f73cec246bbef28e4e0ddf2853cdf2abd8b346
child 380674 d9da19dbdf2afb52b1e4bb1544b82cc486ec84cd
push id21272
push userpaul@paul.cx
push dateWed, 22 Jun 2016 15:45:21 +0000
reviewerspehrsons
bugs1281193
milestone50.0a1
Bug 1281193 - Lock when touching tracks in SourceAudioStreams. r?pehrsons MozReview-Commit-ID: 2aSS8esq5jq
dom/media/MediaStreamGraph.cpp
dom/media/MediaStreamGraph.h
--- 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,