 Chromium Code Reviews
 Chromium Code Reviews Issue 2402283003:
  Cleanup of the mixer interface.  (Closed)
    
  
    Issue 2402283003:
  Cleanup of the mixer interface.  (Closed) 
  | Index: webrtc/modules/audio_mixer/audio_mixer_impl.cc | 
| diff --git a/webrtc/modules/audio_mixer/audio_mixer_impl.cc b/webrtc/modules/audio_mixer/audio_mixer_impl.cc | 
| index 38e2aab74c398bc37677ad6a6ea2be5f9c56bfdb..21f753984ac442ea682173c5fc9cc7b4ad7a290d 100644 | 
| --- a/webrtc/modules/audio_mixer/audio_mixer_impl.cc | 
| +++ b/webrtc/modules/audio_mixer/audio_mixer_impl.cc | 
| @@ -17,7 +17,6 @@ | 
| #include "webrtc/base/logging.h" | 
| #include "webrtc/modules/audio_mixer/audio_frame_manipulator.h" | 
| #include "webrtc/modules/utility/include/audio_frame_operations.h" | 
| -#include "webrtc/system_wrappers/include/trace.h" | 
| 
aleloi
2016/10/10 12:54:39
Trace removed and replaced with 'LOG' where it mak
 
the sun
2016/10/10 13:46:07
Acknowledged.
 | 
| namespace webrtc { | 
| namespace { | 
| @@ -81,12 +80,10 @@ void RampAndUpdateGain( | 
| // Mix the AudioFrames stored in audioFrameList into mixed_audio. | 
| int32_t MixFromList(AudioFrame* mixed_audio, | 
| const AudioFrameList& audio_frame_list, | 
| - int32_t id, | 
| bool use_limiter) { | 
| - WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id, | 
| - "MixFromList(mixed_audio, audio_frame_list)"); | 
| - if (audio_frame_list.empty()) | 
| + if (audio_frame_list.empty()) { | 
| 
the sun
2016/10/10 13:46:06
Don't you need to null the output frame?
 
aleloi
2016/10/10 14:10:16
It's done in Mix when the algorithm compares frame
 
the sun
2016/10/10 14:19:52
Acknowledged.
 | 
| return 0; | 
| + } | 
| if (audio_frame_list.size() == 1) { | 
| mixed_audio->timestamp_ = audio_frame_list.front()->timestamp_; | 
| @@ -128,6 +125,7 @@ AudioMixerImpl::SourceStatusList::const_iterator FindSourceInList( | 
| }); | 
| } | 
| +// TODO(aleloi): remove non-const version when WEBRTC only supports modern STL. | 
| AudioMixerImpl::SourceStatusList::iterator FindSourceInList( | 
| AudioMixerImpl::Source const* audio_source, | 
| AudioMixerImpl::SourceStatusList* audio_source_list) { | 
| @@ -139,14 +137,12 @@ AudioMixerImpl::SourceStatusList::iterator FindSourceInList( | 
| } // namespace | 
| -std::unique_ptr<AudioMixer> AudioMixer::Create(int id) { | 
| - return AudioMixerImpl::Create(id); | 
| +std::unique_ptr<AudioMixer> AudioMixer::Create() { | 
| + return AudioMixerImpl::Create(); | 
| } | 
| -AudioMixerImpl::AudioMixerImpl(int id, std::unique_ptr<AudioProcessing> limiter) | 
| - : id_(id), | 
| - audio_source_list_(), | 
| - additional_audio_source_list_(), | 
| +AudioMixerImpl::AudioMixerImpl(std::unique_ptr<AudioProcessing> limiter) | 
| + : audio_source_list_(), | 
| num_mixed_audio_sources_(0), | 
| use_limiter_(true), | 
| time_stamp_(0), | 
| @@ -157,34 +153,41 @@ AudioMixerImpl::AudioMixerImpl(int id, std::unique_ptr<AudioProcessing> limiter) | 
| AudioMixerImpl::~AudioMixerImpl() {} | 
| -std::unique_ptr<AudioMixerImpl> AudioMixerImpl::Create(int id) { | 
| +std::unique_ptr<AudioMixerImpl> AudioMixerImpl::Create() { | 
| Config config; | 
| config.Set<ExperimentalAgc>(new ExperimentalAgc(false)); | 
| std::unique_ptr<AudioProcessing> limiter(AudioProcessing::Create(config)); | 
| - if (!limiter.get()) | 
| + if (!limiter.get()) { | 
| 
aleloi
2016/10/10 12:54:39
Consistent use of {} for one-line blocks.
 
the sun
2016/10/10 13:46:07
That warms my heart. :)
 | 
| return nullptr; | 
| + } | 
| if (limiter->gain_control()->set_mode(GainControl::kFixedDigital) != | 
| - limiter->kNoError) | 
| + limiter->kNoError) { | 
| return nullptr; | 
| + } | 
| // We smoothly limit the mixed frame to -7 dbFS. -6 would correspond to the | 
| // divide-by-2 but -7 is used instead to give a bit of headroom since the | 
| // AGC is not a hard limiter. | 
| - if (limiter->gain_control()->set_target_level_dbfs(7) != limiter->kNoError) | 
| + if (limiter->gain_control()->set_target_level_dbfs(7) != limiter->kNoError) { | 
| return nullptr; | 
| + } | 
| - if (limiter->gain_control()->set_compression_gain_db(0) != limiter->kNoError) | 
| + if (limiter->gain_control()->set_compression_gain_db(0) != | 
| + limiter->kNoError) { | 
| return nullptr; | 
| + } | 
| - if (limiter->gain_control()->enable_limiter(true) != limiter->kNoError) | 
| + if (limiter->gain_control()->enable_limiter(true) != limiter->kNoError) { | 
| return nullptr; | 
| + } | 
| - if (limiter->gain_control()->Enable(true) != limiter->kNoError) | 
| + if (limiter->gain_control()->Enable(true) != limiter->kNoError) { | 
| return nullptr; | 
| + } | 
| return std::unique_ptr<AudioMixerImpl>( | 
| - new AudioMixerImpl(id, std::move(limiter))); | 
| + new AudioMixerImpl(std::move(limiter))); | 
| } | 
| void AudioMixerImpl::Mix(int sample_rate, | 
| @@ -193,31 +196,19 @@ void AudioMixerImpl::Mix(int sample_rate, | 
| RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2); | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| - if (sample_rate != kNbInHz && sample_rate != kWbInHz && | 
| - sample_rate != kSwbInHz && sample_rate != kFbInHz) { | 
| - WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_, | 
| - "Invalid frequency: %d", sample_rate); | 
| - RTC_NOTREACHED(); | 
| - return; | 
| - } | 
| if (OutputFrequency() != sample_rate) { | 
| - SetOutputFrequency(static_cast<Frequency>(sample_rate)); | 
| + SetOutputFrequency(sample_rate); | 
| } | 
| AudioFrameList mix_list; | 
| - AudioFrameList anonymous_mix_list; | 
| size_t num_mixed_audio_sources; | 
| { | 
| rtc::CritScope lock(&crit_); | 
| mix_list = GetNonAnonymousAudio(); | 
| - anonymous_mix_list = GetAnonymousAudio(); | 
| num_mixed_audio_sources = num_mixed_audio_sources_; | 
| } | 
| - mix_list.insert(mix_list.begin(), anonymous_mix_list.begin(), | 
| - anonymous_mix_list.end()); | 
| - | 
| for (const auto& frame : mix_list) { | 
| RemixFrame(frame, number_of_channels); | 
| } | 
| @@ -231,7 +222,7 @@ void AudioMixerImpl::Mix(int sample_rate, | 
| use_limiter_ = num_mixed_audio_sources > 1; | 
| // We only use the limiter if we're actually mixing multiple streams. | 
| - MixFromList(audio_frame_for_mixing, mix_list, id_, use_limiter_); | 
| + MixFromList(audio_frame_for_mixing, mix_list, use_limiter_); | 
| if (audio_frame_for_mixing->samples_per_channel_ == 0) { | 
| // Nothing was mixed, set the audio samples to silence. | 
| @@ -242,40 +233,28 @@ void AudioMixerImpl::Mix(int sample_rate, | 
| LimitMixedAudio(audio_frame_for_mixing); | 
| } | 
| - // Pass the final result to the level indicator. | 
| - audio_level_.ComputeLevel(*audio_frame_for_mixing); | 
| - | 
| return; | 
| } | 
| -int32_t AudioMixerImpl::SetOutputFrequency(const Frequency& frequency) { | 
| +void AudioMixerImpl::SetOutputFrequency(int frequency) { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| output_frequency_ = frequency; | 
| sample_size_ = (output_frequency_ * kFrameDurationInMs) / 1000; | 
| - | 
| - return 0; | 
| } | 
| -AudioMixer::Frequency AudioMixerImpl::OutputFrequency() const { | 
| +int AudioMixerImpl::OutputFrequency() const { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| return output_frequency_; | 
| } | 
| int32_t AudioMixerImpl::SetMixabilityStatus(Source* audio_source, | 
| bool mixable) { | 
| - if (!mixable) { | 
| - // Anonymous audio sources are in a separate list. Make sure that the | 
| - // audio source is in the _audioSourceList if it is being mixed. | 
| - SetAnonymousMixabilityStatus(audio_source, false); | 
| - } | 
| { | 
| rtc::CritScope lock(&crit_); | 
| const bool is_mixed = FindSourceInList(audio_source, &audio_source_list_) != | 
| audio_source_list_.end(); | 
| // API must be called with a new state. | 
| if (!(mixable ^ is_mixed)) { | 
| - WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, id_, | 
| - "Mixable is aready %s", is_mixed ? "ON" : "off"); | 
| return -1; | 
| } | 
| bool success = false; | 
| @@ -285,8 +264,6 @@ int32_t AudioMixerImpl::SetMixabilityStatus(Source* audio_source, | 
| success = RemoveAudioSourceFromList(audio_source, &audio_source_list_); | 
| } | 
| if (!success) { | 
| - WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_, | 
| - "failed to %s audio_source", mixable ? "add" : "remove"); | 
| RTC_NOTREACHED(); | 
| return -1; | 
| } | 
| @@ -295,64 +272,15 @@ int32_t AudioMixerImpl::SetMixabilityStatus(Source* audio_source, | 
| if (num_mixed_non_anonymous > kMaximumAmountOfMixedAudioSources) { | 
| num_mixed_non_anonymous = kMaximumAmountOfMixedAudioSources; | 
| } | 
| - num_mixed_audio_sources_ = | 
| - num_mixed_non_anonymous + additional_audio_source_list_.size(); | 
| + num_mixed_audio_sources_ = num_mixed_non_anonymous; | 
| } | 
| return 0; | 
| } | 
| -bool AudioMixerImpl::MixabilityStatus(const Source& audio_source) const { | 
| - rtc::CritScope lock(&crit_); | 
| - return FindSourceInList(&audio_source, &audio_source_list_) != | 
| - audio_source_list_.end(); | 
| -} | 
| -int32_t AudioMixerImpl::SetAnonymousMixabilityStatus(Source* audio_source, | 
| - bool anonymous) { | 
| - rtc::CritScope lock(&crit_); | 
| - if (FindSourceInList(audio_source, &additional_audio_source_list_) != | 
| - additional_audio_source_list_.end()) { | 
| - if (anonymous) { | 
| - return 0; | 
| - } | 
| - if (!RemoveAudioSourceFromList(audio_source, | 
| - &additional_audio_source_list_)) { | 
| - WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_, | 
| - "unable to remove audio_source from anonymous list"); | 
| - RTC_NOTREACHED(); | 
| - return -1; | 
| - } | 
| - return AddAudioSourceToList(audio_source, &audio_source_list_) ? 0 : -1; | 
| - } | 
| - if (!anonymous) { | 
| - return 0; | 
| - } | 
| - const bool mixable = | 
| - RemoveAudioSourceFromList(audio_source, &audio_source_list_); | 
| - if (!mixable) { | 
| - WEBRTC_TRACE( | 
| - kTraceWarning, kTraceAudioMixerServer, id_, | 
| - "audio_source must be registered before turning it into anonymous"); | 
| - // Setting anonymous status is only possible if MixerAudioSource is | 
| - // already registered. | 
| - return -1; | 
| - } | 
| - return AddAudioSourceToList(audio_source, &additional_audio_source_list_) | 
| - ? 0 | 
| - : -1; | 
| -} | 
| - | 
| -bool AudioMixerImpl::AnonymousMixabilityStatus( | 
| - const Source& audio_source) const { | 
| - rtc::CritScope lock(&crit_); | 
| - return FindSourceInList(&audio_source, &additional_audio_source_list_) != | 
| - additional_audio_source_list_.end(); | 
| -} | 
| AudioFrameList AudioMixerImpl::GetNonAnonymousAudio() { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| - WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_, | 
| - "GetNonAnonymousAudio()"); | 
| AudioFrameList result; | 
| std::vector<SourceFrame> audio_source_mixing_data_list; | 
| std::vector<SourceFrame> ramp_list; | 
| @@ -361,14 +289,13 @@ AudioFrameList AudioMixerImpl::GetNonAnonymousAudio() { | 
| for (auto& source_and_status : audio_source_list_) { | 
| auto audio_frame_with_info = | 
| source_and_status.audio_source->GetAudioFrameWithMuted( | 
| - id_, static_cast<int>(OutputFrequency())); | 
| + static_cast<int>(OutputFrequency())); | 
| const auto audio_frame_info = audio_frame_with_info.audio_frame_info; | 
| AudioFrame* audio_source_audio_frame = audio_frame_with_info.audio_frame; | 
| if (audio_frame_info == Source::AudioFrameInfo::kError) { | 
| - WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, id_, | 
| - "failed to GetAudioFrameWithMuted() from source"); | 
| + LOG_F(LS_WARNING) << "failed to GetAudioFrameWithMuted() from source"; | 
| 
the sun
2016/10/10 13:46:07
total nit: Capital 'F' in failed
 
aleloi
2016/10/10 14:10:16
Done.
 | 
| continue; | 
| } | 
| audio_source_mixing_data_list.emplace_back( | 
| @@ -404,38 +331,9 @@ AudioFrameList AudioMixerImpl::GetNonAnonymousAudio() { | 
| return result; | 
| } | 
| -AudioFrameList AudioMixerImpl::GetAnonymousAudio() { | 
| - RTC_DCHECK_RUN_ON(&thread_checker_); | 
| - WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_, | 
| - "GetAnonymousAudio()"); | 
| - std::vector<SourceFrame> ramp_list; | 
| - AudioFrameList result; | 
| - for (auto& source_and_status : additional_audio_source_list_) { | 
| - const auto audio_frame_with_info = | 
| - source_and_status.audio_source->GetAudioFrameWithMuted( | 
| - id_, OutputFrequency()); | 
| - const auto ret = audio_frame_with_info.audio_frame_info; | 
| - AudioFrame* audio_frame = audio_frame_with_info.audio_frame; | 
| - if (ret == Source::AudioFrameInfo::kError) { | 
| - WEBRTC_TRACE(kTraceWarning, kTraceAudioMixerServer, id_, | 
| - "failed to GetAudioFrameWithMuted() from audio_source"); | 
| - continue; | 
| - } | 
| - if (ret != Source::AudioFrameInfo::kMuted) { | 
| - result.push_back(audio_frame); | 
| - ramp_list.emplace_back(&source_and_status, audio_frame, false, 0); | 
| - source_and_status.is_mixed = true; | 
| - } | 
| - } | 
| - RampAndUpdateGain(ramp_list); | 
| - return result; | 
| -} | 
| - | 
| bool AudioMixerImpl::AddAudioSourceToList( | 
| Source* audio_source, | 
| SourceStatusList* audio_source_list) const { | 
| - WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_, | 
| - "AddAudioSourceToList(audio_source, audio_source_list)"); | 
| audio_source_list->emplace_back(audio_source, false, 0); | 
| return true; | 
| } | 
| @@ -443,8 +341,6 @@ bool AudioMixerImpl::AddAudioSourceToList( | 
| bool AudioMixerImpl::RemoveAudioSourceFromList( | 
| Source* audio_source, | 
| SourceStatusList* audio_source_list) const { | 
| - WEBRTC_TRACE(kTraceStream, kTraceAudioMixerServer, id_, | 
| - "RemoveAudioSourceFromList(audio_source, audio_source_list)"); | 
| const auto iter = FindSourceInList(audio_source, audio_source_list); | 
| if (iter != audio_source_list->end()) { | 
| audio_source_list->erase(iter); | 
| @@ -476,32 +372,15 @@ bool AudioMixerImpl::LimitMixedAudio(AudioFrame* mixed_audio) const { | 
| *mixed_audio += *mixed_audio; | 
| if (error != limiter_->kNoError) { | 
| - WEBRTC_TRACE(kTraceError, kTraceAudioMixerServer, id_, | 
| - "Error from AudioProcessing: %d", error); | 
| + LOG_F(LS_ERROR) << "Error from AudioProcessing: " << error; | 
| RTC_NOTREACHED(); | 
| return false; | 
| } | 
| return true; | 
| } | 
| -int AudioMixerImpl::GetOutputAudioLevel() { | 
| - RTC_DCHECK_RUN_ON(&thread_checker_); | 
| - const int level = audio_level_.Level(); | 
| - WEBRTC_TRACE(kTraceStateInfo, kTraceAudioMixerServer, id_, | 
| - "GetAudioOutputLevel() => level=%d", level); | 
| - return level; | 
| -} | 
| - | 
| -int AudioMixerImpl::GetOutputAudioLevelFullRange() { | 
| - RTC_DCHECK_RUN_ON(&thread_checker_); | 
| - const int level = audio_level_.LevelFullRange(); | 
| - WEBRTC_TRACE(kTraceStateInfo, kTraceAudioMixerServer, id_, | 
| - "GetAudioOutputLevelFullRange() => level=%d", level); | 
| - return level; | 
| -} | 
| - | 
| bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest( | 
| - AudioMixerImpl::Source* audio_source) { | 
| + AudioMixerImpl::Source* audio_source) const { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| rtc::CritScope lock(&crit_); | 
| @@ -511,12 +390,6 @@ bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest( | 
| return non_anonymous_iter->is_mixed; | 
| } | 
| - const auto anonymous_iter = | 
| - FindSourceInList(audio_source, &additional_audio_source_list_); | 
| - if (anonymous_iter != audio_source_list_.end()) { | 
| - return anonymous_iter->is_mixed; | 
| - } | 
| - | 
| LOG(LS_ERROR) << "Audio source unknown"; | 
| return false; | 
| } |