Chromium Code Reviews| Index: ppapi/tests/test_audio.cc |
| diff --git a/ppapi/tests/test_audio.cc b/ppapi/tests/test_audio.cc |
| index b3853eaa00c0d6ed5154a8eb5068e9a80d821c94..167efa6c57b81f03be453933706e51a8eca7e69e 100644 |
| --- a/ppapi/tests/test_audio.cc |
| +++ b/ppapi/tests/test_audio.cc |
| @@ -24,20 +24,27 @@ TestAudio::TestAudio(TestingInstance* instance) |
| : TestCase(instance), |
| audio_callback_method_(NULL), |
| audio_callback_event_(instance->pp_instance()), |
| - test_done_(false) { |
| + test_done_(false), |
| + audio_interface_(NULL), |
| + audio_interface_1_0_(NULL), |
| + audio_config_interface_(NULL), |
| + core_interface_(NULL) { |
| } |
| TestAudio::~TestAudio() { |
| } |
| bool TestAudio::Init() { |
| - audio_interface_ = static_cast<const PPB_Audio*>( |
| - pp::Module::Get()->GetBrowserInterface(PPB_AUDIO_INTERFACE)); |
| + audio_interface_ = static_cast<const PPB_Audio_1_1*>( |
| + pp::Module::Get()->GetBrowserInterface(PPB_AUDIO_INTERFACE_1_1)); |
| + audio_interface_1_0_ = static_cast<const PPB_Audio_1_0*>( |
| + pp::Module::Get()->GetBrowserInterface(PPB_AUDIO_INTERFACE_1_0)); |
| audio_config_interface_ = static_cast<const PPB_AudioConfig*>( |
| pp::Module::Get()->GetBrowserInterface(PPB_AUDIO_CONFIG_INTERFACE)); |
| core_interface_ = static_cast<const PPB_Core*>( |
| pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE)); |
| - return audio_interface_ && audio_config_interface_ && core_interface_; |
| + return audio_interface_ && audio_interface_1_0_ && audio_config_interface_ && |
| + core_interface_; |
| } |
| void TestAudio::RunTests(const std::string& filter) { |
| @@ -47,6 +54,7 @@ void TestAudio::RunTests(const std::string& filter) { |
| RUN_TEST(AudioCallback1, filter); |
| RUN_TEST(AudioCallback2, filter); |
| RUN_TEST(AudioCallback3, filter); |
| + RUN_TEST(AudioCallback4, filter); |
| } |
| // Test creating audio resources for all guaranteed sample rates and various |
| @@ -118,13 +126,7 @@ std::string TestAudio::TestCreation() { |
| // Test that releasing the resource without calling |StopPlayback()| "works". |
| std::string TestAudio::TestDestroyNoStop() { |
| - const PP_AudioSampleRate kSampleRate = PP_AUDIOSAMPLERATE_44100; |
| - const uint32_t kRequestFrameCount = 2048; |
| - |
| - uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( |
| - instance_->pp_instance(), kSampleRate, kRequestFrameCount); |
| - PP_Resource ac = audio_config_interface_->CreateStereo16Bit( |
| - instance_->pp_instance(), kSampleRate, frame_count); |
| + PP_Resource ac = CreateAudioConfig(PP_AUDIOSAMPLERATE_44100, 2048); |
| ASSERT_TRUE(ac); |
| audio_callback_method_ = NULL; |
| PP_Resource audio = audio_interface_->Create( |
| @@ -145,16 +147,10 @@ std::string TestAudio::TestDestroyNoStop() { |
| } |
| std::string TestAudio::TestFailures() { |
| - const PP_AudioSampleRate kSampleRate = PP_AUDIOSAMPLERATE_44100; |
| - const uint32_t kRequestFrameCount = 2048; |
| - |
| // Test invalid parameters to |Create()|. |
| // We want a valid config for some of our tests of |Create()|. |
| - uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( |
| - instance_->pp_instance(), kSampleRate, kRequestFrameCount); |
| - PP_Resource ac = audio_config_interface_->CreateStereo16Bit( |
| - instance_->pp_instance(), kSampleRate, frame_count); |
| + PP_Resource ac = CreateAudioConfig(PP_AUDIOSAMPLERATE_44100, 2048); |
| ASSERT_TRUE(ac); |
| // Failure cases should never lead to the callback being called. |
| @@ -187,24 +183,17 @@ std::string TestAudio::TestFailures() { |
| PASS(); |
| } |
| -// NOTE: |TestAudioCallback1| and |TestAudioCallback2| assume that the audio |
| -// callback is called at least once. If the audio stream does not start up |
| -// correctly or is interrupted this may not be the case and these tests will |
| -// fail. However, in order to properly test the audio callbacks, we must have |
| -// a configuration where audio can successfully play, so we assume this is the |
| -// case on bots. |
| +// NOTE: |TestAudioCallbackN| assumes that the audio callback is called at least |
| +// once. If the audio stream does not start up correctly or is interrupted this |
| +// may not be the case and these tests will fail. However, in order to properly |
| +// test the audio callbacks, we must have a configuration where audio can |
| +// successfully play, so we assume this is the case on bots. |
| // This test starts playback and verifies that: |
| // 1) the audio callback is actually called; |
| // 2) that |StopPlayback()| waits for the audio callback to finish. |
| std::string TestAudio::TestAudioCallback1() { |
| - const PP_AudioSampleRate kSampleRate = PP_AUDIOSAMPLERATE_44100; |
| - const uint32_t kRequestFrameCount = 1024; |
| - |
| - uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( |
| - instance_->pp_instance(), kSampleRate, kRequestFrameCount); |
| - PP_Resource ac = audio_config_interface_->CreateStereo16Bit( |
| - instance_->pp_instance(), kSampleRate, frame_count); |
| + PP_Resource ac = CreateAudioConfig(PP_AUDIOSAMPLERATE_44100, 1024); |
| ASSERT_TRUE(ac); |
| audio_callback_method_ = NULL; |
| PP_Resource audio = audio_interface_->Create( |
| @@ -234,13 +223,7 @@ std::string TestAudio::TestAudioCallback1() { |
| // This is the same as |TestAudioCallback1()|, except that instead of calling |
| // |StopPlayback()|, it just releases the resource. |
| std::string TestAudio::TestAudioCallback2() { |
| - const PP_AudioSampleRate kSampleRate = PP_AUDIOSAMPLERATE_44100; |
| - const uint32_t kRequestFrameCount = 1024; |
| - |
| - uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( |
| - instance_->pp_instance(), kSampleRate, kRequestFrameCount); |
| - PP_Resource ac = audio_config_interface_->CreateStereo16Bit( |
| - instance_->pp_instance(), kSampleRate, frame_count); |
| + PP_Resource ac = CreateAudioConfig(PP_AUDIOSAMPLERATE_44100, 1024); |
| ASSERT_TRUE(ac); |
| audio_callback_method_ = NULL; |
| PP_Resource audio = audio_interface_->Create( |
| @@ -250,7 +233,6 @@ std::string TestAudio::TestAudioCallback2() { |
| audio_callback_event_.Reset(); |
| test_done_ = false; |
| - callback_fired_ = false; |
| audio_callback_method_ = &TestAudio::AudioCallbackTest; |
| ASSERT_TRUE(audio_interface_->StartPlayback(audio)); |
| @@ -272,13 +254,7 @@ std::string TestAudio::TestAudioCallback2() { |
| // round of |StartPlayback| and |StopPlayback| to make sure the callback |
| // function still responds when using the same audio resource. |
| std::string TestAudio::TestAudioCallback3() { |
| - const PP_AudioSampleRate kSampleRate = PP_AUDIOSAMPLERATE_44100; |
| - const uint32_t kRequestFrameCount = 1024; |
| - |
| - uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( |
| - instance_->pp_instance(), kSampleRate, kRequestFrameCount); |
| - PP_Resource ac = audio_config_interface_->CreateStereo16Bit( |
| - instance_->pp_instance(), kSampleRate, frame_count); |
| + PP_Resource ac = CreateAudioConfig(PP_AUDIOSAMPLERATE_44100, 1024); |
| ASSERT_TRUE(ac); |
| audio_callback_method_ = NULL; |
| PP_Resource audio = audio_interface_->Create( |
| @@ -288,7 +264,6 @@ std::string TestAudio::TestAudioCallback3() { |
| audio_callback_event_.Reset(); |
| test_done_ = false; |
| - callback_fired_ = false; |
| audio_callback_method_ = &TestAudio::AudioCallbackTest; |
| ASSERT_TRUE(audio_interface_->StartPlayback(audio)); |
| @@ -316,6 +291,35 @@ std::string TestAudio::TestAudioCallback3() { |
| PASS(); |
| } |
| +// This is the same as |TestAudioCallback1()|, except that it uses |
| +// PPB_Audio_1_0. |
| +std::string TestAudio::TestAudioCallback4() { |
| + PP_Resource ac = CreateAudioConfig(PP_AUDIOSAMPLERATE_44100, 1024); |
| + ASSERT_TRUE(ac); |
| + audio_callback_method_ = NULL; |
| + PP_Resource audio = audio_interface_1_0_->Create( |
| + instance_->pp_instance(), ac, AudioCallbackTrampoline1_0, this); |
| + core_interface_->ReleaseResource(ac); |
| + ac = 0; |
| + |
| + audio_callback_event_.Reset(); |
| + test_done_ = false; |
| + |
| + audio_callback_method_ = &TestAudio::AudioCallbackTest; |
| + ASSERT_TRUE(audio_interface_1_0_->StartPlayback(audio)); |
| + |
| + // Wait for the audio callback to be called. |
| + audio_callback_event_.Wait(); |
| + ASSERT_TRUE(audio_interface_1_0_->StopPlayback(audio)); |
| + test_done_ = true; |
| + |
| + // If any more audio callbacks are generated, we should crash (which is good). |
| + audio_callback_method_ = NULL; |
| + |
| + core_interface_->ReleaseResource(audio); |
| + |
| + PASS(); |
| +} |
| // TODO(raymes): Test that actually playback happens correctly, etc. |
| @@ -326,6 +330,7 @@ static void Crash() { |
| // static |
| void TestAudio::AudioCallbackTrampoline(void* sample_buffer, |
| uint32_t buffer_size_in_bytes, |
| + PP_TimeDelta latency, |
| void* user_data) { |
| TestAudio* thiz = static_cast<TestAudio*>(user_data); |
| @@ -334,19 +339,40 @@ void TestAudio::AudioCallbackTrampoline(void* sample_buffer, |
| Crash(); |
| AudioCallbackMethod method = thiz->audio_callback_method_; |
| - (thiz->*method)(sample_buffer, buffer_size_in_bytes); |
| + (thiz->*method)(sample_buffer, buffer_size_in_bytes, latency); |
| +} |
| + |
| +// static |
| +void TestAudio::AudioCallbackTrampoline1_0(void* sample_buffer, |
| + uint32_t buffer_size_in_bytes, |
| + void* user_data) { |
| + AudioCallbackTrampoline(sample_buffer, buffer_size_in_bytes, 0.0, user_data); |
| } |
| void TestAudio::AudioCallbackTrivial(void* sample_buffer, |
| - uint32_t buffer_size_in_bytes) { |
| + uint32_t buffer_size_in_bytes, |
| + PP_TimeDelta latency) { |
| + if (latency < 0) |
|
noelallen_use_chromium
2013/08/08 01:19:03
Is there a useful value we can check here?
For exa
yzshen1
2013/08/08 17:23:57
Could that happen if the browser process is too bu
|
| + Crash(); |
| + |
| memset(sample_buffer, 0, buffer_size_in_bytes); |
| } |
| void TestAudio::AudioCallbackTest(void* sample_buffer, |
| - uint32_t buffer_size_in_bytes) { |
| - if (test_done_) |
| + uint32_t buffer_size_in_bytes, |
| + PP_TimeDelta latency) { |
| + if (test_done_ || latency < 0) |
| Crash(); |
| memset(sample_buffer, 0, buffer_size_in_bytes); |
| audio_callback_event_.Signal(); |
| } |
| + |
| +PP_Resource TestAudio::CreateAudioConfig( |
| + PP_AudioSampleRate sample_rate, |
| + uint32_t requested_sample_frame_count) { |
| + uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( |
| + instance_->pp_instance(), sample_rate, requested_sample_frame_count); |
| + return audio_config_interface_->CreateStereo16Bit( |
| + instance_->pp_instance(), sample_rate, frame_count); |
| +} |