Bug 1296531 - Make AudioNodeStream work with track listeners. r?padenot draft
authorAndreas Pehrson <pehrsons@gmail.com>
Thu, 17 Nov 2016 10:19:12 +0100
changeset 670288 f361013872a5fbc0a598b80f5029875d26bc89b8
parent 670287 f7b2d7f48c66cbeb49ab8f74cd2b2e04136343f9
child 670289 7b57295633aeb2a36a4843d48c48d0af2d321cde
push id81598
push userbmo:apehrson@mozilla.com
push dateTue, 26 Sep 2017 09:13:19 +0000
reviewerspadenot
bugs1296531
milestone58.0a1
Bug 1296531 - Make AudioNodeStream work with track listeners. r?padenot MozReview-Commit-ID: ArJiDLh4kle
dom/media/webaudio/AudioNodeStream.cpp
--- a/dom/media/webaudio/AudioNodeStream.cpp
+++ b/dom/media/webaudio/AudioNodeStream.cpp
@@ -628,45 +628,61 @@ void
 AudioNodeStream::AdvanceOutputSegment()
 {
   StreamTracks::Track* track = EnsureTrack(AUDIO_TRACK);
   // No more tracks will be coming
   mTracks.AdvanceKnownTracksTime(STREAM_TIME_MAX);
 
   AudioSegment* segment = track->Get<AudioSegment>();
 
-  if (!mLastChunks[0].IsNull()) {
-    segment->AppendAndConsumeChunk(mLastChunks[0].AsMutableChunk());
-  } else {
-    segment->AppendNullData(mLastChunks[0].GetDuration());
-  }
+  AudioChunk copyChunk = *mLastChunks[0].AsMutableChunk();
+  AudioSegment tmpSegment;
+  tmpSegment.AppendAndConsumeChunk(&copyChunk);
 
   for (uint32_t j = 0; j < mListeners.Length(); ++j) {
     MediaStreamListener* l = mListeners[j];
-    AudioChunk copyChunk = mLastChunks[0].AsAudioChunk();
-    AudioSegment tmpSegment;
-    tmpSegment.AppendAndConsumeChunk(&copyChunk);
+    // Notify MediaStreamListeners.
     l->NotifyQueuedTrackChanges(Graph(), AUDIO_TRACK,
                                 segment->GetDuration(), TrackEventCommand::TRACK_EVENT_NONE, tmpSegment);
   }
+  for (TrackBound<MediaStreamTrackListener>& b : mTrackListeners) {
+    // Notify MediaStreamTrackListeners.
+    if (b.mTrackID != AUDIO_TRACK) {
+      continue;
+    }
+    b.mListener->NotifyQueuedChanges(Graph(), segment->GetDuration(), tmpSegment);
+  }
+
+  if (mLastChunks[0].IsNull()) {
+    segment->AppendNullData(tmpSegment.GetDuration());
+  } else {
+    segment->AppendFrom(&tmpSegment);
+  }
 }
 
 void
 AudioNodeStream::FinishOutput()
 {
   StreamTracks::Track* track = EnsureTrack(AUDIO_TRACK);
   track->SetEnded();
 
   for (uint32_t j = 0; j < mListeners.Length(); ++j) {
     MediaStreamListener* l = mListeners[j];
     AudioSegment emptySegment;
     l->NotifyQueuedTrackChanges(Graph(), AUDIO_TRACK,
                                 track->GetSegment()->GetDuration(),
                                 TrackEventCommand::TRACK_EVENT_ENDED, emptySegment);
   }
+  for (TrackBound<MediaStreamTrackListener>& b : mTrackListeners) {
+    // Notify MediaStreamTrackListeners.
+    if (b.mTrackID != AUDIO_TRACK) {
+      continue;
+    }
+    b.mListener->NotifyEnded();
+  }
 }
 
 void
 AudioNodeStream::AddInput(MediaInputPort* aPort)
 {
   ProcessedMediaStream::AddInput(aPort);
   AudioNodeStream* ns = aPort->GetSource()->AsAudioNodeStream();
   // Streams that are not AudioNodeStreams are considered active.