15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/test_audio_config.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/ppb_audio_config.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/cpp/module.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/tests/testing_instance.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)REGISTER_TEST_CASE(AudioConfig); 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool TestAudioConfig::Init() { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_config_interface_ = static_cast<const PPB_AudioConfig*>( 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface(PPB_AUDIO_CONFIG_INTERFACE)); 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) core_interface_ = static_cast<const PPB_Core*>( 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pp::Module::Get()->GetBrowserInterface(PPB_CORE_INTERFACE)); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return audio_config_interface_ && core_interface_; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void TestAudioConfig::RunTests(const std::string& filter) { 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(RecommendSampleRate, filter); 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(ValidConfigs, filter); 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RUN_TEST(InvalidConfigs, filter); 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestAudioConfig::TestRecommendSampleRate() { 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Ask PPB_AudioConfig about the recommended sample rate. 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AudioSampleRate sample_rate = audio_config_interface_->RecommendSampleRate( 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->pp_instance()); 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(sample_rate == PP_AUDIOSAMPLERATE_NONE || 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sample_rate == PP_AUDIOSAMPLERATE_44100 || 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) sample_rate == PP_AUDIOSAMPLERATE_48000); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestAudioConfig::TestValidConfigs() { 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const PP_AudioSampleRate kSampleRates[] = { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOSAMPLERATE_44100, 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOSAMPLERATE_48000 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const uint32_t kRequestFrameCounts[] = { 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOMINSAMPLEFRAMECOUNT, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOMAXSAMPLEFRAMECOUNT, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Include some "okay-looking" frame counts; check their validity below. 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1024, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2048, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4096 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t i = 0; i < sizeof(kSampleRates)/sizeof(kSampleRates[0]); i++) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AudioSampleRate sample_rate = kSampleRates[i]; 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (size_t j = 0; 56a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) j < sizeof(kRequestFrameCounts)/sizeof(kRequestFrameCounts[0]); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) j++) { 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t request_frame_count = kRequestFrameCounts[j]; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(request_frame_count >= PP_AUDIOMINSAMPLEFRAMECOUNT); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(request_frame_count <= PP_AUDIOMAXSAMPLEFRAMECOUNT); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) uint32_t frame_count = audio_config_interface_->RecommendSampleFrameCount( 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->pp_instance(), sample_rate, request_frame_count); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(frame_count >= PP_AUDIOMINSAMPLEFRAMECOUNT); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(frame_count <= PP_AUDIOMAXSAMPLEFRAMECOUNT); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource ac = audio_config_interface_->CreateStereo16Bit( 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->pp_instance(), sample_rate, frame_count); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(ac); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(audio_config_interface_->IsAudioConfig(ac)); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(sample_rate, audio_config_interface_->GetSampleRate(ac)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(frame_count, audio_config_interface_->GetSampleFrameCount(ac)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) core_interface_->ReleaseResource(ac); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string TestAudioConfig::TestInvalidConfigs() { 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |PP_AUDIOSAMPLERATE_NONE| is not a valid rate, so this should fail. 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_Resource ac = audio_config_interface_->CreateStereo16Bit( 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->pp_instance(), 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOSAMPLERATE_NONE, 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOMINSAMPLEFRAMECOUNT); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, ac); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test invalid frame counts. 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(PP_AUDIOMINSAMPLEFRAMECOUNT >= 1); 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ac = audio_config_interface_->CreateStereo16Bit( 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->pp_instance(), 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOSAMPLERATE_44100, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOMINSAMPLEFRAMECOUNT - 1u); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, ac); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ac = audio_config_interface_->CreateStereo16Bit( 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) instance_->pp_instance(), 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOSAMPLERATE_44100, 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PP_AUDIOMAXSAMPLEFRAMECOUNT + 1u); 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0, ac); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Test rest of API whose failure cases are defined. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_FALSE(audio_config_interface_->IsAudioConfig(0)); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(PP_AUDIOSAMPLERATE_NONE, audio_config_interface_->GetSampleRate(0)); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_EQ(0u, audio_config_interface_->GetSampleFrameCount(0)); 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) PASS(); 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 109