Bug 1250934: Factor out AudioTracksPresent() in MediaStreamGraph, and add checks of 'pending' tracks r=padenot

MozReview-Commit-ID: KLWleRaAjx3
This commit is contained in:
Randell Jesup 2016-03-08 12:11:08 -05:00
Родитель 2fcb417fe7
Коммит 6cbe994f89
2 изменённых файлов: 38 добавлений и 31 удалений

Просмотреть файл

@ -336,19 +336,19 @@ namespace {
const uint32_t IN_MUTED_CYCLE = 1;
} // namespace
void
MediaStreamGraphImpl::UpdateStreamOrder()
bool
MediaStreamGraphImpl::AudioTrackPresent(bool& aNeedsAEC)
{
#ifdef MOZ_WEBRTC
bool shouldAEC = false;
#endif
bool audioTrackPresent = false;
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
for (uint32_t i = 0; i < mStreams.Length() && audioTrackPresent == false; ++i) {
MediaStream* stream = mStreams[i];
SourceMediaStream* source = stream->AsSourceStream();
#ifdef MOZ_WEBRTC
if (stream->AsSourceStream() &&
stream->AsSourceStream()->NeedsMixing()) {
shouldAEC = true;
if (source && source->NeedsMixing()) {
aNeedsAEC = true;
}
#endif
// If this is a AudioNodeStream, force a AudioCallbackDriver.
@ -360,7 +360,28 @@ MediaStreamGraphImpl::UpdateStreamOrder()
audioTrackPresent = true;
}
}
if (source) {
for (auto& data : source->mPendingTracks) {
if (data.mData->GetType() == MediaSegment::AUDIO) {
audioTrackPresent = true;
break;
}
}
}
}
#ifdef MOZ_WEBRTC
aNeedsAEC = shouldAEC;
#endif
return audioTrackPresent;
}
void
MediaStreamGraphImpl::UpdateStreamOrder()
{
bool shouldAEC = false;
bool audioTrackPresent = AudioTrackPresent(shouldAEC);
// Note that this looks for any audio streams, input or output, and switches to a
// SystemClockDriver if there are none. However, if another is already pending, let that
// switch happen.
@ -1026,20 +1047,8 @@ MediaStreamGraphImpl::CloseAudioInputImpl(AudioDataListener *aListener)
mAudioInputs.RemoveElement(aListener);
// Switch Drivers since we're adding or removing an input (to nothing/system or output only)
bool audioTrackPresent = false;
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
MediaStream* stream = mStreams[i];
// If this is a AudioNodeStream, force a AudioCallbackDriver.
if (stream->AsAudioNodeStream()) {
audioTrackPresent = true;
} else if (CurrentDriver()->AsAudioCallbackDriver()) {
// only if there's a real switch!
for (StreamBuffer::TrackIter tracks(stream->GetStreamBuffer(), MediaSegment::AUDIO);
!tracks.IsEnded(); tracks.Next()) {
audioTrackPresent = true;
}
}
}
bool shouldAEC = false;
bool audioTrackPresent = AudioTrackPresent(shouldAEC);
MonitorAutoLock mon(mMonitor);
if (mLifecycleState == LIFECYCLE_RUNNING) {
@ -3273,17 +3282,9 @@ MediaStreamGraphImpl::ApplyAudioContextOperationImpl(
// This is the same logic as in UpdateStreamOrder, but it's simpler to have it
// here as well so we don't have to store the Promise(s) on the Graph.
if (aOperation != AudioContextOperation::Resume) {
bool audioTrackPresent = false;
for (uint32_t i = 0; i < mStreams.Length(); ++i) {
MediaStream* stream = mStreams[i];
if (stream->AsAudioNodeStream()) {
audioTrackPresent = true;
}
for (StreamBuffer::TrackIter tracks(stream->GetStreamBuffer(), MediaSegment::AUDIO);
!tracks.IsEnded(); tracks.Next()) {
audioTrackPresent = true;
}
}
bool shouldAEC = false;
bool audioTrackPresent = AudioTrackPresent(shouldAEC);
if (!audioTrackPresent && CurrentDriver()->AsAudioCallbackDriver()) {
CurrentDriver()->AsAudioCallbackDriver()->
EnqueueStreamAndPromiseForOperation(aDestinationStream, aPromise,

Просмотреть файл

@ -333,6 +333,12 @@ public:
void SuspendOrResumeStreams(dom::AudioContextOperation aAudioContextOperation,
const nsTArray<MediaStream*>& aStreamSet);
/**
* Determine if we have any audio tracks, or are about to add any audiotracks.
* Also checks if we'll need the AEC running (i.e. microphone input tracks)
*/
bool AudioTrackPresent(bool& aNeedsAEC);
/**
* Sort mStreams so that every stream not in a cycle is after any streams
* it depends on, and every stream in a cycle is marked as being in a cycle.