| Index: media/filters/audio_renderer_impl_unittest.cc
|
| diff --git a/media/filters/audio_renderer_impl_unittest.cc b/media/filters/audio_renderer_impl_unittest.cc
|
| index 7894c28201ec76d03ac2d65df8837ecd3b623772..208e6e8feee65bb578d1540ec2a3453d90d34fee 100644
|
| --- a/media/filters/audio_renderer_impl_unittest.cc
|
| +++ b/media/filters/audio_renderer_impl_unittest.cc
|
| @@ -11,7 +11,9 @@
|
| #include "base/stl_util.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "media/base/audio_buffer.h"
|
| +#include "media/base/audio_buffer_converter.h"
|
| #include "media/base/audio_hardware_config.h"
|
| +#include "media/base/audio_splicer.h"
|
| #include "media/base/audio_timestamp_helper.h"
|
| #include "media/base/fake_audio_renderer_sink.h"
|
| #include "media/base/gmock_callback_support.h"
|
| @@ -37,6 +39,8 @@ static ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO;
|
| static int kChannelCount = 2;
|
| static int kChannels = ChannelLayoutToChannelCount(kChannelLayout);
|
| static int kSamplesPerSecond = 44100;
|
| +// Use a different output sample rate so the AudioBufferConverter is invoked.
|
| +static int kOutputSamplesPerSecond = 48000;
|
|
|
| // Constants for distinguishing between muted audio and playing audio when using
|
| // ConsumeBufferedData(). Must match the type needed by kSampleFormat.
|
| @@ -75,12 +79,13 @@ class AudioRendererImplTest : public ::testing::Test {
|
| // Mock out demuxer reads
|
| EXPECT_CALL(demuxer_stream_, Read(_)).WillRepeatedly(
|
| RunCallback<0>(DemuxerStream::kOk, DecoderBuffer::CreateEOSBuffer()));
|
| - AudioParameters out_params =
|
| - AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| - kChannelLayout,
|
| - kSamplesPerSecond,
|
| - SampleFormatToBytesPerChannel(kSampleFormat) * 8,
|
| - 512);
|
| + EXPECT_CALL(demuxer_stream_, SupportsConfigChanges())
|
| + .WillRepeatedly(Return(true));
|
| + AudioParameters out_params(AudioParameters::AUDIO_PCM_LOW_LATENCY,
|
| + kChannelLayout,
|
| + kOutputSamplesPerSecond,
|
| + SampleFormatToBytesPerChannel(kSampleFormat) * 8,
|
| + 512);
|
| hardware_config_.UpdateOutputConfig(out_params);
|
| ScopedVector<AudioDecoder> decoders;
|
| decoders.push_back(decoder_);
|
| @@ -415,6 +420,18 @@ class AudioRendererImplTest : public ::testing::Test {
|
| time_ += time;
|
| }
|
|
|
| + void force_config_change() {
|
| + renderer_->OnConfigChange();
|
| + }
|
| +
|
| + int converter_input_frames_left() const {
|
| + return renderer_->buffer_converter_->input_frames_left_for_testing();
|
| + }
|
| +
|
| + bool splicer_has_next_buffer() const {
|
| + return renderer_->splicer_->HasNextBuffer();
|
| + }
|
| +
|
| // Fixture members.
|
| base::MessageLoop message_loop_;
|
| scoped_ptr<AudioRendererImpl> renderer_;
|
| @@ -612,16 +629,19 @@ TEST_F(AudioRendererImplTest, Underflow_EndOfStream) {
|
| SatisfyPendingRead(kDataSize);
|
| WaitForPendingRead();
|
|
|
| - // Verify we're getting muted audio during underflow.
|
| + // Verify we're getting muted audio during underflow. Note: Since resampling
|
| + // is active, the number of frames_buffered() won't always match kDataSize.
|
| bool muted = false;
|
| - EXPECT_EQ(kDataSize, frames_buffered());
|
| - EXPECT_FALSE(ConsumeBufferedData(kDataSize, &muted));
|
| + const int kInitialFramesBuffered = 1114;
|
| + EXPECT_EQ(kInitialFramesBuffered, frames_buffered());
|
| + EXPECT_FALSE(ConsumeBufferedData(kInitialFramesBuffered, &muted));
|
| EXPECT_TRUE(muted);
|
|
|
| // Now deliver end of stream, we should get our little bit of data back.
|
| DeliverEndOfStream();
|
| - EXPECT_EQ(kDataSize, frames_buffered());
|
| - EXPECT_TRUE(ConsumeBufferedData(kDataSize, &muted));
|
| + const int kNextFramesBuffered = 1408;
|
| + EXPECT_EQ(kNextFramesBuffered, frames_buffered());
|
| + EXPECT_TRUE(ConsumeBufferedData(kNextFramesBuffered, &muted));
|
| EXPECT_FALSE(muted);
|
|
|
| // Attempt to read to make sure we're truly at the end of stream.
|
| @@ -907,4 +927,26 @@ TEST_F(AudioRendererImplTest, InitializeThenStopDuringDecoderInit) {
|
| InitializeAndStopDuringDecoderInit();
|
| }
|
|
|
| +TEST_F(AudioRendererImplTest, ConfigChangeDrainsConverter) {
|
| + Initialize();
|
| + Preroll();
|
| + Play();
|
| +
|
| + // Drain internal buffer, we should have a pending read.
|
| + EXPECT_TRUE(ConsumeBufferedData(frames_buffered(), NULL));
|
| + WaitForPendingRead();
|
| +
|
| + // Deliver a little bit of data. Use an odd data size to ensure there is data
|
| + // left in the AudioBufferConverter. Ensure no buffers are in the splicer.
|
| + SatisfyPendingRead(2053);
|
| + EXPECT_FALSE(splicer_has_next_buffer());
|
| + EXPECT_GT(converter_input_frames_left(), 0);
|
| +
|
| + // Force a config change and then ensure all buffered data has been put into
|
| + // the splicer.
|
| + force_config_change();
|
| + EXPECT_TRUE(splicer_has_next_buffer());
|
| + EXPECT_EQ(0, converter_input_frames_left());
|
| +}
|
| +
|
| } // namespace media
|
|
|