Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(674)

Side by Side Diff: webrtc/modules/audio_mixer/audio_mixer_impl.cc

Issue 2420913002: Move audio frame memory handling inside AudioMixer. (Closed)
Patch Set: Updated interface usages (I landed another CL in the wrong order...). Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
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
OLDNEW
« no previous file with comments | « webrtc/modules/audio_mixer/audio_mixer_impl.h ('k') | webrtc/modules/audio_mixer/audio_mixer_impl_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698