Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1105)

Unified Diff: media/audio/win/audio_low_latency_output_win_unittest.cc

Issue 10823100: Adds support for multi-channel output audio for the low-latency path in Windows. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « media/audio/win/audio_low_latency_output_win.cc ('k') | media/test/data/speech_16b_mono_44kHz.raw » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: media/audio/win/audio_low_latency_output_win_unittest.cc
diff --git a/media/audio/win/audio_low_latency_output_win_unittest.cc b/media/audio/win/audio_low_latency_output_win_unittest.cc
index 3ab9268cc58a642489abc4b176b591a1bd38703c..5a935e58f03e6ffa8d22f68ddfed97774788adae 100644
--- a/media/audio/win/audio_low_latency_output_win_unittest.cc
+++ b/media/audio/win/audio_low_latency_output_win_unittest.cc
@@ -40,6 +40,8 @@ namespace media {
static const char kSpeechFile_16b_s_48k[] = "speech_16b_stereo_48kHz.raw";
static const char kSpeechFile_16b_s_44k[] = "speech_16b_stereo_44kHz.raw";
+static const char kSpeechFile_16b_m_48k[] = "speech_16b_mono_48kHz.raw";
+static const char kSpeechFile_16b_m_44k[] = "speech_16b_mono_44kHz.raw";
static const size_t kFileDurationMs = 20000;
static const size_t kNumFileSegments = 2;
@@ -248,7 +250,7 @@ static AudioOutputStream* CreateDefaultAudioOutputStream(
// that indicate the role that the system/user has assigned to an audio
// endpoint device.
// TODO(henrika): modify this test when we support full device enumeration.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestHardwareSampleRate) {
+TEST(WASAPIAudioOutputStreamTest, HardwareSampleRate) {
// Skip this test in exclusive mode since the resulting rate is only utilized
// for shared mode streams.
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
@@ -275,7 +277,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestHardwareSampleRate) {
}
// Test Create(), Close() calling sequence.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestCreateAndClose) {
+TEST(WASAPIAudioOutputStreamTest, CreateAndClose) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -283,8 +285,45 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestCreateAndClose) {
aos->Close();
}
+// Verify that the created object is configured to use the same number of
+// audio channels as is reported by the static HardwareChannelCount() method.
+TEST(WASAPIAudioOutputStreamTest, HardwareChannelCount) {
+ scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
+ if (!CanRunAudioTests(audio_manager.get()))
+ return;
+
+ ScopedCOMInitializer com_init(ScopedCOMInitializer::kMTA);
+
+ // First, verify that we can read a valid native/hardware channel-count.
+ int hardware_channel_count = WASAPIAudioOutputStream::HardwareChannelCount();
+ EXPECT_GE(hardware_channel_count, 1);
+
+ AudioOutputStreamWrapper aosw(audio_manager.get());
+ WASAPIAudioOutputStream* aos =
+ static_cast<WASAPIAudioOutputStream*>(aosw.Create(CHANNEL_LAYOUT_MONO));
+
+ // Next, ensure that the created output stream object is really using the
+ // hardware channel-count.
+ EXPECT_EQ(hardware_channel_count, aos->endpoint_channel_count());
+ aos->Close();
+
+ // Try to use a non-supported combination of channel configurations if the
+ // number of hardware channels is 2.
+ if (hardware_channel_count == 2) {
+ // It should be possible to create and object even for an invalid channel-
+ // count combination (7.1 -> 2).
+ WASAPIAudioOutputStream* aos =
+ static_cast<WASAPIAudioOutputStream*>(aosw.Create(CHANNEL_LAYOUT_7_1));
+
+ // But an attempt to open a stream shall fail since down-mixing is not
+ // yet supported.
+ EXPECT_FALSE(aos->Open());
+ aos->Close();
+ }
+}
+
// Test Open(), Close() calling sequence.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenAndClose) {
+TEST(WASAPIAudioOutputStreamTest, OpenAndClose) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -294,7 +333,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenAndClose) {
}
// Test Open(), Start(), Close() calling sequence.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartAndClose) {
+TEST(WASAPIAudioOutputStreamTest, OpenStartAndClose) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -308,7 +347,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartAndClose) {
}
// Test Open(), Start(), Stop(), Close() calling sequence.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartStopAndClose) {
+TEST(WASAPIAudioOutputStreamTest, OpenStartStopAndClose) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -323,7 +362,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestOpenStartStopAndClose) {
}
// Test SetVolume(), GetVolume()
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestVolume) {
+TEST(WASAPIAudioOutputStreamTest, Volume) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -360,7 +399,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestVolume) {
}
// Test some additional calling sequences.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMiscCallingSequences) {
+TEST(WASAPIAudioOutputStreamTest, MiscCallingSequences) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -400,7 +439,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMiscCallingSequences) {
}
// Use default packet size (10ms) and verify that rendering starts.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInMilliseconds) {
+TEST(WASAPIAudioOutputStreamTest, PacketSizeInMilliseconds) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -438,7 +477,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInMilliseconds) {
// Use a fixed packets size (independent of sample rate) and verify
// that rendering starts.
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInSamples) {
+TEST(WASAPIAudioOutputStreamTest, PacketSizeInSamples) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -446,8 +485,9 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInSamples) {
MessageLoopForUI loop;
MockAudioSourceCallback source;
- // Create default WASAPI output stream which plays out in stereo using
- // the shared mixing rate. The buffer size is set to 1024 samples.
+ // Create default WASAPI output stream which reads data in stereo using
+ // the native mixing rate and channel count. The buffer size is set to
+ // 1024 samples.
AudioOutputStreamWrapper aosw(audio_manager.get());
AudioOutputStream* aos = aosw.Create(1024);
EXPECT_TRUE(aos->Open());
@@ -475,7 +515,7 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestPacketSizeInSamples) {
aos->Close();
}
-TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMono) {
+TEST(WASAPIAudioOutputStreamTest, Mono) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -483,19 +523,12 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMono) {
MessageLoopForUI loop;
MockAudioSourceCallback source;
- // Create default WASAPI output stream which plays out in *mono* using
- // the shared mixing rate. The default buffer size is 10ms.
+ // Create default WASAPI output stream which reads data *mono* using
+ // the native mixing rate and channel count. The default buffer size is 10ms.
AudioOutputStreamWrapper aosw(audio_manager.get());
AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO);
+ EXPECT_TRUE(aos->Open());
- bool opened = aos->Open();
- if (!opened) {
- // It was not possible to open this audio device in mono.
- // No point in continuing the test so let's break here.
- LOG(WARNING) << "Mono is not supported. Skipping test.";
- aos->Close();
- return;
- }
// Derive the expected size in bytes of each packet.
uint32 bytes_per_packet = aosw.channels() * aosw.samples_per_packet() *
(aosw.bits_per_sample() / 8);
@@ -519,13 +552,13 @@ TEST(WinAudioOutputTest, WASAPIAudioOutputStreamTestMono) {
}
// This test is intended for manual tests and should only be enabled
-// when it is required to store the captured data on a local file.
+// when it is required to play out data from a local PCM file.
// By default, GTest will print out YOU HAVE 1 DISABLED TEST.
// To include disabled tests in test execution, just invoke the test program
// with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS
// environment variable to a value greater than 0.
// The test files are approximately 20 seconds long.
-TEST(WinAudioOutputTest, DISABLED_WASAPIAudioOutputStreamReadFromFile) {
+TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromStereoFile) {
scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
if (!CanRunAudioTests(audio_manager.get()))
return;
@@ -548,11 +581,60 @@ TEST(WinAudioOutputTest, DISABLED_WASAPIAudioOutputStreamReadFromFile) {
}
ReadFromFileAudioSource file_source(file_name);
+ LOG(INFO) << "File name : " << file_name.c_str();
+ LOG(INFO) << "Sample rate : " << aosw.sample_rate();
+ LOG(INFO) << "Bits per sample: " << aosw.bits_per_sample();
+ LOG(INFO) << "#channels : " << aosw.channels();
+ LOG(INFO) << "File size : " << file_source.file_size();
+ LOG(INFO) << "#file segments : " << kNumFileSegments;
+ LOG(INFO) << ">> Listen to the stereo file while playing...";
+
+ for (int i = 0; i < kNumFileSegments; i++) {
+ // Each segment will start with a short (~20ms) block of zeros, hence
+ // some short glitches might be heard in this test if kNumFileSegments
+ // is larger than one. The exact length of the silence period depends on
+ // the selected sample rate.
+ aos->Start(&file_source);
+ base::PlatformThread::Sleep(
+ base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
+ aos->Stop();
+ }
+
+ LOG(INFO) << ">> Stereo file playout has stopped.";
+ aos->Close();
+}
+
+// Same as the stereo test but reading and playing out a mono file instead.
+// It means that most likely a 1->2 channel up-mix will be performed.
+TEST(WASAPIAudioOutputStreamTest, DISABLED_ReadFromMonoFile) {
+ scoped_ptr<AudioManager> audio_manager(AudioManager::Create());
+ if (!CanRunAudioTests(audio_manager.get()))
+ return;
+
+ AudioOutputStreamWrapper aosw(audio_manager.get());
+ AudioOutputStream* aos = aosw.Create(CHANNEL_LAYOUT_MONO);
+ EXPECT_TRUE(aos->Open());
+
+ std::string file_name;
+ if (aosw.sample_rate() == 48000) {
+ file_name = kSpeechFile_16b_m_48k;
+ } else if (aosw.sample_rate() == 44100) {
+ file_name = kSpeechFile_16b_m_44k;
+ } else if (aosw.sample_rate() == 96000) {
+ // Use 48kHz file at 96kHz as well. Will sound like Donald Duck.
+ file_name = kSpeechFile_16b_m_48k;
+ } else {
+ FAIL() << "This test supports 44.1, 48kHz and 96kHz only.";
+ return;
+ }
+ ReadFromFileAudioSource file_source(file_name);
+
LOG(INFO) << "File name : " << file_name.c_str();
LOG(INFO) << "Sample rate : " << aosw.sample_rate();
+ LOG(INFO) << "#channels : " << aosw.channels();
LOG(INFO) << "File size : " << file_source.file_size();
LOG(INFO) << "#file segments: " << kNumFileSegments;
- LOG(INFO) << ">> Listen to the file while playing...";
+ LOG(INFO) << ">> Listen to the mono file while playing...";
for (int i = 0; i < kNumFileSegments; i++) {
// Each segment will start with a short (~20ms) block of zeros, hence
@@ -561,11 +643,11 @@ TEST(WinAudioOutputTest, DISABLED_WASAPIAudioOutputStreamReadFromFile) {
// the selected sample rate.
aos->Start(&file_source);
base::PlatformThread::Sleep(
- base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
+ base::TimeDelta::FromMilliseconds(kFileDurationMs / kNumFileSegments));
aos->Stop();
}
- LOG(INFO) << ">> File playout has stopped.";
+ LOG(INFO) << ">> Mono file playout has stopped.";
aos->Close();
}
@@ -573,7 +655,7 @@ TEST(WinAudioOutputTest, DISABLED_WASAPIAudioOutputStreamReadFromFile) {
// certain set of audio parameters and a sample rate of 48kHz.
// The expected outcomes of each setting in this test has been derived
// manually using log outputs (--v=1).
-TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt48kHz) {
+TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt48kHz) {
if (!ExclusiveModeIsEnabled())
return;
@@ -624,7 +706,7 @@ TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt48kHz) {
// certain set of audio parameters and a sample rate of 44.1kHz.
// The expected outcomes of each setting in this test has been derived
// manually using log outputs (--v=1).
-TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt44kHz) {
+TEST(WASAPIAudioOutputStreamTest, ExclusiveModeBufferSizesAt44kHz) {
if (!ExclusiveModeIsEnabled())
return;
@@ -682,7 +764,7 @@ TEST(WinAudioOutputTest, WASAPIExclusiveModeBufferSizesAt44kHz) {
// Verify that we can open and start the output stream in exclusive mode at
// the lowest possible delay at 48kHz.
-TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt48kHz) {
+TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt48kHz) {
if (!ExclusiveModeIsEnabled())
return;
@@ -724,7 +806,7 @@ TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt48kHz) {
// Verify that we can open and start the output stream in exclusive mode at
// the lowest possible delay at 44.1kHz.
-TEST(WinAudioOutputTest, WASAPIExclusiveModeMinBufferSizeAt44kHz) {
+TEST(WASAPIAudioOutputStreamTest, ExclusiveModeMinBufferSizeAt44kHz) {
if (!ExclusiveModeIsEnabled())
return;
« no previous file with comments | « media/audio/win/audio_low_latency_output_win.cc ('k') | media/test/data/speech_16b_mono_44kHz.raw » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698