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 82932f40955d4e1d96bf1ae4fd24bc863a343763..b5d1782cad4d764f163550a7a3599167a37bada4 100644 | 
| --- a/webrtc/modules/audio_mixer/audio_mixer_impl.cc | 
| +++ b/webrtc/modules/audio_mixer/audio_mixer_impl.cc | 
| @@ -13,12 +13,8 @@ | 
| #include <algorithm> | 
| #include <functional> | 
| -#include "webrtc/base/thread_annotations.h" | 
| #include "webrtc/modules/audio_mixer/audio_frame_manipulator.h" | 
| -#include "webrtc/modules/audio_mixer/audio_mixer_defines.h" | 
| -#include "webrtc/modules/audio_processing/include/audio_processing.h" | 
| #include "webrtc/modules/utility/include/audio_frame_operations.h" | 
| -#include "webrtc/system_wrappers/include/critical_section_wrapper.h" | 
| #include "webrtc/system_wrappers/include/trace.h" | 
| namespace webrtc { | 
| @@ -71,7 +67,7 @@ class SourceFrame { | 
| }; | 
| // Remixes a frame between stereo and mono. | 
| -void RemixFrame(AudioFrame* frame, size_t number_of_channels) { | 
| +void RemixFrame(AudioFrame* frame, int number_of_channels) { | 
| RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2); | 
| if (frame->num_channels_ == 1 && number_of_channels == 2) { | 
| AudioFrameOperations::MonoToStereo(frame); | 
| @@ -95,46 +91,54 @@ void Ramp(const std::vector<SourceFrame>& mixed_sources_and_frames) { | 
| } | 
| } | 
| -} // namespace | 
| - | 
| -MixerAudioSource::MixerAudioSource() : mix_history_(new NewMixHistory()) {} | 
| - | 
| -MixerAudioSource::~MixerAudioSource() { | 
| - delete mix_history_; | 
| -} | 
| - | 
| -bool MixerAudioSource::IsMixed() const { | 
| - return mix_history_->IsMixed(); | 
| -} | 
| - | 
| -NewMixHistory::NewMixHistory() : is_mixed_(0) {} | 
| - | 
| -NewMixHistory::~NewMixHistory() {} | 
| +// 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()) | 
| + return 0; | 
| -bool NewMixHistory::IsMixed() const { | 
| - return is_mixed_; | 
| -} | 
| + if (audio_frame_list.size() == 1) { | 
| + mixed_audio->timestamp_ = audio_frame_list.front()->timestamp_; | 
| + mixed_audio->elapsed_time_ms_ = audio_frame_list.front()->elapsed_time_ms_; | 
| + } else { | 
| + // TODO(wu): Issue 3390. | 
| + // Audio frame timestamp is only supported in one channel case. | 
| + mixed_audio->timestamp_ = 0; | 
| + mixed_audio->elapsed_time_ms_ = -1; | 
| + } | 
| -bool NewMixHistory::WasMixed() const { | 
| - // Was mixed is the same as is mixed depending on perspective. This function | 
| - // is for the perspective of NewAudioConferenceMixerImpl. | 
| - return IsMixed(); | 
| -} | 
| + for (const auto& frame : audio_frame_list) { | 
| + RTC_DCHECK_EQ(mixed_audio->sample_rate_hz_, frame->sample_rate_hz_); | 
| + RTC_DCHECK_EQ( | 
| + frame->samples_per_channel_, | 
| + static_cast<size_t>((mixed_audio->sample_rate_hz_ * | 
| + webrtc::AudioMixerImpl::kFrameDurationInMs) / | 
| + 1000)); | 
| -int32_t NewMixHistory::SetIsMixed(const bool mixed) { | 
| - is_mixed_ = mixed; | 
| + // Mix |f.frame| into |mixed_audio|, with saturation protection. | 
| + // These effect is applied to |f.frame| itself prior to mixing. | 
| + if (use_limiter) { | 
| + // Divide by two to avoid saturation in the mixing. | 
| + // This is only meaningful if the limiter will be used. | 
| + *frame >>= 1; | 
| + } | 
| + RTC_DCHECK_EQ(frame->num_channels_, mixed_audio->num_channels_); | 
| + *mixed_audio += *frame; | 
| + } | 
| return 0; | 
| } | 
| -void NewMixHistory::ResetMixedStatus() { | 
| - is_mixed_ = false; | 
| -} | 
| +} // namespace | 
| std::unique_ptr<AudioMixer> AudioMixer::Create(int id) { | 
| AudioMixerImpl* mixer = new AudioMixerImpl(id); | 
| 
 
ossu
2016/09/01 15:42:50
This is a bit strange. Not sure it's 100% related
 
aleloi
2016/09/02 11:52:34
Changed in upstream CL.
 
 | 
| if (!mixer->Init()) { | 
| delete mixer; | 
| - return NULL; | 
| + return std::unique_ptr<AudioMixer>(nullptr); | 
| } | 
| return std::unique_ptr<AudioMixer>(mixer); | 
| } | 
| @@ -191,7 +195,7 @@ bool AudioMixerImpl::Init() { | 
| } | 
| void AudioMixerImpl::Mix(int sample_rate, | 
| - size_t number_of_channels, | 
| + int number_of_channels, | 
| AudioFrame* audio_frame_for_mixing) { | 
| RTC_DCHECK(number_of_channels == 1 || number_of_channels == 2); | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| @@ -215,7 +219,7 @@ void AudioMixerImpl::Mix(int sample_rate, | 
| CriticalSectionScoped cs(crit_.get()); | 
| mix_list = GetNonAnonymousAudio(); | 
| anonymous_mix_list = GetAnonymousAudio(); | 
| - num_mixed_audio_sources = static_cast<int>(num_mixed_audio_sources_); | 
| + num_mixed_audio_sources = num_mixed_audio_sources_; | 
| } | 
| mix_list.insert(mix_list.begin(), anonymous_mix_list.begin(), | 
| @@ -254,8 +258,7 @@ void AudioMixerImpl::Mix(int sample_rate, | 
| int32_t AudioMixerImpl::SetOutputFrequency(const Frequency& frequency) { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| output_frequency_ = frequency; | 
| - sample_size_ = | 
| - static_cast<size_t>((output_frequency_ * kFrameDurationInMs) / 1000); | 
| + sample_size_ = (output_frequency_ * kFrameDurationInMs) / 1000; | 
| return 0; | 
| } | 
| @@ -295,12 +298,13 @@ int32_t AudioMixerImpl::SetMixabilityStatus(MixerAudioSource* audio_source, | 
| return -1; | 
| } | 
| - size_t num_mixed_non_anonymous = audio_source_list_.size(); | 
| + int num_mixed_non_anonymous = static_cast<int>(audio_source_list_.size()); | 
| 
 
ossu
2016/09/01 15:42:50
Why not just keep this as size_t? According to the
 
aleloi
2016/09/02 11:52:34
Thanks! I didn't read it carefully enough. Changin
 
 | 
| 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_non_anonymous + | 
| + static_cast<int>(additional_audio_source_list_.size()); | 
| } | 
| return 0; | 
| } | 
| @@ -482,45 +486,6 @@ bool AudioMixerImpl::RemoveAudioSourceFromList( | 
| } | 
| } | 
| -int32_t AudioMixerImpl::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()) | 
| - return 0; | 
| - | 
| - if (audio_frame_list.size() == 1) { | 
| - mixed_audio->timestamp_ = audio_frame_list.front()->timestamp_; | 
| - mixed_audio->elapsed_time_ms_ = audio_frame_list.front()->elapsed_time_ms_; | 
| - } else { | 
| - // TODO(wu): Issue 3390. | 
| - // Audio frame timestamp is only supported in one channel case. | 
| - mixed_audio->timestamp_ = 0; | 
| - mixed_audio->elapsed_time_ms_ = -1; | 
| - } | 
| - | 
| - for (const auto& frame : audio_frame_list) { | 
| - RTC_DCHECK_EQ(mixed_audio->sample_rate_hz_, frame->sample_rate_hz_); | 
| - RTC_DCHECK_EQ( | 
| - frame->samples_per_channel_, | 
| - static_cast<size_t>( | 
| - (mixed_audio->sample_rate_hz_ * kFrameDurationInMs) / 1000)); | 
| - | 
| - // Mix |f.frame| into |mixed_audio|, with saturation protection. | 
| - // These effect is applied to |f.frame| itself prior to mixing. | 
| - if (use_limiter) { | 
| - // Divide by two to avoid saturation in the mixing. | 
| - // This is only meaningful if the limiter will be used. | 
| - *frame >>= 1; | 
| - } | 
| - RTC_DCHECK_EQ(frame->num_channels_, mixed_audio->num_channels_); | 
| - *mixed_audio += *frame; | 
| - } | 
| - return 0; | 
| -} | 
| - | 
| bool AudioMixerImpl::LimitMixedAudio(AudioFrame* mixed_audio) const { | 
| RTC_DCHECK_RUN_ON(&thread_checker_); | 
| if (!use_limiter_) { |