Bug 1296531 - Make AudioNodeStream work with track listeners. r?padenot
MozReview-Commit-ID: ArJiDLh4kle
--- 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(©Chunk);
for (uint32_t j = 0; j < mListeners.Length(); ++j) {
MediaStreamListener* l = mListeners[j];
- AudioChunk copyChunk = mLastChunks[0].AsAudioChunk();
- AudioSegment tmpSegment;
- tmpSegment.AppendAndConsumeChunk(©Chunk);
+ // 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.