Chromium Code Reviews| Index: media/audio/audio_manager_unittest.cc |
| diff --git a/media/audio/audio_manager_unittest.cc b/media/audio/audio_manager_unittest.cc |
| index 904ee12fd9847dffdbf3527025e3a8dd1cb09a87..3f1b0a74adebc53579a339ae46b986e34be5d92f 100644 |
| --- a/media/audio/audio_manager_unittest.cc |
| +++ b/media/audio/audio_manager_unittest.cc |
| @@ -26,6 +26,7 @@ |
| #include "media/audio/fake_audio_log_factory.h" |
| #include "media/audio/fake_audio_manager.h" |
| #include "media/audio/test_audio_thread.h" |
| +#include "media/base/limits.h" |
| #include "testing/gmock/include/gmock/gmock.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| @@ -33,6 +34,11 @@ |
| #include "media/audio/alsa/audio_manager_alsa.h" |
| #endif // defined(USE_ALSA) |
| +#if defined(OS_MACOSX) |
| +#include "media/audio/mac/audio_manager_mac.h" |
| +#include "media/base/mac/audio_latency_mac.h" |
| +#endif |
| + |
| #if defined(OS_WIN) |
| #include "base/win/scoped_com_initializer.h" |
| #include "media/audio/win/audio_manager_win.h" |
| @@ -677,4 +683,131 @@ TEST_F(AudioManagerTest, AudioDebugRecording) { |
| audio_manager_->DisableOutputDebugRecording(); |
| } |
| +#if defined(OS_MACOSX) || defined(USE_CRAS) || defined(USE_PULSEAUDIO) |
| +#if defined(OS_MACOSX) |
| +class TestAudioManagerBase : public AudioManagerMac { |
| +#elif defined(USE_CRAS) |
| +class TestAudioManagerBase : public AudioManagerCras { |
| +#elif defined(USE_PULSEAUDIO) |
| +class TestAudioManagerBase : public AudioManagerPulse { |
| +#endif |
| + public: |
| + TestAudioManagerBase(std::unique_ptr<AudioThread> audio_thread, |
| + AudioLogFactory* audio_log_factory) |
| + : AudioManagerMac(std::move(audio_thread), audio_log_factory) {} |
| + |
| + AudioParameters GetPreferredOutputStreamParametersForTesting( |
| + const std::string& output_device_id, |
| + const AudioParameters& input_params) { |
| + return GetPreferredOutputStreamParameters(output_device_id, input_params); |
| + } |
| +}; // namespace media |
| + |
| +class TestAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { |
| + public: |
| + TestAudioSourceCallback(int expected_frames_per_buffer) |
| + : event_(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
| + base::WaitableEvent::InitialState::NOT_SIGNALED), |
| + expected_frames_per_buffer_(expected_frames_per_buffer){}; |
| + ~TestAudioSourceCallback() override{}; |
| + |
| + int OnMoreData(base::TimeDelta, |
| + base::TimeTicks, |
| + int, |
| + AudioBus* dest) override { |
| + EXPECT_EQ(dest->frames(), expected_frames_per_buffer_); |
| + event_.Signal(); |
| + return 0; |
| + } |
| + |
| + void OnError() override { FAIL(); } |
| + |
| + base::WaitableEvent& event() { return event_; } |
|
o1ka
2017/06/29 15:29:58
Would be cleaner to pass a pointer to an event in
Andrew MacPherson
2017/06/29 15:56:37
Done.
|
| + |
| + private: |
| + DISALLOW_COPY_AND_ASSIGN(TestAudioSourceCallback); |
| + |
| + base::WaitableEvent event_; |
| + int expected_frames_per_buffer_; |
|
o1ka
2017/06/29 15:29:58
const int
Andrew MacPherson
2017/06/29 15:56:37
Done.
|
| +}; |
| + |
| +TEST_F(AudioManagerTest, CheckMinimumAudioBufferSizes) { |
| + ABORT_AUDIO_TEST_IF_NOT(OutputDevicesAvailable()); |
| + |
| + CreateAudioManagerForTesting<TestAudioManagerBase>(); |
| + DCHECK(audio_manager_); |
| + |
| + TestAudioManagerBase* test_audio_manager_base = |
| + static_cast<TestAudioManagerBase*>(audio_manager_.get()); |
| + |
| + AudioParameters default_params = |
| + test_audio_manager_base->GetPreferredOutputStreamParametersForTesting( |
| + "", AudioParameters()); |
| + ASSERT_LT(default_params.frames_per_buffer(), |
| + media::limits::kMaxAudioBufferSize); |
| + |
| +#if defined(OS_MACOSX) |
| + // On OSX the preferred output buffer size is higher than the minimum |
| + // but users may request the minimum size explicitly. |
| + ASSERT_GT(default_params.frames_per_buffer(), |
| + GetMinAudioBufferSizeMacOS(media::limits::kMinAudioBufferSize, |
| + default_params.sample_rate())); |
| +#elif defined(USE_CRAS) |
| + // On CRAS the preferred output buffer size varies per board and may be as low |
| + // as the minimum for some boards. |
| + ASSERT_GE(params.frames_per_buffer(), media::limits::kMinAudioBufferSize); |
| +#elif defined(USE_PULSEAUDIO) |
| + ASSERT_EQ(params.frames_per_buffer(), media::limits::kMinAudioBufferSize); |
| +#else |
| + NOTREACHED(); |
| +#endif |
| + |
| + AudioParameters params; |
| + |
| + AudioParameters min_params = default_params; |
| + // Ensure that values below the minimum size are clamped to the minimum. |
| + min_params.set_frames_per_buffer(media::limits::kMinAudioBufferSize / 2); |
| + params = |
| + test_audio_manager_base->GetPreferredOutputStreamParametersForTesting( |
| + "", min_params); |
| + ASSERT_EQ(params.frames_per_buffer(), media::limits::kMinAudioBufferSize); |
| + |
| + AudioParameters max_params = default_params; |
| + // Ensure that values above the maximum size are clamped to the maximum. |
| + max_params.set_frames_per_buffer(media::limits::kMaxAudioBufferSize * 2); |
| + params = |
| + test_audio_manager_base->GetPreferredOutputStreamParametersForTesting( |
| + "", max_params); |
| + ASSERT_EQ(params.frames_per_buffer(), media::limits::kMaxAudioBufferSize); |
| +} |
| + |
| +TEST_F(AudioManagerTest, CheckMinimumAudioBufferSizesCallbacks) { |
|
o1ka
2017/06/29 15:29:58
Could you add a comment describing is verified in
Andrew MacPherson
2017/06/29 15:56:37
Done.
|
| + ABORT_AUDIO_TEST_IF_NOT(OutputDevicesAvailable()); |
| + |
| + CreateAudioManagerForTesting<TestAudioManagerBase>(); |
| + DCHECK(audio_manager_); |
| + |
| + TestAudioManagerBase* test_audio_manager_base = |
| + static_cast<TestAudioManagerBase*>(audio_manager_.get()); |
| + |
| + AudioParameters min_params = |
| + test_audio_manager_base->GetPreferredOutputStreamParametersForTesting( |
| + "", AudioParameters()); |
| + min_params.set_frames_per_buffer(media::limits::kMinAudioBufferSize); |
| + |
| + // Create an output stream with the minimum buffer size parameters and ensure |
| + // that no errors are returned. |
| + AudioOutputStream* stream = |
| + audio_manager_->MakeAudioOutputStreamProxy(min_params, ""); |
| + ASSERT_TRUE(stream); |
| + EXPECT_TRUE(stream->Open()); |
| + |
| + TestAudioSourceCallback source(min_params.frames_per_buffer()); |
| + stream->Start(&source); |
| + source.event().Wait(); |
| + stream->Stop(); |
| + stream->Close(); |
| +} |
| +#endif |
| + |
| } // namespace media |