Index: media/filters/audio_renderer_algorithm.cc |
diff --git a/media/filters/audio_renderer_algorithm.cc b/media/filters/audio_renderer_algorithm.cc |
index 1ce8bf6a12c641f897115a9bb46f5d2cfdcacc3f..efa45d35ef484a40cf509ac4f434c62095e2355d 100644 |
--- a/media/filters/audio_renderer_algorithm.cc |
+++ b/media/filters/audio_renderer_algorithm.cc |
@@ -82,11 +82,9 @@ AudioRendererAlgorithm::AudioRendererAlgorithm() |
AudioRendererAlgorithm::~AudioRendererAlgorithm() {} |
-void AudioRendererAlgorithm::Initialize(const AudioParameters& params, |
- std::vector<bool> channel_mask) { |
+void AudioRendererAlgorithm::Initialize(const AudioParameters& params) { |
CHECK(params.IsValid()); |
- channel_mask_ = std::move(channel_mask); |
channels_ = params.channels(); |
samples_per_second_ = params.sample_rate(); |
initial_capacity_ = capacity_ = |
@@ -126,8 +124,14 @@ void AudioRendererAlgorithm::Initialize(const AudioParameters& params, |
// If no mask is provided, assume all channels are valid. |
if (channel_mask_.empty()) |
- channel_mask_ = std::vector<bool>(channels_, true); |
- DCHECK_EQ(channel_mask_.size(), static_cast<size_t>(channels_)); |
+ SetChannelMask(std::vector<bool>(channels_, true)); |
+} |
+ |
+void AudioRendererAlgorithm::SetChannelMask(std::vector<bool> channel_mask) { |
+ DCHECK_EQ(channel_mask.size(), static_cast<size_t>(channels_)); |
+ channel_mask_ = std::move(channel_mask); |
+ if (ola_window_) |
+ CreateSearchWrappers(); |
} |
int AudioRendererAlgorithm::FillBuffer(AudioBus* dest, |
@@ -203,21 +207,8 @@ int AudioRendererAlgorithm::FillBuffer(AudioBus* dest, |
channels_, num_candidate_blocks_ + (ola_window_size_ - 1)); |
target_block_ = AudioBus::Create(channels_, ola_window_size_); |
- // WSOLA is quite expensive to run, so if a channel mask exists, use it to |
- // reduce the size of our search space. |
- std::vector<float*> active_target_channels; |
- std::vector<float*> active_search_channels; |
- for (int ch = 0; ch < channels_; ++ch) { |
- if (channel_mask_[ch]) { |
- active_target_channels.push_back(target_block_->channel(ch)); |
- active_search_channels.push_back(search_block_->channel(ch)); |
- } |
- } |
- |
- target_block_wrapper_ = |
- AudioBus::WrapVector(target_block_->frames(), active_target_channels); |
- search_block_wrapper_ = |
- AudioBus::WrapVector(search_block_->frames(), active_search_channels); |
+ // Create potentially smaller wrappers for playback rate adaptation. |
+ CreateSearchWrappers(); |
} |
int rendered_frames = 0; |
@@ -432,4 +423,22 @@ void AudioRendererAlgorithm::PeekAudioWithZeroPrepend( |
write_offset, dest); |
} |
+void AudioRendererAlgorithm::CreateSearchWrappers() { |
+ // WSOLA is quite expensive to run, so if a channel mask exists, use it to |
+ // reduce the size of our search space. |
+ std::vector<float*> active_target_channels; |
+ std::vector<float*> active_search_channels; |
+ for (int ch = 0; ch < channels_; ++ch) { |
+ if (channel_mask_[ch]) { |
+ active_target_channels.push_back(target_block_->channel(ch)); |
+ active_search_channels.push_back(search_block_->channel(ch)); |
+ } |
+ } |
+ |
+ target_block_wrapper_ = |
+ AudioBus::WrapVector(target_block_->frames(), active_target_channels); |
+ search_block_wrapper_ = |
+ AudioBus::WrapVector(search_block_->frames(), active_search_channels); |
+} |
+ |
} // namespace media |