diff options
author | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-18 22:12:05 +0000 |
---|---|---|
committer | dalecurtis@chromium.org <dalecurtis@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-10-18 22:12:05 +0000 |
commit | 2b392e59ab9a72858d224bad9e422fe40a696a69 (patch) | |
tree | 124296c1b0473baa88c55a66f95d22b3e4623f04 /media/audio/simple_sources_unittest.cc | |
parent | c9b6e6a5b77de034a13c5d26b9084c40bb0e74c7 (diff) | |
download | chromium_src-2b392e59ab9a72858d224bad9e422fe40a696a69.zip chromium_src-2b392e59ab9a72858d224bad9e422fe40a696a69.tar.gz chromium_src-2b392e59ab9a72858d224bad9e422fe40a696a69.tar.bz2 |
Simulate an audio output stream when a real one isn't available.
Upgrades FakeAudioOutputStream to fake OnMoreData calls using a
PostDelayedTask approach similar to NullAudioSink.
This is necessary for playback of HTML5 videos when a real audio
device is not present. I.e. over remote desktop w/ remote audio
disabled on on some of the Buildbot machines (this should allow
us to remove --disable-audio from many of our tests).
This is a two fold change:
1. AudioOutputResampler will now request an AUDIO_FAKE device
when invalid output parameters are provided.
2. AudioManagerBase will check for AUDIO_FAKE as it always has
but will additionally check if there are any output devices
and if not return a fake stream.
2 is necessary for HTML5 audio since it doesn't use the low
latency output path.
BUG=120749
TEST=unittests. HTML5/Flash video playback over Remote Desktop
w/o Remote Audio works.
Review URL: https://chromiumcodereview.appspot.com/10987087
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@162810 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'media/audio/simple_sources_unittest.cc')
-rw-r--r-- | media/audio/simple_sources_unittest.cc | 67 |
1 files changed, 33 insertions, 34 deletions
diff --git a/media/audio/simple_sources_unittest.cc b/media/audio/simple_sources_unittest.cc index 47f18b4..cee5d8a 100644 --- a/media/audio/simple_sources_unittest.cc +++ b/media/audio/simple_sources_unittest.cc @@ -2,15 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <algorithm> // std::min #include <limits> #include "base/logging.h" #include "base/basictypes.h" #include "base/memory/scoped_ptr.h" -#include "base/time.h" -#include "media/audio/audio_manager.h" -#include "media/audio/fake_audio_output_stream.h" +#include "media/audio/audio_parameters.h" #include "media/audio/simple_sources.h" #include "media/base/audio_bus.h" #include "testing/gtest/include/gtest/gtest.h" @@ -19,46 +16,36 @@ namespace media { // Validate that the SineWaveAudioSource writes the expected values. TEST(SimpleSources, SineWaveAudioSource) { - const uint32 samples = 1024; - const uint32 bytes_per_sample = 2; - const int freq = 200; + static const uint32 samples = 1024; + static const uint32 bytes_per_sample = 2; + static const int freq = 200; - SineWaveAudioSource source(1, freq, AudioParameters::kTelephoneSampleRate); - - scoped_ptr<AudioManager> audio_man(AudioManager::Create()); AudioParameters params( - AudioParameters::AUDIO_MOCK, CHANNEL_LAYOUT_MONO, - AudioParameters::kTelephoneSampleRate, bytes_per_sample * 8, samples); - AudioOutputStream* oas = audio_man->MakeAudioOutputStream(params); - ASSERT_TRUE(NULL != oas); - EXPECT_TRUE(oas->Open()); - - oas->Start(&source); - oas->Stop(); + AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, + AudioParameters::kTelephoneSampleRate, bytes_per_sample * 8, samples); - ASSERT_TRUE(FakeAudioOutputStream::GetCurrentFakeStream()); - const AudioBus* last_audio_bus = - FakeAudioOutputStream::GetCurrentFakeStream()->audio_bus(); - ASSERT_TRUE(NULL != last_audio_bus); + SineWaveAudioSource source(1, freq, params.sample_rate()); + scoped_ptr<AudioBus> audio_bus = AudioBus::Create(params); + source.OnMoreData(audio_bus.get(), AudioBuffersState()); + EXPECT_EQ(1, source.callbacks()); + EXPECT_EQ(0, source.errors()); uint32 half_period = AudioParameters::kTelephoneSampleRate / (freq * 2); // Spot test positive incursion of sine wave. - EXPECT_NEAR(0, last_audio_bus->channel(0)[0], + EXPECT_NEAR(0, audio_bus->channel(0)[0], std::numeric_limits<float>::epsilon()); - EXPECT_FLOAT_EQ(0.15643446f, last_audio_bus->channel(0)[1]); - EXPECT_LT(last_audio_bus->channel(0)[1], last_audio_bus->channel(0)[2]); - EXPECT_LT(last_audio_bus->channel(0)[2], last_audio_bus->channel(0)[3]); + EXPECT_FLOAT_EQ(0.15643446f, audio_bus->channel(0)[1]); + EXPECT_LT(audio_bus->channel(0)[1], audio_bus->channel(0)[2]); + EXPECT_LT(audio_bus->channel(0)[2], audio_bus->channel(0)[3]); // Spot test negative incursion of sine wave. - EXPECT_NEAR(0, last_audio_bus->channel(0)[half_period], + EXPECT_NEAR(0, audio_bus->channel(0)[half_period], std::numeric_limits<float>::epsilon()); - EXPECT_FLOAT_EQ(-0.15643446f, last_audio_bus->channel(0)[half_period + 1]); - EXPECT_GT(last_audio_bus->channel(0)[half_period + 1], - last_audio_bus->channel(0)[half_period + 2]); - EXPECT_GT(last_audio_bus->channel(0)[half_period + 2], - last_audio_bus->channel(0)[half_period + 3]); - - oas->Close(); + EXPECT_FLOAT_EQ(-0.15643446f, audio_bus->channel(0)[half_period + 1]); + EXPECT_GT(audio_bus->channel(0)[half_period + 1], + audio_bus->channel(0)[half_period + 2]); + EXPECT_GT(audio_bus->channel(0)[half_period + 2], + audio_bus->channel(0)[half_period + 3]); } TEST(SimpleSources, SineWaveAudioCapped) { @@ -70,10 +57,22 @@ TEST(SimpleSources, SineWaveAudioCapped) { scoped_ptr<AudioBus> audio_bus = AudioBus::Create(1, 2 * kSampleCap); EXPECT_EQ(source.OnMoreData( audio_bus.get(), AudioBuffersState()), kSampleCap); + EXPECT_EQ(1, source.callbacks()); EXPECT_EQ(source.OnMoreData(audio_bus.get(), AudioBuffersState()), 0); + EXPECT_EQ(2, source.callbacks()); source.Reset(); EXPECT_EQ(source.OnMoreData( audio_bus.get(), AudioBuffersState()), kSampleCap); + EXPECT_EQ(3, source.callbacks()); + EXPECT_EQ(0, source.errors()); +} + +TEST(SimpleSources, OnError) { + SineWaveAudioSource source(1, 200, AudioParameters::kTelephoneSampleRate); + source.OnError(NULL, 0); + EXPECT_EQ(1, source.errors()); + source.OnError(NULL, 0); + EXPECT_EQ(2, source.errors()); } } // namespace media |