| 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 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 *mixed_audio += *frame; |
| 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( |
| 123 [audio_source](const AudioMixerImpl::SourceStatus& p) { | 123 audio_source_list->begin(), audio_source_list->end(), |
| 124 return p.audio_source == audio_source; | 124 [audio_source](const std::unique_ptr<AudioMixerImpl::SourceStatus>& p) { |
| 125 }); | 125 return p->audio_source == audio_source; |
| 126 }); |
| 126 } | 127 } |
| 127 | 128 |
| 128 // TODO(aleloi): remove non-const version when WEBRTC only supports modern STL. | 129 // TODO(aleloi): remove non-const version when WEBRTC only supports modern STL. |
| 129 AudioMixerImpl::SourceStatusList::iterator FindSourceInList( | 130 AudioMixerImpl::SourceStatusList::iterator FindSourceInList( |
| 130 AudioMixerImpl::Source const* audio_source, | 131 AudioMixerImpl::Source const* audio_source, |
| 131 AudioMixerImpl::SourceStatusList* audio_source_list) { | 132 AudioMixerImpl::SourceStatusList* audio_source_list) { |
| 132 return std::find_if(audio_source_list->begin(), audio_source_list->end(), | 133 return std::find_if( |
| 133 [audio_source](const AudioMixerImpl::SourceStatus& p) { | 134 audio_source_list->begin(), audio_source_list->end(), |
| 134 return p.audio_source == audio_source; | 135 [audio_source](const std::unique_ptr<AudioMixerImpl::SourceStatus>& p) { |
| 135 }); | 136 return p->audio_source == audio_source; |
| 137 }); |
| 136 } | 138 } |
| 137 | 139 |
| 138 } // namespace | 140 } // namespace |
| 139 | 141 |
| 140 AudioMixerImpl::AudioMixerImpl(std::unique_ptr<AudioProcessing> limiter) | 142 AudioMixerImpl::AudioMixerImpl(std::unique_ptr<AudioProcessing> limiter) |
| 141 : audio_source_list_(), | 143 : audio_source_list_(), |
| 142 use_limiter_(true), | 144 use_limiter_(true), |
| 143 time_stamp_(0), | 145 time_stamp_(0), |
| 144 limiter_(std::move(limiter)) { | 146 limiter_(std::move(limiter)) { |
| 145 SetOutputFrequency(kDefaultFrequency); | 147 SetOutputFrequency(kDefaultFrequency); |
| (...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 238 RTC_DCHECK_RUN_ON(&thread_checker_); | 240 RTC_DCHECK_RUN_ON(&thread_checker_); |
| 239 return output_frequency_; | 241 return output_frequency_; |
| 240 } | 242 } |
| 241 | 243 |
| 242 bool AudioMixerImpl::AddSource(Source* audio_source) { | 244 bool AudioMixerImpl::AddSource(Source* audio_source) { |
| 243 RTC_DCHECK(audio_source); | 245 RTC_DCHECK(audio_source); |
| 244 rtc::CritScope lock(&crit_); | 246 rtc::CritScope lock(&crit_); |
| 245 RTC_DCHECK(FindSourceInList(audio_source, &audio_source_list_) == | 247 RTC_DCHECK(FindSourceInList(audio_source, &audio_source_list_) == |
| 246 audio_source_list_.end()) | 248 audio_source_list_.end()) |
| 247 << "Source already added to mixer"; | 249 << "Source already added to mixer"; |
| 248 audio_source_list_.emplace_back(audio_source, false, 0); | 250 audio_source_list_.emplace_back(new SourceStatus(audio_source, false, 0)); |
| 249 return true; | 251 return true; |
| 250 } | 252 } |
| 251 | 253 |
| 252 bool AudioMixerImpl::RemoveSource(Source* audio_source) { | 254 bool AudioMixerImpl::RemoveSource(Source* audio_source) { |
| 253 RTC_DCHECK(audio_source); | 255 RTC_DCHECK(audio_source); |
| 254 rtc::CritScope lock(&crit_); | 256 rtc::CritScope lock(&crit_); |
| 255 const auto iter = FindSourceInList(audio_source, &audio_source_list_); | 257 const auto iter = FindSourceInList(audio_source, &audio_source_list_); |
| 256 RTC_DCHECK(iter != audio_source_list_.end()) << "Source not present in mixer"; | 258 RTC_DCHECK(iter != audio_source_list_.end()) << "Source not present in mixer"; |
| 257 audio_source_list_.erase(iter); | 259 audio_source_list_.erase(iter); |
| 258 return true; | 260 return true; |
| 259 } | 261 } |
| 260 | 262 |
| 261 AudioFrameList AudioMixerImpl::GetAudioFromSources() { | 263 AudioFrameList AudioMixerImpl::GetAudioFromSources() { |
| 262 RTC_DCHECK_RUN_ON(&thread_checker_); | 264 RTC_DCHECK_RUN_ON(&thread_checker_); |
| 263 AudioFrameList result; | 265 AudioFrameList result; |
| 264 std::vector<SourceFrame> audio_source_mixing_data_list; | 266 std::vector<SourceFrame> audio_source_mixing_data_list; |
| 265 std::vector<SourceFrame> ramp_list; | 267 std::vector<SourceFrame> ramp_list; |
| 266 | 268 |
| 267 // Get audio source audio and put it in the struct vector. | 269 // Get audio from the audio sources and put it in the SourceFrame vector. |
| 268 for (auto& source_and_status : audio_source_list_) { | 270 for (auto& source_and_status : audio_source_list_) { |
| 269 auto audio_frame_with_info = | 271 const auto audio_frame_info = |
| 270 source_and_status.audio_source->GetAudioFrameWithInfo( | 272 source_and_status->audio_source->GetAudioFrameWithInfo( |
| 271 static_cast<int>(OutputFrequency())); | 273 OutputFrequency(), &source_and_status->audio_frame); |
| 272 | |
| 273 const auto audio_frame_info = audio_frame_with_info.audio_frame_info; | |
| 274 AudioFrame* audio_source_audio_frame = audio_frame_with_info.audio_frame; | |
| 275 | 274 |
| 276 if (audio_frame_info == Source::AudioFrameInfo::kError) { | 275 if (audio_frame_info == Source::AudioFrameInfo::kError) { |
| 277 LOG_F(LS_WARNING) << "failed to GetAudioFrameWithInfo() from source"; | 276 LOG_F(LS_WARNING) << "failed to GetAudioFrameWithInfo() from source"; |
| 278 continue; | 277 continue; |
| 279 } | 278 } |
| 280 audio_source_mixing_data_list.emplace_back( | 279 audio_source_mixing_data_list.emplace_back( |
| 281 &source_and_status, audio_source_audio_frame, | 280 source_and_status.get(), &source_and_status->audio_frame, |
| 282 audio_frame_info == Source::AudioFrameInfo::kMuted); | 281 audio_frame_info == Source::AudioFrameInfo::kMuted); |
| 283 } | 282 } |
| 284 | 283 |
| 285 // Sort frames by sorting function. | 284 // Sort frames by sorting function. |
| 286 std::sort(audio_source_mixing_data_list.begin(), | 285 std::sort(audio_source_mixing_data_list.begin(), |
| 287 audio_source_mixing_data_list.end(), ShouldMixBefore); | 286 audio_source_mixing_data_list.end(), ShouldMixBefore); |
| 288 | 287 |
| 289 int max_audio_frame_counter = kMaximumAmountOfMixedAudioSources; | 288 int max_audio_frame_counter = kMaximumAmountOfMixedAudioSources; |
| 290 | 289 |
| 291 // Go through list in order and put unmuted frames in result list. | 290 // Go through list in order and put unmuted frames in result list. |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 338 return false; | 337 return false; |
| 339 } | 338 } |
| 340 return true; | 339 return true; |
| 341 } | 340 } |
| 342 | 341 |
| 343 bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest( | 342 bool AudioMixerImpl::GetAudioSourceMixabilityStatusForTest( |
| 344 AudioMixerImpl::Source* audio_source) const { | 343 AudioMixerImpl::Source* audio_source) const { |
| 345 RTC_DCHECK_RUN_ON(&thread_checker_); | 344 RTC_DCHECK_RUN_ON(&thread_checker_); |
| 346 rtc::CritScope lock(&crit_); | 345 rtc::CritScope lock(&crit_); |
| 347 | 346 |
| 348 const auto non_anonymous_iter = | 347 const auto iter = FindSourceInList(audio_source, &audio_source_list_); |
| 349 FindSourceInList(audio_source, &audio_source_list_); | 348 if (iter != audio_source_list_.end()) { |
| 350 if (non_anonymous_iter != audio_source_list_.end()) { | 349 return (*iter)->is_mixed; |
| 351 return non_anonymous_iter->is_mixed; | |
| 352 } | 350 } |
| 353 | 351 |
| 354 LOG(LS_ERROR) << "Audio source unknown"; | 352 LOG(LS_ERROR) << "Audio source unknown"; |
| 355 return false; | 353 return false; |
| 356 } | 354 } |
| 357 } // namespace webrtc | 355 } // namespace webrtc |
| OLD | NEW |