From b30e262876090db2a2f4b2e3cebebafdf0facdb9 Mon Sep 17 00:00:00 2001 From: "sandersd@chromium.org" Date: Thu, 20 Mar 2014 06:08:02 +0000 Subject: [PATCH] Remove muting for extreme playbackRates. Audio was muted below 0.5x and above 4x as the quality degraded significantly under the crossfade algorithm. The quality is now much better under the WSLOA algorithm (r220343). BUG=289354 R=scherkus@chromium.org R=dalecurtis@chromium.org Review URL: https://codereview.chromium.org/205093002 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@258215 0039d316-1c4b-4281-b951-d872f2087c98 --- media/filters/audio_renderer_algorithm.cc | 35 ---------------------- media/filters/audio_renderer_algorithm.h | 11 ------- media/filters/audio_renderer_algorithm_unittest.cc | 2 +- 3 files changed, 1 insertion(+), 47 deletions(-) diff --git a/media/filters/audio_renderer_algorithm.cc b/media/filters/audio_renderer_algorithm.cc index e73ce65569ca..db65fe9950ec 100644 --- a/media/filters/audio_renderer_algorithm.cc +++ b/media/filters/audio_renderer_algorithm.cc @@ -46,12 +46,6 @@ namespace media { // |search_block_index_| = |search_block_center_offset_| - // |search_block_center_offset_|. -// Max/min supported playback rates for fast/slow audio. Audio outside of these -// ranges are muted. -// Audio at these speeds would sound better under a frequency domain algorithm. -static const float kMinPlaybackRate = 0.5f; -static const float kMaxPlaybackRate = 4.0f; - // Overlap-and-add window size in milliseconds. static const int kOlaWindowSizeMs = 20; @@ -76,8 +70,6 @@ AudioRendererAlgorithm::AudioRendererAlgorithm() : channels_(0), samples_per_second_(0), playback_rate_(0), - muted_(false), - muted_partial_frame_(0), capacity_(kStartingBufferSizeInFrames), output_time_(0.0), search_block_center_offset_(0), @@ -151,31 +143,6 @@ int AudioRendererAlgorithm::FillBuffer(AudioBus* dest, int requested_frames) { DCHECK_EQ(channels_, dest->channels()); - // Optimize the |muted_| case to issue a single clear instead of performing - // the full crossfade and clearing each crossfaded frame. - if (muted_) { - int frames_to_render = - std::min(static_cast(audio_buffer_.frames() / playback_rate_), - requested_frames); - - // Compute accurate number of frames to actually skip in the source data. - // Includes the leftover partial frame from last request. However, we can - // only skip over complete frames, so a partial frame may remain for next - // time. - muted_partial_frame_ += frames_to_render * playback_rate_; - int seek_frames = static_cast(muted_partial_frame_); - dest->ZeroFrames(frames_to_render); - audio_buffer_.SeekFrames(seek_frames); - - // Determine the partial frame that remains to be skipped for next call. If - // the user switches back to playing, it may be off time by this partial - // frame, which would be undetectable. If they subsequently switch to - // another playback rate that mutes, the code will attempt to line up the - // frames again. - muted_partial_frame_ -= seek_frames; - return frames_to_render; - } - int slower_step = ceil(ola_window_size_ * playback_rate_); int faster_step = ceil(ola_window_size_ / playback_rate_); @@ -200,8 +167,6 @@ int AudioRendererAlgorithm::FillBuffer(AudioBus* dest, int requested_frames) { void AudioRendererAlgorithm::SetPlaybackRate(float new_rate) { DCHECK_GE(new_rate, 0); playback_rate_ = new_rate; - muted_ = - playback_rate_ < kMinPlaybackRate || playback_rate_ > kMaxPlaybackRate; } void AudioRendererAlgorithm::FlushBuffers() { diff --git a/media/filters/audio_renderer_algorithm.h b/media/filters/audio_renderer_algorithm.h index 39e4db6ca69b..f251ff72aa8b 100644 --- a/media/filters/audio_renderer_algorithm.h +++ b/media/filters/audio_renderer_algorithm.h @@ -19,8 +19,6 @@ // are preserved. See audio_renderer_algorith.cc for a more elaborate // description of the algorithm. // -// Audio at very low or very high playback rates are muted to preserve quality. -// #ifndef MEDIA_FILTERS_AUDIO_RENDERER_ALGORITHM_H_ #define MEDIA_FILTERS_AUDIO_RENDERER_ALGORITHM_H_ @@ -84,9 +82,6 @@ class MEDIA_EXPORT AudioRendererAlgorithm { // Returns the samples per second for this audio stream. int samples_per_second() { return samples_per_second_; } - // Is the sound currently muted? - bool is_muted() { return muted_; } - private: // Within |search_block_|, find the block of data that is most similar to // |target_block_|, and write it in |optimal_block_|. This method assumes that @@ -140,12 +135,6 @@ class MEDIA_EXPORT AudioRendererAlgorithm { // Buffered audio data. AudioBufferQueue audio_buffer_; - // True if the audio should be muted. - bool muted_; - - // If muted, keep track of partial frames that should have been skipped over. - double muted_partial_frame_; - // How many frames to have in the queue before we report the queue is full. int capacity_; diff --git a/media/filters/audio_renderer_algorithm_unittest.cc b/media/filters/audio_renderer_algorithm_unittest.cc index 7e520043980b..bde07a23f843 100644 --- a/media/filters/audio_renderer_algorithm_unittest.cc +++ b/media/filters/audio_renderer_algorithm_unittest.cc @@ -148,7 +148,7 @@ class AudioRendererAlgorithmTest : public testing::Test { bool all_zero = true; for (int i = 0; i < frames_written && all_zero; ++i) all_zero = audio_data->channel(ch)[i] == 0.0f; - ASSERT_EQ(algorithm_.is_muted(), all_zero) << " for channel " << ch; + ASSERT_FALSE(all_zero) << " for channel " << ch; } } -- 2.11.4.GIT