OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2012 The WebRTC project authors. All Rights Reserved. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
9 */ | 9 */ |
10 | 10 |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
101 frame->samples_per_channel_, | 101 frame->samples_per_channel_, |
102 static_cast<size_t>((mixed_audio->sample_rate_hz_ * | 102 static_cast<size_t>((mixed_audio->sample_rate_hz_ * |
103 webrtc::AudioMixerImpl::kFrameDurationInMs) / | 103 webrtc::AudioMixerImpl::kFrameDurationInMs) / |
104 1000)); | 104 1000)); |
105 | 105 |
106 // Mix |f.frame| into |mixed_audio|, with saturation protection. | 106 // Mix |f.frame| into |mixed_audio|, with saturation protection. |
107 // These effect is applied to |f.frame| itself prior to mixing. | 107 // These effect is applied to |f.frame| itself prior to mixing. |
108 if (use_limiter) { | 108 if (use_limiter) { |
109 // Divide by two to avoid saturation in the mixing. | 109 // Divide by two to avoid saturation in the mixing. |
110 // This is only meaningful if the limiter will be used. | 110 // This is only meaningful if the limiter will be used. |
111 *frame >>= 1; | 111 AudioFrameOperations::ShiftDown(frame); |
112 } | 112 } |
113 RTC_DCHECK_EQ(frame->num_channels_, mixed_audio->num_channels_); | 113 RTC_DCHECK_EQ(frame->num_channels_, mixed_audio->num_channels_); |
114 *mixed_audio += *frame; | 114 AudioFrameOperations::AddFrames(*frame, mixed_audio); |
115 } | 115 } |
116 return 0; | 116 return 0; |
117 } | 117 } |
118 | 118 |
119 AudioMixerImpl::SourceStatusList::const_iterator FindSourceInList( | 119 AudioMixerImpl::SourceStatusList::const_iterator FindSourceInList( |
120 AudioMixerImpl::Source const* audio_source, | 120 AudioMixerImpl::Source const* audio_source, |
121 AudioMixerImpl::SourceStatusList const* audio_source_list) { | 121 AudioMixerImpl::SourceStatusList const* audio_source_list) { |
122 return std::find_if(audio_source_list->begin(), audio_source_list->end(), | 122 return std::find_if(audio_source_list->begin(), audio_source_list->end(), |
123 [audio_source](const AudioMixerImpl::SourceStatus& p) { | 123 [audio_source](const AudioMixerImpl::SourceStatus& p) { |
124 return p.audio_source == audio_source; | 124 return p.audio_source == audio_source; |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
198 AudioFrameList mix_list; | 198 AudioFrameList mix_list; |
199 { | 199 { |
200 rtc::CritScope lock(&crit_); | 200 rtc::CritScope lock(&crit_); |
201 mix_list = GetAudioFromSources(); | 201 mix_list = GetAudioFromSources(); |
202 } | 202 } |
203 | 203 |
204 for (const auto& frame : mix_list) { | 204 for (const auto& frame : mix_list) { |
205 RemixFrame(number_of_channels, frame); | 205 RemixFrame(number_of_channels, frame); |
206 } | 206 } |
207 | 207 |
208 audio_frame_for_mixing->UpdateFrame( | 208 AudioFrameOperations::UpdateFrame( |
209 -1, time_stamp_, NULL, 0, OutputFrequency(), AudioFrame::kNormalSpeech, | 209 -1, time_stamp_, NULL, 0, OutputFrequency(), AudioFrame::kNormalSpeech, |
210 AudioFrame::kVadPassive, number_of_channels); | 210 AudioFrame::kVadPassive, number_of_channels, audio_frame_for_mixing); |
211 | 211 |
212 time_stamp_ += static_cast<uint32_t>(sample_size_); | 212 time_stamp_ += static_cast<uint32_t>(sample_size_); |
213 | 213 |
214 use_limiter_ = mix_list.size() > 1; | 214 use_limiter_ = mix_list.size() > 1; |
215 | 215 |
216 // We only use the limiter if we're actually mixing multiple streams. | 216 // We only use the limiter if we're actually mixing multiple streams. |
217 MixFromList(audio_frame_for_mixing, mix_list, use_limiter_); | 217 MixFromList(audio_frame_for_mixing, mix_list, use_limiter_); |
218 | 218 |
219 if (audio_frame_for_mixing->samples_per_channel_ == 0) { | 219 if (audio_frame_for_mixing->samples_per_channel_ == 0) { |
220 // Nothing was mixed, set the audio samples to silence. | 220 // Nothing was mixed, set the audio samples to silence. |
221 audio_frame_for_mixing->samples_per_channel_ = sample_size_; | 221 audio_frame_for_mixing->samples_per_channel_ = sample_size_; |
222 audio_frame_for_mixing->Mute(); | 222 AudioFrameOperations::Mute(audio_frame_for_mixing); |
223 } else { | 223 } else { |
224 // Only call the limiter if we have something to mix. | 224 // Only call the limiter if we have something to mix. |
225 LimitMixedAudio(audio_frame_for_mixing); | 225 LimitMixedAudio(audio_frame_for_mixing); |
226 } | 226 } |
227 | 227 |
228 return; | 228 return; |
229 } | 229 } |
230 | 230 |
231 void AudioMixerImpl::SetOutputFrequency(int frequency) { | 231 void AudioMixerImpl::SetOutputFrequency(int frequency) { |
232 RTC_DCHECK_RUN_ON(&thread_checker_); | 232 RTC_DCHECK_RUN_ON(&thread_checker_); |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
323 // And now we can safely restore the level. This procedure results in | 323 // And now we can safely restore the level. This procedure results in |
324 // some loss of resolution, deemed acceptable. | 324 // some loss of resolution, deemed acceptable. |
325 // | 325 // |
326 // It's possible to apply the gain in the AGC (with a target level of 0 dbFS | 326 // It's possible to apply the gain in the AGC (with a target level of 0 dbFS |
327 // and compression gain of 6 dB). However, in the transition frame when this | 327 // and compression gain of 6 dB). However, in the transition frame when this |
328 // is enabled (moving from one to two audio sources) it has the potential to | 328 // is enabled (moving from one to two audio sources) it has the potential to |
329 // create discontinuities in the mixed frame. | 329 // create discontinuities in the mixed frame. |
330 // | 330 // |
331 // Instead we double the frame (with addition since left-shifting a | 331 // Instead we double the frame (with addition since left-shifting a |
332 // negative value is undefined). | 332 // negative value is undefined). |
333 *mixed_audio += *mixed_audio; | 333 AudioFrameOperations::AddFrames(*mixed_audio, mixed_audio); |
334 | 334 |
335 if (error != limiter_->kNoError) { | 335 if (error != limiter_->kNoError) { |
336 LOG_F(LS_ERROR) << "Error from AudioProcessing: " << error; | 336 LOG_F(LS_ERROR) << "Error from AudioProcessing: " << error; |
337 RTC_NOTREACHED(); | 337 RTC_NOTREACHED(); |
338 return false; | 338 return false; |
339 } | 339 } |
340 return true; | 340 return true; |
341 } | 341 } |
342 | 342 |
343 bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest( | 343 bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest( |
344 AudioMixerImpl::Source* audio_source) const { | 344 AudioMixerImpl::Source* audio_source) const { |
345 RTC_DCHECK_RUN_ON(&thread_checker_); | 345 RTC_DCHECK_RUN_ON(&thread_checker_); |
346 rtc::CritScope lock(&crit_); | 346 rtc::CritScope lock(&crit_); |
347 | 347 |
348 const auto non_anonymous_iter = | 348 const auto non_anonymous_iter = |
349 FindSourceInList(audio_source, &audio_source_list_); | 349 FindSourceInList(audio_source, &audio_source_list_); |
350 if (non_anonymous_iter != audio_source_list_.end()) { | 350 if (non_anonymous_iter != audio_source_list_.end()) { |
351 return non_anonymous_iter->is_mixed; | 351 return non_anonymous_iter->is_mixed; |
352 } | 352 } |
353 | 353 |
354 LOG(LS_ERROR) << "Audio source unknown"; | 354 LOG(LS_ERROR) << "Audio source unknown"; |
355 return false; | 355 return false; |
356 } | 356 } |
357 } // namespace webrtc | 357 } // namespace webrtc |
OLD | NEW |