diff options
Diffstat (limited to 'media')
-rw-r--r-- | media/filters/audio_renderer_algorithm.cc | 28 | ||||
-rw-r--r-- | media/filters/audio_renderer_algorithm.h | 3 | ||||
-rw-r--r-- | media/filters/audio_renderer_algorithm_unittest.cc | 2 |
3 files changed, 19 insertions, 14 deletions
diff --git a/media/filters/audio_renderer_algorithm.cc b/media/filters/audio_renderer_algorithm.cc index 2d2bfbf..a370124 100644 --- a/media/filters/audio_renderer_algorithm.cc +++ b/media/filters/audio_renderer_algorithm.cc @@ -61,20 +61,14 @@ static const int kWsolaSearchIntervalMs = 30; // The maximum size in seconds for the |audio_buffer_|. Arbitrarily determined. static const int kMaxCapacityInSeconds = 3; -// The starting size in frames for |audio_buffer_|. Previous usage maintained a -// queue of 16 AudioBuffers, each of 512 frames. This worked well, so we -// maintain this number of frames. -static const int kStartingBufferSizeInFrames = 16 * 512; - -static_assert(kStartingBufferSizeInFrames < - (kMaxCapacityInSeconds * limits::kMinSampleRate), - "max capacity smaller than starting buffer size"); +// The minimum size in ms for the |audio_buffer_|. Arbitrarily determined. +static const int kStartingCapacityInMs = 200; AudioRendererAlgorithm::AudioRendererAlgorithm() : channels_(0), samples_per_second_(0), muted_partial_frame_(0), - capacity_(kStartingBufferSizeInFrames), + capacity_(0), output_time_(0.0), search_block_center_offset_(0), search_block_index_(0), @@ -92,8 +86,9 @@ void AudioRendererAlgorithm::Initialize(const AudioParameters& params) { channels_ = params.channels(); samples_per_second_ = params.sample_rate(); - num_candidate_blocks_ = (kWsolaSearchIntervalMs * samples_per_second_) / 1000; - ola_window_size_ = kOlaWindowSizeMs * samples_per_second_ / 1000; + capacity_ = ConvertMillisecondsToFrames(kStartingCapacityInMs); + num_candidate_blocks_ = ConvertMillisecondsToFrames(kWsolaSearchIntervalMs); + ola_window_size_ = ConvertMillisecondsToFrames(kOlaWindowSizeMs); // Make sure window size in an even number. ola_window_size_ += ola_window_size_ & 1; @@ -206,9 +201,9 @@ void AudioRendererAlgorithm::FlushBuffers() { wsola_output_->Zero(); num_complete_frames_ = 0; - // Reset |capacity_| so growth triggered by underflows doesn't penalize - // seek time. - capacity_ = kStartingBufferSizeInFrames; + // Reset |capacity_| so growth triggered by underflows doesn't penalize seek + // time. + capacity_ = ConvertMillisecondsToFrames(kStartingCapacityInMs); } void AudioRendererAlgorithm::EnqueueBuffer( @@ -235,6 +230,11 @@ bool AudioRendererAlgorithm::CanPerformWsola() const { search_block_index_ + search_block_size <= frames; } +int AudioRendererAlgorithm::ConvertMillisecondsToFrames(int ms) const { + return ms * (samples_per_second_ / + static_cast<double>(base::Time::kMillisecondsPerSecond)); +} + bool AudioRendererAlgorithm::RunOneWsolaIteration(double playback_rate) { if (!CanPerformWsola()) return false; diff --git a/media/filters/audio_renderer_algorithm.h b/media/filters/audio_renderer_algorithm.h index 2005bfe..940e7e7 100644 --- a/media/filters/audio_renderer_algorithm.h +++ b/media/filters/audio_renderer_algorithm.h @@ -118,6 +118,9 @@ class MEDIA_EXPORT AudioRendererAlgorithm { // Do we have enough data to perform one round of WSOLA? bool CanPerformWsola() const; + // Converts a time in milliseconds to frames using |samples_per_second_|. + int ConvertMillisecondsToFrames(int ms) const; + // Number of channels in audio stream. int channels_; diff --git a/media/filters/audio_renderer_algorithm_unittest.cc b/media/filters/audio_renderer_algorithm_unittest.cc index 003cd51..82c59675 100644 --- a/media/filters/audio_renderer_algorithm_unittest.cc +++ b/media/filters/audio_renderer_algorithm_unittest.cc @@ -666,6 +666,7 @@ TEST_F(AudioRendererAlgorithmTest, FillBufferOffset) { ASSERT_EQ(kHalfSize, frames_filled); ASSERT_TRUE(VerifyAudioData(bus.get(), 0, kHalfSize, 0)); ASSERT_FALSE(VerifyAudioData(bus.get(), kHalfSize, kHalfSize, 0)); + FillAlgorithmQueue(); } const float kMutedRates[] = {5.0f, 0.25f}; @@ -679,6 +680,7 @@ TEST_F(AudioRendererAlgorithmTest, FillBufferOffset) { ASSERT_EQ(kHalfSize, frames_filled); ASSERT_FALSE(VerifyAudioData(bus.get(), 0, kHalfSize, 0)); ASSERT_TRUE(VerifyAudioData(bus.get(), kHalfSize, kHalfSize, 0)); + FillAlgorithmQueue(); } } |