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