Chromium Code Reviews| 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; |
| } |