| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <windows.h> | 5 #include <windows.h> |
| 6 #include <mmsystem.h> | 6 #include <mmsystem.h> |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 | 9 |
| 10 #include "base/base_paths.h" | 10 #include "base/base_paths.h" |
| 11 #include "base/memory/aligned_memory.h" | 11 #include "base/memory/aligned_memory.h" |
| 12 #include "base/message_loop/message_loop.h" |
| 12 #include "base/sync_socket.h" | 13 #include "base/sync_socket.h" |
| 13 #include "base/win/scoped_com_initializer.h" | 14 #include "base/win/scoped_com_initializer.h" |
| 14 #include "base/win/windows_version.h" | 15 #include "base/win/windows_version.h" |
| 15 #include "media/audio/audio_io.h" | 16 #include "media/audio/audio_io.h" |
| 16 #include "media/audio/audio_manager.h" | 17 #include "media/audio/audio_manager.h" |
| 17 #include "media/audio/audio_unittest_util.h" | 18 #include "media/audio/audio_unittest_util.h" |
| 18 #include "media/audio/mock_audio_source_callback.h" | 19 #include "media/audio/mock_audio_source_callback.h" |
| 19 #include "media/audio/simple_sources.h" | 20 #include "media/audio/simple_sources.h" |
| 20 #include "media/base/limits.h" | 21 #include "media/base/limits.h" |
| 21 #include "testing/gmock/include/gmock/gmock.h" | 22 #include "testing/gmock/include/gmock/gmock.h" |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 146 // =========================================================================== | 147 // =========================================================================== |
| 147 // Validation of AudioManager::AUDIO_PCM_LINEAR | 148 // Validation of AudioManager::AUDIO_PCM_LINEAR |
| 148 // | 149 // |
| 149 // NOTE: | 150 // NOTE: |
| 150 // The tests can fail on the build bots when somebody connects to them via | 151 // The tests can fail on the build bots when somebody connects to them via |
| 151 // remote-desktop and the rdp client installs an audio device that fails to open | 152 // remote-desktop and the rdp client installs an audio device that fails to open |
| 152 // at some point, possibly when the connection goes idle. | 153 // at some point, possibly when the connection goes idle. |
| 153 | 154 |
| 154 // Test that can it be created and closed. | 155 // Test that can it be created and closed. |
| 155 TEST(WinAudioTest, PCMWaveStreamGetAndClose) { | 156 TEST(WinAudioTest, PCMWaveStreamGetAndClose) { |
| 156 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 157 base::MessageLoop loop; |
| 158 ScopedAudioManagerPtr audio_man( |
| 159 AudioManager::CreateForTesting(loop.task_runner())); |
| 157 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 160 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 158 | 161 |
| 159 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 162 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 160 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, | 163 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, |
| 161 8000, 16, 256), | 164 8000, 16, 256), |
| 162 std::string()); | 165 std::string()); |
| 163 ASSERT_TRUE(NULL != oas); | 166 ASSERT_TRUE(NULL != oas); |
| 164 oas->Close(); | 167 oas->Close(); |
| 165 } | 168 } |
| 166 | 169 |
| 167 // Test that can it be cannot be created with invalid parameters. | 170 // Test that can it be cannot be created with invalid parameters. |
| 168 TEST(WinAudioTest, SanityOnMakeParams) { | 171 TEST(WinAudioTest, SanityOnMakeParams) { |
| 169 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 172 base::MessageLoop loop; |
| 173 ScopedAudioManagerPtr audio_man( |
| 174 AudioManager::CreateForTesting(loop.task_runner())); |
| 170 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 175 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 171 | 176 |
| 172 AudioParameters::Format fmt = AudioParameters::AUDIO_PCM_LINEAR; | 177 AudioParameters::Format fmt = AudioParameters::AUDIO_PCM_LINEAR; |
| 173 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( | 178 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( |
| 174 AudioParameters(fmt, CHANNEL_LAYOUT_UNSUPPORTED, 8000, 16, 256), | 179 AudioParameters(fmt, CHANNEL_LAYOUT_UNSUPPORTED, 8000, 16, 256), |
| 175 std::string())); | 180 std::string())); |
| 176 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( | 181 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( |
| 177 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 1024 * 1024, 16, 256), | 182 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 1024 * 1024, 16, 256), |
| 178 std::string())); | 183 std::string())); |
| 179 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( | 184 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( |
| (...skipping 12 matching lines...) Expand all Loading... |
| 192 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 8000, 16, 0), | 197 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 8000, 16, 0), |
| 193 std::string())); | 198 std::string())); |
| 194 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( | 199 EXPECT_TRUE(NULL == audio_man->MakeAudioOutputStream( |
| 195 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 8000, 16, | 200 AudioParameters(fmt, CHANNEL_LAYOUT_MONO, 8000, 16, |
| 196 media::limits::kMaxSamplesPerPacket + 1), | 201 media::limits::kMaxSamplesPerPacket + 1), |
| 197 std::string())); | 202 std::string())); |
| 198 } | 203 } |
| 199 | 204 |
| 200 // Test that it can be opened and closed. | 205 // Test that it can be opened and closed. |
| 201 TEST(WinAudioTest, PCMWaveStreamOpenAndClose) { | 206 TEST(WinAudioTest, PCMWaveStreamOpenAndClose) { |
| 202 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 207 base::MessageLoop loop; |
| 208 ScopedAudioManagerPtr audio_man( |
| 209 AudioManager::CreateForTesting(loop.task_runner())); |
| 203 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 210 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 204 | 211 |
| 205 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 212 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 206 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, | 213 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, |
| 207 8000, 16, 256), | 214 8000, 16, 256), |
| 208 std::string()); | 215 std::string()); |
| 209 ASSERT_TRUE(NULL != oas); | 216 ASSERT_TRUE(NULL != oas); |
| 210 EXPECT_TRUE(oas->Open()); | 217 EXPECT_TRUE(oas->Open()); |
| 211 oas->Close(); | 218 oas->Close(); |
| 212 } | 219 } |
| 213 | 220 |
| 214 // Test that it has a maximum packet size. | 221 // Test that it has a maximum packet size. |
| 215 TEST(WinAudioTest, PCMWaveStreamOpenLimit) { | 222 TEST(WinAudioTest, PCMWaveStreamOpenLimit) { |
| 216 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 223 base::MessageLoop loop; |
| 224 ScopedAudioManagerPtr audio_man( |
| 225 AudioManager::CreateForTesting(loop.task_runner())); |
| 217 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 226 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 218 | 227 |
| 219 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 228 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 220 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, | 229 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_STEREO, |
| 221 8000, 16, 1024 * 1024 * 1024), | 230 8000, 16, 1024 * 1024 * 1024), |
| 222 std::string()); | 231 std::string()); |
| 223 EXPECT_TRUE(NULL == oas); | 232 EXPECT_TRUE(NULL == oas); |
| 224 if (oas) | 233 if (oas) |
| 225 oas->Close(); | 234 oas->Close(); |
| 226 } | 235 } |
| 227 | 236 |
| 228 // Test potential deadlock situation if the source is slow or blocks for some | 237 // Test potential deadlock situation if the source is slow or blocks for some |
| 229 // time. The actual EXPECT_GT are mostly meaningless and the real test is that | 238 // time. The actual EXPECT_GT are mostly meaningless and the real test is that |
| 230 // the test completes in reasonable time. | 239 // the test completes in reasonable time. |
| 231 TEST(WinAudioTest, PCMWaveSlowSource) { | 240 TEST(WinAudioTest, PCMWaveSlowSource) { |
| 232 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 241 base::MessageLoop loop; |
| 242 ScopedAudioManagerPtr audio_man( |
| 243 AudioManager::CreateForTesting(loop.task_runner())); |
| 233 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 244 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 234 | 245 |
| 235 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 246 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 236 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, | 247 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, |
| 237 16000, 16, 256), | 248 16000, 16, 256), |
| 238 std::string()); | 249 std::string()); |
| 239 ASSERT_TRUE(NULL != oas); | 250 ASSERT_TRUE(NULL != oas); |
| 240 TestSourceLaggy test_laggy(90); | 251 TestSourceLaggy test_laggy(90); |
| 241 EXPECT_TRUE(oas->Open()); | 252 EXPECT_TRUE(oas->Open()); |
| 242 // The test parameters cause a callback every 32 ms and the source is | 253 // The test parameters cause a callback every 32 ms and the source is |
| 243 // sleeping for 90 ms, so it is guaranteed that we run out of ready buffers. | 254 // sleeping for 90 ms, so it is guaranteed that we run out of ready buffers. |
| 244 oas->Start(&test_laggy); | 255 oas->Start(&test_laggy); |
| 245 ::Sleep(500); | 256 ::Sleep(500); |
| 246 EXPECT_GT(test_laggy.callback_count(), 2); | 257 EXPECT_GT(test_laggy.callback_count(), 2); |
| 247 EXPECT_FALSE(test_laggy.had_error()); | 258 EXPECT_FALSE(test_laggy.had_error()); |
| 248 oas->Stop(); | 259 oas->Stop(); |
| 249 ::Sleep(500); | 260 ::Sleep(500); |
| 250 oas->Close(); | 261 oas->Close(); |
| 251 } | 262 } |
| 252 | 263 |
| 253 // Test another potential deadlock situation if the thread that calls Start() | 264 // Test another potential deadlock situation if the thread that calls Start() |
| 254 // gets paused. This test is best when run over RDP with audio enabled. See | 265 // gets paused. This test is best when run over RDP with audio enabled. See |
| 255 // bug 19276 for more details. | 266 // bug 19276 for more details. |
| 256 TEST(WinAudioTest, PCMWaveStreamPlaySlowLoop) { | 267 TEST(WinAudioTest, PCMWaveStreamPlaySlowLoop) { |
| 257 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 268 base::MessageLoop loop; |
| 269 ScopedAudioManagerPtr audio_man( |
| 270 AudioManager::CreateForTesting(loop.task_runner())); |
| 258 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 271 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 259 | 272 |
| 260 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; | 273 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; |
| 261 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 274 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 262 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, | 275 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, |
| 263 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), | 276 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), |
| 264 std::string()); | 277 std::string()); |
| 265 ASSERT_TRUE(NULL != oas); | 278 ASSERT_TRUE(NULL != oas); |
| 266 | 279 |
| 267 SineWaveAudioSource source(1, 200.0, AudioParameters::kAudioCDSampleRate); | 280 SineWaveAudioSource source(1, 200.0, AudioParameters::kAudioCDSampleRate); |
| 268 | 281 |
| 269 EXPECT_TRUE(oas->Open()); | 282 EXPECT_TRUE(oas->Open()); |
| 270 oas->SetVolume(1.0); | 283 oas->SetVolume(1.0); |
| 271 | 284 |
| 272 for (int ix = 0; ix != 5; ++ix) { | 285 for (int ix = 0; ix != 5; ++ix) { |
| 273 oas->Start(&source); | 286 oas->Start(&source); |
| 274 ::Sleep(10); | 287 ::Sleep(10); |
| 275 oas->Stop(); | 288 oas->Stop(); |
| 276 } | 289 } |
| 277 oas->Close(); | 290 oas->Close(); |
| 278 } | 291 } |
| 279 | 292 |
| 280 | 293 |
| 281 // This test produces actual audio for .5 seconds on the default wave | 294 // This test produces actual audio for .5 seconds on the default wave |
| 282 // device at 44.1K s/sec. Parameters have been chosen carefully so you should | 295 // device at 44.1K s/sec. Parameters have been chosen carefully so you should |
| 283 // not hear pops or noises while the sound is playing. | 296 // not hear pops or noises while the sound is playing. |
| 284 TEST(WinAudioTest, PCMWaveStreamPlay200HzTone44Kss) { | 297 TEST(WinAudioTest, PCMWaveStreamPlay200HzTone44Kss) { |
| 285 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 298 base::MessageLoop loop; |
| 299 ScopedAudioManagerPtr audio_man( |
| 300 AudioManager::CreateForTesting(loop.task_runner())); |
| 286 if (!audio_man->HasAudioOutputDevices()) { | 301 if (!audio_man->HasAudioOutputDevices()) { |
| 287 LOG(WARNING) << "No output device detected."; | 302 LOG(WARNING) << "No output device detected."; |
| 288 return; | 303 return; |
| 289 } | 304 } |
| 290 | 305 |
| 291 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; | 306 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; |
| 292 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 307 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 293 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, | 308 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, |
| 294 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), | 309 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), |
| 295 std::string()); | 310 std::string()); |
| 296 ASSERT_TRUE(NULL != oas); | 311 ASSERT_TRUE(NULL != oas); |
| 297 | 312 |
| 298 SineWaveAudioSource source(1, 200.0, AudioParameters::kAudioCDSampleRate); | 313 SineWaveAudioSource source(1, 200.0, AudioParameters::kAudioCDSampleRate); |
| 299 | 314 |
| 300 EXPECT_TRUE(oas->Open()); | 315 EXPECT_TRUE(oas->Open()); |
| 301 oas->SetVolume(1.0); | 316 oas->SetVolume(1.0); |
| 302 oas->Start(&source); | 317 oas->Start(&source); |
| 303 ::Sleep(500); | 318 ::Sleep(500); |
| 304 oas->Stop(); | 319 oas->Stop(); |
| 305 oas->Close(); | 320 oas->Close(); |
| 306 } | 321 } |
| 307 | 322 |
| 308 // This test produces actual audio for for .5 seconds on the default wave | 323 // This test produces actual audio for for .5 seconds on the default wave |
| 309 // device at 22K s/sec. Parameters have been chosen carefully so you should | 324 // device at 22K s/sec. Parameters have been chosen carefully so you should |
| 310 // not hear pops or noises while the sound is playing. The audio also should | 325 // not hear pops or noises while the sound is playing. The audio also should |
| 311 // sound with a lower volume than PCMWaveStreamPlay200HzTone44Kss. | 326 // sound with a lower volume than PCMWaveStreamPlay200HzTone44Kss. |
| 312 TEST(WinAudioTest, PCMWaveStreamPlay200HzTone22Kss) { | 327 TEST(WinAudioTest, PCMWaveStreamPlay200HzTone22Kss) { |
| 313 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 328 base::MessageLoop loop; |
| 329 ScopedAudioManagerPtr audio_man( |
| 330 AudioManager::CreateForTesting(loop.task_runner())); |
| 314 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 331 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 315 | 332 |
| 316 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 20; | 333 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 20; |
| 317 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 334 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 318 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, | 335 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, |
| 319 AudioParameters::kAudioCDSampleRate / 2, 16, | 336 AudioParameters::kAudioCDSampleRate / 2, 16, |
| 320 samples_100_ms), | 337 samples_100_ms), |
| 321 std::string()); | 338 std::string()); |
| 322 ASSERT_TRUE(NULL != oas); | 339 ASSERT_TRUE(NULL != oas); |
| 323 | 340 |
| (...skipping 11 matching lines...) Expand all Loading... |
| 335 EXPECT_LT(volume, 0.51); | 352 EXPECT_LT(volume, 0.51); |
| 336 EXPECT_GT(volume, 0.49); | 353 EXPECT_GT(volume, 0.49); |
| 337 oas->Stop(); | 354 oas->Stop(); |
| 338 oas->Close(); | 355 oas->Close(); |
| 339 } | 356 } |
| 340 | 357 |
| 341 // Uses a restricted source to play ~2 seconds of audio for about 5 seconds. We | 358 // Uses a restricted source to play ~2 seconds of audio for about 5 seconds. We |
| 342 // try hard to generate situation where the two threads are accessing the | 359 // try hard to generate situation where the two threads are accessing the |
| 343 // object roughly at the same time. | 360 // object roughly at the same time. |
| 344 TEST(WinAudioTest, PushSourceFile16KHz) { | 361 TEST(WinAudioTest, PushSourceFile16KHz) { |
| 345 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 362 base::MessageLoop loop; |
| 363 ScopedAudioManagerPtr audio_man( |
| 364 AudioManager::CreateForTesting(loop.task_runner())); |
| 346 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 365 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 347 | 366 |
| 348 static const int kSampleRate = 16000; | 367 static const int kSampleRate = 16000; |
| 349 SineWaveAudioSource source(1, 200.0, kSampleRate); | 368 SineWaveAudioSource source(1, 200.0, kSampleRate); |
| 350 // Compute buffer size for 100ms of audio. | 369 // Compute buffer size for 100ms of audio. |
| 351 const uint32_t kSamples100ms = (kSampleRate / 1000) * 100; | 370 const uint32_t kSamples100ms = (kSampleRate / 1000) * 100; |
| 352 // Restrict SineWaveAudioSource to 100ms of samples. | 371 // Restrict SineWaveAudioSource to 100ms of samples. |
| 353 source.CapSamples(kSamples100ms); | 372 source.CapSamples(kSamples100ms); |
| 354 | 373 |
| 355 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 374 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| (...skipping 19 matching lines...) Expand all Loading... |
| 375 ::Sleep(500); | 394 ::Sleep(500); |
| 376 | 395 |
| 377 oas->Stop(); | 396 oas->Stop(); |
| 378 oas->Close(); | 397 oas->Close(); |
| 379 } | 398 } |
| 380 | 399 |
| 381 // This test is to make sure an AudioOutputStream can be started after it was | 400 // This test is to make sure an AudioOutputStream can be started after it was |
| 382 // stopped. You will here two .5 seconds wave signal separated by 0.5 seconds | 401 // stopped. You will here two .5 seconds wave signal separated by 0.5 seconds |
| 383 // of silence. | 402 // of silence. |
| 384 TEST(WinAudioTest, PCMWaveStreamPlayTwice200HzTone44Kss) { | 403 TEST(WinAudioTest, PCMWaveStreamPlayTwice200HzTone44Kss) { |
| 385 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 404 base::MessageLoop loop; |
| 405 ScopedAudioManagerPtr audio_man( |
| 406 AudioManager::CreateForTesting(loop.task_runner())); |
| 386 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 407 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 387 | 408 |
| 388 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; | 409 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; |
| 389 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 410 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 390 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, | 411 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, |
| 391 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), | 412 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), |
| 392 std::string()); | 413 std::string()); |
| 393 ASSERT_TRUE(NULL != oas); | 414 ASSERT_TRUE(NULL != oas); |
| 394 | 415 |
| 395 SineWaveAudioSource source(1, 200.0, AudioParameters::kAudioCDSampleRate); | 416 SineWaveAudioSource source(1, 200.0, AudioParameters::kAudioCDSampleRate); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 409 ::Sleep(500); | 430 ::Sleep(500); |
| 410 oas->Stop(); | 431 oas->Stop(); |
| 411 | 432 |
| 412 oas->Close(); | 433 oas->Close(); |
| 413 } | 434 } |
| 414 | 435 |
| 415 // With the low latency mode, WASAPI is utilized by default for Vista and | 436 // With the low latency mode, WASAPI is utilized by default for Vista and |
| 416 // higher and Wave is used for XP and lower. It is possible to utilize a | 437 // higher and Wave is used for XP and lower. It is possible to utilize a |
| 417 // smaller buffer size for WASAPI than for Wave. | 438 // smaller buffer size for WASAPI than for Wave. |
| 418 TEST(WinAudioTest, PCMWaveStreamPlay200HzToneLowLatency) { | 439 TEST(WinAudioTest, PCMWaveStreamPlay200HzToneLowLatency) { |
| 419 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 440 base::MessageLoop loop; |
| 441 ScopedAudioManagerPtr audio_man( |
| 442 AudioManager::CreateForTesting(loop.task_runner())); |
| 420 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 443 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 421 | 444 |
| 422 // Use 10 ms buffer size for WASAPI and 50 ms buffer size for Wave. | 445 // Use 10 ms buffer size for WASAPI and 50 ms buffer size for Wave. |
| 423 // Take the existing native sample rate into account. | 446 // Take the existing native sample rate into account. |
| 424 const AudioParameters params = audio_man->GetDefaultOutputStreamParameters(); | 447 const AudioParameters params = audio_man->GetDefaultOutputStreamParameters(); |
| 425 int sample_rate = params.sample_rate(); | 448 int sample_rate = params.sample_rate(); |
| 426 uint32_t samples_10_ms = sample_rate / 100; | 449 uint32_t samples_10_ms = sample_rate / 100; |
| 427 int n = 1; | 450 int n = 1; |
| 428 (base::win::GetVersion() <= base::win::VERSION_XP) ? n = 5 : n = 1; | 451 (base::win::GetVersion() <= base::win::VERSION_XP) ? n = 5 : n = 1; |
| 429 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 452 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| (...skipping 17 matching lines...) Expand all Loading... |
| 447 | 470 |
| 448 // Play the wave for .8 seconds. | 471 // Play the wave for .8 seconds. |
| 449 oas->Start(&source); | 472 oas->Start(&source); |
| 450 ::Sleep(800); | 473 ::Sleep(800); |
| 451 oas->Stop(); | 474 oas->Stop(); |
| 452 oas->Close(); | 475 oas->Close(); |
| 453 } | 476 } |
| 454 | 477 |
| 455 // Check that the pending bytes value is correct what the stream starts. | 478 // Check that the pending bytes value is correct what the stream starts. |
| 456 TEST(WinAudioTest, PCMWaveStreamPendingBytes) { | 479 TEST(WinAudioTest, PCMWaveStreamPendingBytes) { |
| 457 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 480 base::MessageLoop loop; |
| 481 ScopedAudioManagerPtr audio_man( |
| 482 AudioManager::CreateForTesting(loop.task_runner())); |
| 458 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 483 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 459 | 484 |
| 460 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; | 485 uint32_t samples_100_ms = AudioParameters::kAudioCDSampleRate / 10; |
| 461 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( | 486 AudioOutputStream* oas = audio_man->MakeAudioOutputStream( |
| 462 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, | 487 AudioParameters(AudioParameters::AUDIO_PCM_LINEAR, CHANNEL_LAYOUT_MONO, |
| 463 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), | 488 AudioParameters::kAudioCDSampleRate, 16, samples_100_ms), |
| 464 std::string()); | 489 std::string()); |
| 465 ASSERT_TRUE(NULL != oas); | 490 ASSERT_TRUE(NULL != oas); |
| 466 | 491 |
| 467 NiceMock<MockAudioSourceCallback> source; | 492 NiceMock<MockAudioSourceCallback> source; |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 579 | 604 |
| 580 // Test the basic operation of AudioOutputStream used with a SyncSocket. | 605 // Test the basic operation of AudioOutputStream used with a SyncSocket. |
| 581 // The emphasis is to verify that it is possible to feed data to the audio | 606 // The emphasis is to verify that it is possible to feed data to the audio |
| 582 // layer using a source based on SyncSocket. In a real situation we would | 607 // layer using a source based on SyncSocket. In a real situation we would |
| 583 // go for the low-latency version in combination with SyncSocket, but to keep | 608 // go for the low-latency version in combination with SyncSocket, but to keep |
| 584 // the test more simple, AUDIO_PCM_LINEAR is utilized instead. The main | 609 // the test more simple, AUDIO_PCM_LINEAR is utilized instead. The main |
| 585 // principle of the test still remains and we avoid the additional complexity | 610 // principle of the test still remains and we avoid the additional complexity |
| 586 // related to the two different audio-layers for AUDIO_PCM_LOW_LATENCY. | 611 // related to the two different audio-layers for AUDIO_PCM_LOW_LATENCY. |
| 587 // In this test you should hear a continuous 200Hz tone for 2 seconds. | 612 // In this test you should hear a continuous 200Hz tone for 2 seconds. |
| 588 TEST(WinAudioTest, SyncSocketBasic) { | 613 TEST(WinAudioTest, SyncSocketBasic) { |
| 589 scoped_ptr<AudioManager> audio_man(AudioManager::CreateForTesting()); | 614 base::MessageLoop loop; |
| 615 ScopedAudioManagerPtr audio_man( |
| 616 AudioManager::CreateForTesting(loop.task_runner())); |
| 590 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); | 617 ABORT_AUDIO_TEST_IF_NOT(audio_man->HasAudioOutputDevices()); |
| 591 | 618 |
| 592 static const int sample_rate = AudioParameters::kAudioCDSampleRate; | 619 static const int sample_rate = AudioParameters::kAudioCDSampleRate; |
| 593 static const uint32_t kSamples20ms = sample_rate / 50; | 620 static const uint32_t kSamples20ms = sample_rate / 50; |
| 594 AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, | 621 AudioParameters params(AudioParameters::AUDIO_PCM_LINEAR, |
| 595 CHANNEL_LAYOUT_MONO, sample_rate, 16, kSamples20ms); | 622 CHANNEL_LAYOUT_MONO, sample_rate, 16, kSamples20ms); |
| 596 | 623 |
| 597 | 624 |
| 598 AudioOutputStream* oas = audio_man->MakeAudioOutputStream(params, | 625 AudioOutputStream* oas = audio_man->MakeAudioOutputStream(params, |
| 599 std::string()); | 626 std::string()); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 620 oas->Start(&source); | 647 oas->Start(&source); |
| 621 | 648 |
| 622 ::WaitForSingleObject(thread, INFINITE); | 649 ::WaitForSingleObject(thread, INFINITE); |
| 623 ::CloseHandle(thread); | 650 ::CloseHandle(thread); |
| 624 | 651 |
| 625 oas->Stop(); | 652 oas->Stop(); |
| 626 oas->Close(); | 653 oas->Close(); |
| 627 } | 654 } |
| 628 | 655 |
| 629 } // namespace media | 656 } // namespace media |
| OLD | NEW |