From 60200d1094ea46651752d0ce8eab78a1fee8273f Mon Sep 17 00:00:00 2001 From: "henrik.lundin" Date: Wed, 18 May 2016 01:48:39 -0700 Subject: [PATCH] Add FrameAndMuteInfo to AudioConferenceMixer BUG=webrtc:5609 Review-Url: https://codereview.webrtc.org/1980343002 Cr-Commit-Position: refs/heads/master@{#12786} --- .../source/audio_conference_mixer_impl.cc | 50 +++++++++++-------- .../source/audio_conference_mixer_impl.h | 8 ++- 2 files changed, 37 insertions(+), 21 deletions(-) diff --git a/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc b/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc index ec73480fa4..552d9c4f3c 100644 --- a/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc +++ b/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.cc @@ -58,7 +58,7 @@ size_t MaxNumChannels(const AudioFrameList* list) { for (AudioFrameList::const_iterator iter = list->begin(); iter != list->end(); ++iter) { - max_num_channels = std::max(max_num_channels, (*iter)->num_channels_); + max_num_channels = std::max(max_num_channels, (*iter).frame->num_channels_); } return max_num_channels; } @@ -555,6 +555,7 @@ void AudioConferenceMixerImpl::UpdateToMix( } audioFrame->sample_rate_hz_ = _outputFrequency; + bool muted = false; if((*participant)->GetAudioFrame(_id, audioFrame) != 0) { WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, _id, "failed to GetAudioFrame() from participant"); @@ -590,7 +591,7 @@ void AudioConferenceMixerImpl::UpdateToMix( for (AudioFrameList::iterator iter = activeList.begin(); iter != activeList.end(); ++iter) { - const uint32_t energy = CalculateEnergy(**iter); + const uint32_t energy = CalculateEnergy(*iter->frame); if(energy < lowestEnergy) { replaceItem = iter; lowestEnergy = energy; @@ -598,11 +599,11 @@ void AudioConferenceMixerImpl::UpdateToMix( } } if(found_replace_item) { - AudioFrame* replaceFrame = *replaceItem; + FrameAndMuteInfo replaceFrame = *replaceItem; bool replaceWasMixed = false; std::map::const_iterator it = - mixParticipantList->find(replaceFrame->id_); + mixParticipantList->find(replaceFrame.frame->id_); // When a frame is pushed to |activeList| it is also pushed // to mixParticipantList with the frame's id. This means @@ -610,26 +611,27 @@ void AudioConferenceMixerImpl::UpdateToMix( assert(it != mixParticipantList->end()); replaceWasMixed = it->second->_mixHistory->WasMixed(); - mixParticipantList->erase(replaceFrame->id_); + mixParticipantList->erase(replaceFrame.frame->id_); activeList.erase(replaceItem); - activeList.push_front(audioFrame); + activeList.push_front(FrameAndMuteInfo(audioFrame, muted)); (*mixParticipantList)[audioFrame->id_] = *participant; assert(mixParticipantList->size() <= kMaximumAmountOfMixedParticipants); if (replaceWasMixed) { - RampOut(*replaceFrame); + RampOut(*replaceFrame.frame); rampOutList->push_back(replaceFrame); assert(rampOutList->size() <= kMaximumAmountOfMixedParticipants); } else { - _audioFramePool->PushMemory(replaceFrame); + _audioFramePool->PushMemory(replaceFrame.frame); } } else { if(wasMixed) { RampOut(*audioFrame); - rampOutList->push_back(audioFrame); + rampOutList->push_back(FrameAndMuteInfo(audioFrame, + muted)); assert(rampOutList->size() <= kMaximumAmountOfMixedParticipants); } else { @@ -637,7 +639,7 @@ void AudioConferenceMixerImpl::UpdateToMix( } } } else { - activeList.push_front(audioFrame); + activeList.push_front(FrameAndMuteInfo(audioFrame, muted)); (*mixParticipantList)[audioFrame->id_] = *participant; assert(mixParticipantList->size() <= kMaximumAmountOfMixedParticipants); @@ -645,12 +647,12 @@ void AudioConferenceMixerImpl::UpdateToMix( } else { if(wasMixed) { ParticipantFrameStruct* part_struct = - new ParticipantFrameStruct(*participant, audioFrame, false); + new ParticipantFrameStruct(*participant, audioFrame, muted); passiveWasMixedList.push_back(part_struct); } else if(mustAddToPassiveList) { RampIn(*audioFrame); ParticipantFrameStruct* part_struct = - new ParticipantFrameStruct(*participant, audioFrame, false); + new ParticipantFrameStruct(*participant, audioFrame, muted); passiveWasNotMixedList.push_back(part_struct); } else { _audioFramePool->PushMemory(audioFrame); @@ -673,7 +675,8 @@ void AudioConferenceMixerImpl::UpdateToMix( iter = passiveWasMixedList.begin(); iter != passiveWasMixedList.end(); ++iter) { if(mixList->size() < *maxAudioFrameCounter + mixListStartSize) { - mixList->push_back((*iter)->audioFrame); + mixList->push_back(FrameAndMuteInfo((*iter)->audioFrame, + (*iter)->muted)); (*mixParticipantList)[(*iter)->audioFrame->id_] = (*iter)->participant; assert(mixParticipantList->size() <= @@ -689,7 +692,8 @@ void AudioConferenceMixerImpl::UpdateToMix( iter != passiveWasNotMixedList.end(); ++iter) { if(mixList->size() < *maxAudioFrameCounter + mixListStartSize) { - mixList->push_back((*iter)->audioFrame); + mixList->push_back(FrameAndMuteInfo((*iter)->audioFrame, + (*iter)->muted)); (*mixParticipantList)[(*iter)->audioFrame->id_] = (*iter)->participant; assert(mixParticipantList->size() <= @@ -728,6 +732,7 @@ void AudioConferenceMixerImpl::GetAdditionalAudio( return; } audioFrame->sample_rate_hz_ = _outputFrequency; + bool muted = false; if((*participant)->GetAudioFrame(_id, audioFrame) != 0) { WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, _id, "failed to GetAudioFrame() from participant"); @@ -739,7 +744,7 @@ void AudioConferenceMixerImpl::GetAdditionalAudio( _audioFramePool->PushMemory(audioFrame); continue; } - additionalFramesList->push_back(audioFrame); + additionalFramesList->push_back(FrameAndMuteInfo(audioFrame, muted)); } } @@ -776,7 +781,7 @@ void AudioConferenceMixerImpl::ClearAudioFrameList( for (AudioFrameList::iterator iter = audioFrameList->begin(); iter != audioFrameList->end(); ++iter) { - _audioFramePool->PushMemory(*iter); + _audioFramePool->PushMemory(iter->frame); } audioFrameList->clear(); } @@ -835,8 +840,9 @@ int32_t AudioConferenceMixerImpl::MixFromList( uint32_t position = 0; if (_numMixedParticipants == 1) { - mixedAudio->timestamp_ = audioFrameList.front()->timestamp_; - mixedAudio->elapsed_time_ms_ = audioFrameList.front()->elapsed_time_ms_; + mixedAudio->timestamp_ = audioFrameList.front().frame->timestamp_; + mixedAudio->elapsed_time_ms_ = + audioFrameList.front().frame->elapsed_time_ms_; } else { // TODO(wu): Issue 3390. // Audio frame timestamp is only supported in one channel case. @@ -858,7 +864,9 @@ int32_t AudioConferenceMixerImpl::MixFromList( assert(false); position = 0; } - MixFrames(mixedAudio, (*iter), use_limiter_); + if (!iter->muted) { + MixFrames(mixedAudio, iter->frame, use_limiter_); + } position++; } @@ -878,7 +886,9 @@ int32_t AudioConferenceMixerImpl::MixAnonomouslyFromList( for (AudioFrameList::const_iterator iter = audioFrameList.begin(); iter != audioFrameList.end(); ++iter) { - MixFrames(mixedAudio, *iter, use_limiter_); + if (!iter->muted) { + MixFrames(mixedAudio, iter->frame, use_limiter_); + } } return 0; } diff --git a/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h b/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h index 22c6a23535..e726c08f75 100644 --- a/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h +++ b/webrtc/modules/audio_conference_mixer/source/audio_conference_mixer_impl.h @@ -25,7 +25,13 @@ namespace webrtc { class AudioProcessing; class CriticalSectionWrapper; -typedef std::list AudioFrameList; +struct FrameAndMuteInfo { + FrameAndMuteInfo(AudioFrame* f, bool m) : frame(f), muted(m) {} + AudioFrame* frame; + bool muted; +}; + +typedef std::list AudioFrameList; typedef std::list MixerParticipantList; // Cheshire cat implementation of MixerParticipant's non virtual functions.