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

Side by Side Diff: chromecast/media/cma/backend/alsa/stream_mixer_alsa.cc

Issue 2771143002: Implement runtime audio post-processing pipeline. See go/cast_audio.json (Closed)
Patch Set: Remove unordered_map of libraries. Created 3 years, 8 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 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa.h" 5 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 #include <cmath> 8 #include <cmath>
9 #include <limits> 9 #include <limits>
10 #include <unordered_set> 10 #include <unordered_set>
11 #include <utility> 11 #include <utility>
12 12
13 #include "base/bind_helpers.h" 13 #include "base/bind_helpers.h"
14 #include "base/command_line.h" 14 #include "base/command_line.h"
15 #include "base/lazy_instance.h" 15 #include "base/lazy_instance.h"
16 #include "base/memory/ptr_util.h" 16 #include "base/memory/ptr_util.h"
17 #include "base/memory/weak_ptr.h" 17 #include "base/memory/weak_ptr.h"
18 #include "base/numerics/saturated_arithmetic.h" 18 #include "base/numerics/saturated_arithmetic.h"
19 #include "base/single_thread_task_runner.h" 19 #include "base/single_thread_task_runner.h"
20 #include "base/threading/platform_thread.h" 20 #include "base/threading/platform_thread.h"
21 #include "base/threading/thread_task_runner_handle.h" 21 #include "base/threading/thread_task_runner_handle.h"
22 #include "chromecast/base/chromecast_switches.h" 22 #include "chromecast/base/chromecast_switches.h"
23 #include "chromecast/base/serializers.h"
kmackay 2017/03/24 22:15:54 Is serializers.h used?
bshaya 2017/03/24 22:55:49 Done.
23 #include "chromecast/media/base/audio_device_ids.h" 24 #include "chromecast/media/base/audio_device_ids.h"
24 #include "chromecast/media/cma/backend/alsa/alsa_wrapper.h" 25 #include "chromecast/media/cma/backend/alsa/alsa_wrapper.h"
25 #include "chromecast/media/cma/backend/alsa/audio_filter_factory.h"
26 #include "chromecast/media/cma/backend/alsa/filter_group.h" 26 #include "chromecast/media/cma/backend/alsa/filter_group.h"
27 #include "chromecast/media/cma/backend/alsa/post_processing_pipeline_parser.h"
27 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h" 28 #include "chromecast/media/cma/backend/alsa/stream_mixer_alsa_input_impl.h"
28 #include "media/audio/audio_device_description.h" 29 #include "media/audio/audio_device_description.h"
29 #include "media/base/audio_bus.h" 30 #include "media/base/audio_bus.h"
30 #include "media/base/media_switches.h" 31 #include "media/base/media_switches.h"
31 32
32 #define RETURN_REPORT_ERROR(snd_func, ...) \ 33 #define RETURN_REPORT_ERROR(snd_func, ...) \
33 do { \ 34 do { \
34 int err = alsa_->snd_func(__VA_ARGS__); \ 35 int err = alsa_->snd_func(__VA_ARGS__); \
35 if (err < 0) { \ 36 if (err < 0) { \
36 LOG(ERROR) << #snd_func " error: " << alsa_->StrError(err); \ 37 LOG(ERROR) << #snd_func " error: " << alsa_->StrError(err); \
(...skipping 171 matching lines...) Expand 10 before | Expand all | Expand 10 after
208 LOG(INFO) << "Setting fixed sample rate to " << fixed_samples_per_second; 209 LOG(INFO) << "Setting fixed sample rate to " << fixed_samples_per_second;
209 } 210 }
210 211
211 fixed_output_samples_per_second_ = fixed_samples_per_second; 212 fixed_output_samples_per_second_ = fixed_samples_per_second;
212 213
213 low_sample_rate_cutoff_ = 214 low_sample_rate_cutoff_ =
214 chromecast::GetSwitchValueBoolean(switches::kAlsaEnableUpsampling, false) 215 chromecast::GetSwitchValueBoolean(switches::kAlsaEnableUpsampling, false)
215 ? kLowSampleRateCutoff 216 ? kLowSampleRateCutoff
216 : 0; 217 : 0;
217 218
219 // Read post-processing configuration file
220 PostProcessingPipelineParser pipeline_parser;
221 pipeline_parser.Initialize();
222
218 // Create filter groups. 223 // Create filter groups.
219 // TODO(bshaya): Switch to filter groups based on AudioContentType. 224 // TODO(bshaya): Switch to filter groups based on AudioContentType.
220 filter_groups_.push_back(base::MakeUnique<FilterGroup>( 225 filter_groups_.push_back(base::MakeUnique<FilterGroup>(
221 std::unordered_set<std::string>( 226 std::unordered_set<std::string>(
222 {::media::AudioDeviceDescription::kCommunicationsDeviceId}), 227 {::media::AudioDeviceDescription::kCommunicationsDeviceId}),
223 AudioFilterFactory::COMMUNICATION_AUDIO_FILTER, 228 AudioContentType::kMedia, kNumOutputChannels,
224 AudioContentType::kMedia)); 229 pipeline_parser.GetPipelineByDeviceId(
230 ::media::AudioDeviceDescription::kCommunicationsDeviceId)));
225 filter_groups_.push_back(base::MakeUnique<FilterGroup>( 231 filter_groups_.push_back(base::MakeUnique<FilterGroup>(
226 std::unordered_set<std::string>({kAlarmAudioDeviceId}), 232 std::unordered_set<std::string>({kAlarmAudioDeviceId}),
227 AudioFilterFactory::ALARM_AUDIO_FILTER, AudioContentType::kAlarm)); 233 AudioContentType::kAlarm, kNumOutputChannels,
234 pipeline_parser.GetPipelineByDeviceId(kAlarmAudioDeviceId)));
228 filter_groups_.push_back(base::MakeUnique<FilterGroup>( 235 filter_groups_.push_back(base::MakeUnique<FilterGroup>(
229 std::unordered_set<std::string>({kTtsAudioDeviceId}), 236 std::unordered_set<std::string>({kTtsAudioDeviceId}),
230 AudioFilterFactory::TTS_AUDIO_FILTER, AudioContentType::kCommunication)); 237 AudioContentType::kCommunication, kNumOutputChannels,
238 pipeline_parser.GetPipelineByDeviceId(kTtsAudioDeviceId)));
231 filter_groups_.push_back(base::MakeUnique<FilterGroup>( 239 filter_groups_.push_back(base::MakeUnique<FilterGroup>(
232 std::unordered_set<std::string>( 240 std::unordered_set<std::string>(
233 {::media::AudioDeviceDescription::kDefaultDeviceId, 241 {::media::AudioDeviceDescription::kDefaultDeviceId,
234 kLocalAudioDeviceId, ""}), 242 kLocalAudioDeviceId, ""}),
235 AudioFilterFactory::MEDIA_AUDIO_FILTER, AudioContentType::kMedia)); 243 AudioContentType::kMedia, kNumOutputChannels,
244 pipeline_parser.GetPipelineByDeviceId(
245 ::media::AudioDeviceDescription::kDefaultDeviceId)));
236 246
247 // TODO(bshaya): Add support for final mix AudioPostProcessor.
237 DefineAlsaParameters(); 248 DefineAlsaParameters();
238 } 249 }
239 250
240 void StreamMixerAlsa::ResetTaskRunnerForTest() { 251 void StreamMixerAlsa::ResetTaskRunnerForTest() {
241 mixer_task_runner_ = base::ThreadTaskRunnerHandle::Get(); 252 mixer_task_runner_ = base::ThreadTaskRunnerHandle::Get();
242 } 253 }
243 254
244 void StreamMixerAlsa::DefineAlsaParameters() { 255 void StreamMixerAlsa::DefineAlsaParameters() {
245 // Get the ALSA output configuration from the command line. 256 // Get the ALSA output configuration from the command line.
246 alsa_buffer_size_ = GetSwitchValueNonNegativeInt( 257 alsa_buffer_size_ = GetSwitchValueNonNegativeInt(
(...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
492 if (err < 0) { 503 if (err < 0) {
493 LOG(ERROR) << "Error setting ALSA playback parameters: " 504 LOG(ERROR) << "Error setting ALSA playback parameters: "
494 << alsa_->StrError(err); 505 << alsa_->StrError(err);
495 SignalError(); 506 SignalError();
496 return; 507 return;
497 } 508 }
498 } 509 }
499 510
500 // Initialize filters 511 // Initialize filters
501 for (auto&& filter_group : filter_groups_) { 512 for (auto&& filter_group : filter_groups_) {
502 filter_group->Initialize(output_samples_per_second_, 513 filter_group->Initialize(output_samples_per_second_);
503 ::media::SampleFormat::kSampleFormatS32);
504 } 514 }
505 515
506 RETURN_REPORT_ERROR(PcmPrepare, pcm_); 516 RETURN_REPORT_ERROR(PcmPrepare, pcm_);
507 RETURN_REPORT_ERROR(PcmStatusMalloc, &pcm_status_); 517 RETURN_REPORT_ERROR(PcmStatusMalloc, &pcm_status_);
508 518
509 rendering_delay_.timestamp_microseconds = kNoTimestamp; 519 rendering_delay_.timestamp_microseconds = kNoTimestamp;
510 rendering_delay_.delay_microseconds = 0; 520 rendering_delay_.delay_microseconds = 0;
511 521
512 state_ = kStateNormalPlayback; 522 state_ = kStateNormalPlayback;
513 } 523 }
(...skipping 465 matching lines...) Expand 10 before | Expand all | Expand 10 after
979 989
980 for (auto&& filter : filter_groups_) { 990 for (auto&& filter : filter_groups_) {
981 if (filter->content_type() == type) { 991 if (filter->content_type() == type) {
982 filter->set_volume(effective_volume); 992 filter->set_volume(effective_volume);
983 } 993 }
984 } 994 }
985 } 995 }
986 996
987 } // namespace media 997 } // namespace media
988 } // namespace chromecast 998 } // namespace chromecast
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698