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

Unified Diff: chromecast/media/cma/backend/alsa/filter_group.cc

Issue 2771143002: Implement runtime audio post-processing pipeline. See go/cast_audio.json (Closed)
Patch Set: Suffix governor with _1.0 Created 3 years, 9 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 side-by-side diff with in-line comments
Download patch
Index: chromecast/media/cma/backend/alsa/filter_group.cc
diff --git a/chromecast/media/cma/backend/alsa/filter_group.cc b/chromecast/media/cma/backend/alsa/filter_group.cc
index 1fa4df6952b435096a288b02e31cad404cfc3bf0..9b99ff56598a29b819c4d5ff240160c9d336ad1f 100644
--- a/chromecast/media/cma/backend/alsa/filter_group.cc
+++ b/chromecast/media/cma/backend/alsa/filter_group.cc
@@ -3,40 +3,31 @@
// found in the LICENSE file.
#include "chromecast/media/cma/backend/alsa/filter_group.h"
+
+#include "base/memory/ptr_util.h"
+#include "base/values.h"
+#include "chromecast/media/cma/backend/alsa/post_processing_pipeline.h"
#include "media/base/audio_bus.h"
namespace chromecast {
namespace media {
-namespace {
-
-// How many seconds of silence should be passed to the filters to flush them.
-const float kSilenceSecondsToFilter = 1.0f;
-const int kNumOutputChannels = 2;
-
-} // namespace
-
FilterGroup::FilterGroup(const std::unordered_set<std::string>& input_types,
- AudioFilterFactory::FilterType filter_type,
- AudioContentType content_type)
+ AudioContentType content_type,
+ int channels,
+ const base::ListValue* filter_list)
: input_types_(input_types),
content_type_(content_type),
+ channels_(channels),
output_samples_per_second_(0),
- sample_format_(::media::SampleFormat::kUnknownSampleFormat),
- audio_filter_(AudioFilterFactory::MakeAudioFilter(filter_type)),
- silence_frames_filtered_(0) {}
+ post_processing_pipeline_(
+ base::MakeUnique<PostProcessingPipeline>(filter_list, channels_)) {}
FilterGroup::~FilterGroup() = default;
-void FilterGroup::Initialize(int output_samples_per_second,
- ::media::SampleFormat format) {
+void FilterGroup::Initialize(int output_samples_per_second) {
output_samples_per_second_ = output_samples_per_second;
- sample_format_ = format;
- if (audio_filter_) {
- audio_filter_->SetSampleRateAndFormat(output_samples_per_second_,
- sample_format_);
- }
- silence_frames_filtered_ = 0;
+ post_processing_pipeline_->SetSampleRate(output_samples_per_second);
}
bool FilterGroup::CanProcessInput(StreamMixerAlsa::InputQueue* input) {
@@ -53,17 +44,8 @@ std::vector<uint8_t>* FilterGroup::GetInterleaved() {
bool FilterGroup::MixAndFilter(int chunk_size) {
DCHECK_NE(output_samples_per_second_, 0);
- DCHECK_NE(sample_format_, ::media::SampleFormat::kUnknownSampleFormat);
- if (active_inputs_.empty()) {
- int silence_frames_to_filter =
- output_samples_per_second_ * kSilenceSecondsToFilter;
- if (audio_filter_ && silence_frames_filtered_ < silence_frames_to_filter) {
- silence_frames_filtered_ += chunk_size;
- } else {
- return false; // Output will be silence, no need to mix.
- }
- } else {
- silence_frames_filtered_ = 0;
+ if (active_inputs_.empty() && !post_processing_pipeline_->IsRinging()) {
+ return false; // Output will be silence, no need to mix.
}
ResizeBuffersIfNecessary(chunk_size);
@@ -71,7 +53,7 @@ bool FilterGroup::MixAndFilter(int chunk_size) {
mixed_->ZeroFramesPartial(0, chunk_size);
for (StreamMixerAlsa::InputQueue* input : active_inputs_) {
input->GetResampledData(temp_.get(), chunk_size);
- for (int c = 0; c < kNumOutputChannels; ++c) {
+ for (int c = 0; c < channels_; ++c) {
input->VolumeScaleAccumulate(c, temp_->channel(c), chunk_size,
mixed_->channel(c));
}
@@ -79,30 +61,29 @@ bool FilterGroup::MixAndFilter(int chunk_size) {
mixed_->ToInterleaved(chunk_size, BytesPerOutputFormatSample(),
interleaved_.data());
- if (audio_filter_) {
- audio_filter_->ProcessInterleaved(interleaved_.data(), chunk_size, volume_);
- }
+ post_processing_pipeline_->ProcessFrames(interleaved_.data(), chunk_size,
+ volume_, active_inputs_.empty());
return true;
}
void FilterGroup::ClearInterleaved(int chunk_size) {
ResizeBuffersIfNecessary(chunk_size);
- memset(interleaved_.data(), 0, static_cast<size_t>(chunk_size) *
- kNumOutputChannels *
- BytesPerOutputFormatSample());
+ memset(interleaved_.data(), 0,
+ static_cast<size_t>(chunk_size) * channels_ *
+ BytesPerOutputFormatSample());
}
void FilterGroup::ResizeBuffersIfNecessary(int chunk_size) {
if (!mixed_ || mixed_->frames() < chunk_size) {
- mixed_ = ::media::AudioBus::Create(kNumOutputChannels, chunk_size);
+ mixed_ = ::media::AudioBus::Create(channels_, chunk_size);
}
if (!temp_ || temp_->frames() < chunk_size) {
- temp_ = ::media::AudioBus::Create(kNumOutputChannels, chunk_size);
+ temp_ = ::media::AudioBus::Create(channels_, chunk_size);
}
- size_t interleaved_size = static_cast<size_t>(chunk_size) *
- kNumOutputChannels * BytesPerOutputFormatSample();
+ size_t interleaved_size = static_cast<size_t>(chunk_size) * channels_ *
+ BytesPerOutputFormatSample();
if (interleaved_.size() < interleaved_size) {
interleaved_.resize(interleaved_size);
@@ -110,7 +91,7 @@ void FilterGroup::ResizeBuffersIfNecessary(int chunk_size) {
}
int FilterGroup::BytesPerOutputFormatSample() {
- return ::media::SampleFormatToBytesPerChannel(sample_format_);
+ return sizeof(int32_t);
}
void FilterGroup::ClearActiveInputs() {
« no previous file with comments | « chromecast/media/cma/backend/alsa/filter_group.h ('k') | chromecast/media/cma/backend/alsa/post_processing_pipeline.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698