Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 "base/message_loop.h" | 5 #include "base/message_loop.h" |
| 6 #include "base/string_util.h" | 6 #include "base/string_util.h" |
| 7 #include "media/audio/linux/alsa_output.h" | 7 #include "media/audio/linux/alsa_output.h" |
| 8 #include "media/audio/linux/alsa_wrapper.h" | 8 #include "media/audio/linux/alsa_wrapper.h" |
| 9 #include "media/audio/linux/audio_manager_linux.h" | 9 #include "media/audio/linux/audio_manager_linux.h" |
| 10 #include "media/base/data_buffer.h" | 10 #include "media/base/data_buffer.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 63 MOCK_METHOD1(PcmStart, int(snd_pcm_t* handle)); | 63 MOCK_METHOD1(PcmStart, int(snd_pcm_t* handle)); |
| 64 | 64 |
| 65 MOCK_METHOD1(StrError, const char*(int errnum)); | 65 MOCK_METHOD1(StrError, const char*(int errnum)); |
| 66 }; | 66 }; |
| 67 | 67 |
| 68 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { | 68 class MockAudioSourceCallback : public AudioOutputStream::AudioSourceCallback { |
| 69 public: | 69 public: |
| 70 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, | 70 MOCK_METHOD4(OnMoreData, uint32(AudioOutputStream* stream, |
| 71 uint8* dest, uint32 max_size, | 71 uint8* dest, uint32 max_size, |
| 72 AudioBuffersState buffers_state)); | 72 AudioBuffersState buffers_state)); |
| 73 MOCK_METHOD1(OnClose, void(AudioOutputStream* stream)); | |
| 74 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); | 73 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); |
| 75 }; | 74 }; |
| 76 | 75 |
| 77 class MockAudioManagerLinux : public AudioManagerLinux { | 76 class MockAudioManagerLinux : public AudioManagerLinux { |
| 78 public: | 77 public: |
| 79 MOCK_METHOD0(Init, void()); | 78 MOCK_METHOD0(Init, void()); |
| 80 MOCK_METHOD0(HasAudioOutputDevices, bool()); | 79 MOCK_METHOD0(HasAudioOutputDevices, bool()); |
| 81 MOCK_METHOD0(HasAudioInputDevices, bool()); | 80 MOCK_METHOD0(HasAudioInputDevices, bool()); |
| 82 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*( | 81 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*( |
| 83 AudioParameters params)); | 82 AudioParameters params)); |
| 84 MOCK_METHOD5(MakeAudioInputStream, AudioInputStream*( | 83 MOCK_METHOD5(MakeAudioInputStream, AudioInputStream*( |
| 85 AudioParameters::Format format, | 84 AudioParameters::Format format, |
| 86 int channels, | 85 int channels, |
| 87 int sample_rate, | 86 int sample_rate, |
| 88 char bits_per_sample, | 87 char bits_per_sample, |
| 89 uint32 samples_per_packet)); | 88 uint32 samples_per_packet)); |
| 90 MOCK_METHOD0(MuteAll, void()); | 89 MOCK_METHOD0(MuteAll, void()); |
| 91 MOCK_METHOD0(UnMuteAll, void()); | 90 MOCK_METHOD0(UnMuteAll, void()); |
| 92 | 91 |
| 93 MOCK_METHOD1(ReleaseOutputStream, void(AlsaPcmOutputStream* stream)); | 92 MOCK_METHOD1(ReleaseOutputStream, void(AlsaPcmOutputStream* stream)); |
| 94 }; | 93 }; |
| 95 | 94 |
| 96 class AlsaPcmOutputStreamTest : public testing::Test { | 95 class AlsaPcmOutputStreamTest : public testing::Test { |
| 97 protected: | 96 protected: |
| 98 AlsaPcmOutputStreamTest() { | 97 AlsaPcmOutputStreamTest() { |
| 99 test_stream_ = CreateStreamWithChannels(kTestChannels); | 98 test_stream_ = CreateStream(kTestChannels); |
| 100 } | 99 } |
| 101 | 100 |
| 102 virtual ~AlsaPcmOutputStreamTest() { | 101 virtual ~AlsaPcmOutputStreamTest() { |
| 103 test_stream_ = NULL; | 102 test_stream_ = NULL; |
| 104 } | 103 } |
| 105 | 104 |
| 106 AlsaPcmOutputStream* CreateStreamWithChannels(int channels) { | 105 AlsaPcmOutputStream* CreateStream(int channels) { |
| 106 return CreateStream( | |
| 107 channels, kTestFramesPerPacket); | |
|
scherkus (not reviewing)
2010/11/09 02:28:31
nit: can fit on single line
Sergey Ulanov
2010/11/09 22:29:58
Done.
| |
| 108 } | |
| 109 | |
| 110 AlsaPcmOutputStream* CreateStream(int channels, | |
|
scherkus (not reviewing)
2010/11/09 02:28:31
nit: can fit on single line
Sergey Ulanov
2010/11/09 22:29:58
Done.
| |
| 111 uint32 samples_per_packet) { | |
| 107 AudioParameters params(kTestFormat, channels, kTestSampleRate, | 112 AudioParameters params(kTestFormat, channels, kTestSampleRate, |
| 108 kTestBitsPerSample); | 113 kTestBitsPerSample, samples_per_packet); |
| 109 return new AlsaPcmOutputStream(kTestDeviceName, | 114 return new AlsaPcmOutputStream(kTestDeviceName, |
| 110 params, | 115 params, |
| 111 &mock_alsa_wrapper_, | 116 &mock_alsa_wrapper_, |
| 112 &mock_manager_, | 117 &mock_manager_, |
| 113 &message_loop_); | 118 &message_loop_); |
| 114 } | 119 } |
| 115 | 120 |
| 116 // Helper function to malloc the string returned by DeviceNameHint for NAME. | 121 // Helper function to malloc the string returned by DeviceNameHint for NAME. |
| 117 static char* EchoHint(const void* name, Unused) { | 122 static char* EchoHint(const void* name, Unused) { |
| 118 return strdup(static_cast<const char*>(name)); | 123 return strdup(static_cast<const char*>(name)); |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 190 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; | 195 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; |
| 191 void* AlsaPcmOutputStreamTest::kFakeHints[] = { | 196 void* AlsaPcmOutputStreamTest::kFakeHints[] = { |
| 192 kSurround40, kSurround41, kSurround50, kSurround51, | 197 kSurround40, kSurround41, kSurround50, kSurround51, |
| 193 kSurround70, kSurround71, NULL }; | 198 kSurround70, kSurround71, NULL }; |
| 194 | 199 |
| 195 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { | 200 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { |
| 196 EXPECT_EQ(AlsaPcmOutputStream::kCreated, | 201 EXPECT_EQ(AlsaPcmOutputStream::kCreated, |
| 197 test_stream_->shared_data_.state()); | 202 test_stream_->shared_data_.state()); |
| 198 | 203 |
| 199 // Should support mono. | 204 // Should support mono. |
| 200 test_stream_ = CreateStreamWithChannels(1); | 205 test_stream_ = CreateStream(1); |
| 201 EXPECT_EQ(AlsaPcmOutputStream::kCreated, | 206 EXPECT_EQ(AlsaPcmOutputStream::kCreated, |
| 202 test_stream_->shared_data_.state()); | 207 test_stream_->shared_data_.state()); |
| 203 | 208 |
| 204 // Should support multi-channel. | 209 // Should support multi-channel. |
| 205 test_stream_ = CreateStreamWithChannels(3); | 210 test_stream_ = CreateStream(3); |
| 206 EXPECT_EQ(AlsaPcmOutputStream::kCreated, | 211 EXPECT_EQ(AlsaPcmOutputStream::kCreated, |
| 207 test_stream_->shared_data_.state()); | 212 test_stream_->shared_data_.state()); |
| 208 | 213 |
| 209 // Bad bits per sample. | 214 // Bad bits per sample. |
| 210 AudioParameters bad_bps_params(kTestFormat, kTestChannels, | 215 AudioParameters bad_bps_params(kTestFormat, kTestChannels, |
| 211 kTestSampleRate, kTestBitsPerSample - 1); | 216 kTestSampleRate, kTestBitsPerSample - 1, |
| 217 kTestFramesPerPacket); | |
| 212 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, | 218 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, |
| 213 bad_bps_params, | 219 bad_bps_params, |
| 214 &mock_alsa_wrapper_, | 220 &mock_alsa_wrapper_, |
| 215 &mock_manager_, | 221 &mock_manager_, |
| 216 &message_loop_); | 222 &message_loop_); |
| 217 EXPECT_EQ(AlsaPcmOutputStream::kInError, | 223 EXPECT_EQ(AlsaPcmOutputStream::kInError, |
| 218 test_stream_->shared_data_.state()); | 224 test_stream_->shared_data_.state()); |
| 219 | 225 |
| 220 // Bad format. | 226 // Bad format. |
| 221 AudioParameters bad_format_params( | 227 AudioParameters bad_format_params( |
| 222 AudioParameters::AUDIO_LAST_FORMAT, kTestChannels, | 228 AudioParameters::AUDIO_LAST_FORMAT, kTestChannels, |
| 223 kTestSampleRate, kTestBitsPerSample); | 229 kTestSampleRate, kTestBitsPerSample, kTestFramesPerPacket); |
| 224 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, | 230 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, |
| 225 bad_format_params, | 231 bad_format_params, |
| 226 &mock_alsa_wrapper_, | 232 &mock_alsa_wrapper_, |
| 227 &mock_manager_, | 233 &mock_manager_, |
| 228 &message_loop_); | 234 &message_loop_); |
| 229 EXPECT_EQ(AlsaPcmOutputStream::kInError, | 235 EXPECT_EQ(AlsaPcmOutputStream::kInError, |
| 230 test_stream_->shared_data_.state()); | 236 test_stream_->shared_data_.state()); |
| 231 } | 237 } |
| 232 | 238 |
| 233 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { | 239 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { |
| 234 const double kMicrosPerFrame = | 240 const double kMicrosPerFrame = |
| 235 static_cast<double>(1000000) / kTestSampleRate; | 241 static_cast<double>(1000000) / kTestSampleRate; |
| 236 const double kPacketFramesInMinLatency = | 242 const double kPacketFramesInMinLatency = |
| 237 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; | 243 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; |
| 238 const int kMinLatencyPacketSize = | |
| 239 static_cast<int>(kPacketFramesInMinLatency * kTestBytesPerFrame); | |
| 240 | 244 |
| 241 // Test that packets which would cause a latency under less than | 245 // Test that packets which would cause a latency under less than |
| 242 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to | 246 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to |
| 243 // AlsaPcmOutputStream::kMinLatencyMicros, | 247 // AlsaPcmOutputStream::kMinLatencyMicros, |
| 244 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 248 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 245 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 249 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 246 Return(0))); | 250 Return(0))); |
| 247 EXPECT_CALL(mock_alsa_wrapper_, | 251 EXPECT_CALL(mock_alsa_wrapper_, |
| 248 PcmSetParams(_, _, _, _, _, _, | 252 PcmSetParams(_, _, _, _, _, _, |
| 249 AlsaPcmOutputStream::kMinLatencyMicros)) | 253 AlsaPcmOutputStream::kMinLatencyMicros)) |
| 250 .WillOnce(Return(0)); | 254 .WillOnce(Return(0)); |
| 251 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 255 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
| 252 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 256 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
| 253 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 257 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
| 254 Return(0))); | 258 Return(0))); |
| 255 | 259 |
| 256 ASSERT_TRUE(test_stream_->Open(kMinLatencyPacketSize)); | 260 test_stream_ = CreateStream(kTestChannels, (int)kPacketFramesInMinLatency); |
|
scherkus (not reviewing)
2010/11/09 02:28:31
no c-style casts please (or change type of constan
Sergey Ulanov
2010/11/09 22:29:58
Done.
| |
| 261 ASSERT_TRUE(test_stream_->Open()); | |
| 257 message_loop_.RunAllPending(); | 262 message_loop_.RunAllPending(); |
| 258 | 263 |
| 259 // Now close it and test that everything was released. | 264 // Now close it and test that everything was released. |
| 260 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); | 265 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); |
| 261 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 266 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 262 .WillOnce(Return(kTestDeviceName)); | 267 .WillOnce(Return(kTestDeviceName)); |
| 263 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); | 268 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); |
| 264 test_stream_->Close(); | 269 test_stream_->Close(); |
| 265 message_loop_.RunAllPending(); | 270 message_loop_.RunAllPending(); |
| 266 | 271 |
| 267 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 272 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
| 268 Mock::VerifyAndClear(&mock_manager_); | 273 Mock::VerifyAndClear(&mock_manager_); |
| 269 | 274 |
| 270 // Test that having more packets ends up with a latency based on packet size. | 275 // Test that having more packets ends up with a latency based on packet size. |
| 271 const int kOverMinLatencyPacketSize = | 276 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; |
| 272 (kPacketFramesInMinLatency + 1) * kTestBytesPerFrame; | 277 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( |
| 273 int64 expected_micros = 2 * | 278 kOverMinLatencyPacketSize, kTestSampleRate); |
| 274 AlsaPcmOutputStream::FramesToMicros( | |
| 275 kOverMinLatencyPacketSize / kTestBytesPerFrame, | |
| 276 kTestSampleRate); | |
| 277 | |
| 278 // Recreate the stream to reset the state. | |
| 279 test_stream_ = CreateStreamWithChannels(kTestChannels); | |
| 280 | 279 |
| 281 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 280 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 282 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 281 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
| 283 EXPECT_CALL(mock_alsa_wrapper_, | 282 EXPECT_CALL(mock_alsa_wrapper_, |
| 284 PcmSetParams(_, _, _, _, _, _, expected_micros)) | 283 PcmSetParams(_, _, _, _, _, _, expected_micros)) |
| 285 .WillOnce(Return(0)); | 284 .WillOnce(Return(0)); |
| 286 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 285 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
| 287 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 286 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
| 288 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 287 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
| 289 Return(0))); | 288 Return(0))); |
| 290 | 289 |
| 291 ASSERT_TRUE(test_stream_->Open(kOverMinLatencyPacketSize)); | 290 test_stream_ = CreateStream(kTestChannels, kOverMinLatencyPacketSize); |
| 291 ASSERT_TRUE(test_stream_->Open()); | |
| 292 message_loop_.RunAllPending(); | 292 message_loop_.RunAllPending(); |
| 293 | 293 |
| 294 // Now close it and test that everything was released. | 294 // Now close it and test that everything was released. |
| 295 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 295 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 296 .WillOnce(Return(0)); | 296 .WillOnce(Return(0)); |
| 297 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 297 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 298 .WillOnce(Return(kTestDeviceName)); | 298 .WillOnce(Return(kTestDeviceName)); |
| 299 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); | 299 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); |
| 300 test_stream_->Close(); | 300 test_stream_->Close(); |
| 301 message_loop_.RunAllPending(); | 301 message_loop_.RunAllPending(); |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 325 kTestSampleRate, | 325 kTestSampleRate, |
| 326 1, | 326 1, |
| 327 expected_micros)) | 327 expected_micros)) |
| 328 .WillOnce(Return(0)); | 328 .WillOnce(Return(0)); |
| 329 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) | 329 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(kFakeHandle, _, _)) |
| 330 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 330 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
| 331 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 331 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
| 332 Return(0))); | 332 Return(0))); |
| 333 | 333 |
| 334 // Open the stream. | 334 // Open the stream. |
| 335 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 335 ASSERT_TRUE(test_stream_->Open()); |
| 336 message_loop_.RunAllPending(); | 336 message_loop_.RunAllPending(); |
| 337 | 337 |
| 338 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 338 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 339 test_stream_->shared_data_.state()); | 339 test_stream_->shared_data_.state()); |
| 340 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); | 340 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); |
| 341 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); | 341 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); |
| 342 EXPECT_TRUE(test_stream_->buffer_.get()); | 342 EXPECT_TRUE(test_stream_->buffer_.get()); |
| 343 EXPECT_FALSE(test_stream_->stop_stream_); | 343 EXPECT_FALSE(test_stream_->stop_stream_); |
| 344 | 344 |
| 345 // Now close it and test that everything was released. | 345 // Now close it and test that everything was released. |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 356 EXPECT_TRUE(test_stream_->stop_stream_); | 356 EXPECT_TRUE(test_stream_->stop_stream_); |
| 357 } | 357 } |
| 358 | 358 |
| 359 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { | 359 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { |
| 360 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 360 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 361 .WillOnce(Return(kTestFailedErrno)); | 361 .WillOnce(Return(kTestFailedErrno)); |
| 362 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 362 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 363 .WillOnce(Return(kDummyMessage)); | 363 .WillOnce(Return(kDummyMessage)); |
| 364 | 364 |
| 365 // Open still succeeds since PcmOpen is delegated to another thread. | 365 // Open still succeeds since PcmOpen is delegated to another thread. |
| 366 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 366 ASSERT_TRUE(test_stream_->Open()); |
| 367 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, | 367 ASSERT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 368 test_stream_->shared_data_.state()); | 368 test_stream_->shared_data_.state()); |
| 369 ASSERT_FALSE(test_stream_->stop_stream_); | 369 ASSERT_FALSE(test_stream_->stop_stream_); |
| 370 message_loop_.RunAllPending(); | 370 message_loop_.RunAllPending(); |
| 371 | 371 |
| 372 // Ensure internal state is set for a no-op stream if PcmOpen() failes. | 372 // Ensure internal state is set for a no-op stream if PcmOpen() failes. |
| 373 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 373 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 374 test_stream_->shared_data_.state()); | 374 test_stream_->shared_data_.state()); |
| 375 EXPECT_TRUE(test_stream_->stop_stream_); | 375 EXPECT_TRUE(test_stream_->stop_stream_); |
| 376 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 376 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 390 .WillOnce(Return(kTestFailedErrno)); | 390 .WillOnce(Return(kTestFailedErrno)); |
| 391 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 391 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 392 .WillOnce(Return(0)); | 392 .WillOnce(Return(0)); |
| 393 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 393 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 394 .WillOnce(Return(kTestDeviceName)); | 394 .WillOnce(Return(kTestDeviceName)); |
| 395 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 395 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 396 .WillOnce(Return(kDummyMessage)); | 396 .WillOnce(Return(kDummyMessage)); |
| 397 | 397 |
| 398 // If open fails, the stream stays in kCreated because it has effectively had | 398 // If open fails, the stream stays in kCreated because it has effectively had |
| 399 // no changes. | 399 // no changes. |
| 400 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 400 ASSERT_TRUE(test_stream_->Open()); |
| 401 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 401 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 402 test_stream_->shared_data_.state()); | 402 test_stream_->shared_data_.state()); |
| 403 ASSERT_FALSE(test_stream_->stop_stream_); | 403 ASSERT_FALSE(test_stream_->stop_stream_); |
| 404 message_loop_.RunAllPending(); | 404 message_loop_.RunAllPending(); |
| 405 | 405 |
| 406 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. | 406 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. |
| 407 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, | 407 EXPECT_EQ(AlsaPcmOutputStream::kIsOpened, |
| 408 test_stream_->shared_data_.state()); | 408 test_stream_->shared_data_.state()); |
| 409 EXPECT_TRUE(test_stream_->stop_stream_); | 409 EXPECT_TRUE(test_stream_->stop_stream_); |
| 410 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 410 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| (...skipping 13 matching lines...) Expand all Loading... | |
| 424 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 424 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 425 Return(0))); | 425 Return(0))); |
| 426 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 426 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
| 427 .WillOnce(Return(0)); | 427 .WillOnce(Return(0)); |
| 428 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 428 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
| 429 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 429 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
| 430 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 430 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
| 431 Return(0))); | 431 Return(0))); |
| 432 | 432 |
| 433 // Open the stream. | 433 // Open the stream. |
| 434 ASSERT_TRUE(test_stream_->Open(kTestPacketSize)); | 434 ASSERT_TRUE(test_stream_->Open()); |
| 435 message_loop_.RunAllPending(); | 435 message_loop_.RunAllPending(); |
| 436 | 436 |
| 437 // Expect Device setup. | 437 // Expect Device setup. |
| 438 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) | 438 EXPECT_CALL(mock_alsa_wrapper_, PcmDrop(kFakeHandle)) |
| 439 .WillOnce(Return(0)); | 439 .WillOnce(Return(0)); |
| 440 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) | 440 EXPECT_CALL(mock_alsa_wrapper_, PcmPrepare(kFakeHandle)) |
| 441 .WillOnce(Return(0)); | 441 .WillOnce(Return(0)); |
| 442 | 442 |
| 443 // Expect the pre-roll. | 443 // Expect the pre-roll. |
| 444 MockAudioSourceCallback mock_callback; | 444 MockAudioSourceCallback mock_callback; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 462 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. | 462 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. |
| 463 .WillOnce(Return(kTestFramesPerPacket)) | 463 .WillOnce(Return(kTestFramesPerPacket)) |
| 464 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, | 464 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, |
| 465 &MessageLoop::QuitNow), | 465 &MessageLoop::QuitNow), |
| 466 Return(0))); // Buffer is full. | 466 Return(0))); // Buffer is full. |
| 467 | 467 |
| 468 test_stream_->Start(&mock_callback); | 468 test_stream_->Start(&mock_callback); |
| 469 message_loop_.RunAllPending(); | 469 message_loop_.RunAllPending(); |
| 470 | 470 |
| 471 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); | 471 EXPECT_CALL(mock_manager_, ReleaseOutputStream(test_stream_.get())); |
| 472 EXPECT_CALL(mock_callback, OnClose(test_stream_.get())); | |
| 473 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 472 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 474 .WillOnce(Return(0)); | 473 .WillOnce(Return(0)); |
| 475 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 474 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 476 .WillOnce(Return(kTestDeviceName)); | 475 .WillOnce(Return(kTestDeviceName)); |
| 477 test_stream_->Close(); | 476 test_stream_->Close(); |
| 478 message_loop_.RunAllPending(); | 477 message_loop_.RunAllPending(); |
| 479 } | 478 } |
| 480 | 479 |
| 481 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { | 480 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { |
| 482 InitBuffer(); | 481 InitBuffer(); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 677 .WillOnce(Return(0)); | 676 .WillOnce(Return(0)); |
| 678 | 677 |
| 679 // The parameters are specified by ALSA documentation, and are in constants | 678 // The parameters are specified by ALSA documentation, and are in constants |
| 680 // in the implementation files. | 679 // in the implementation files. |
| 681 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) | 680 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) |
| 682 .WillRepeatedly(Invoke(OutputHint)); | 681 .WillRepeatedly(Invoke(OutputHint)); |
| 683 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) | 682 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) |
| 684 .WillRepeatedly(Invoke(EchoHint)); | 683 .WillRepeatedly(Invoke(EchoHint)); |
| 685 | 684 |
| 686 | 685 |
| 687 test_stream_ = CreateStreamWithChannels(i); | 686 test_stream_ = CreateStream(i); |
| 688 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); | 687 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); |
| 689 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); | 688 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); |
| 690 | 689 |
| 691 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); | 690 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); |
| 692 Mock::VerifyAndClearExpectations(&mock_manager_); | 691 Mock::VerifyAndClearExpectations(&mock_manager_); |
| 693 } | 692 } |
| 694 } | 693 } |
| 695 | 694 |
| 696 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { | 695 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { |
| 697 using std::string; | 696 using std::string; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 727 InSequence s; | 726 InSequence s; |
| 728 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) | 727 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) |
| 729 .WillOnce(Return(kTestFailedErrno)); | 728 .WillOnce(Return(kTestFailedErrno)); |
| 730 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) | 729 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) |
| 731 .WillOnce(Return(kTestFailedErrno)); | 730 .WillOnce(Return(kTestFailedErrno)); |
| 732 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) | 731 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) |
| 733 .WillOnce(Return(kTestFailedErrno)); | 732 .WillOnce(Return(kTestFailedErrno)); |
| 734 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) | 733 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) |
| 735 .WillOnce(Return(kTestFailedErrno)); | 734 .WillOnce(Return(kTestFailedErrno)); |
| 736 | 735 |
| 737 test_stream_ = CreateStreamWithChannels(5); | 736 test_stream_ = CreateStream(5); |
| 738 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); | 737 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); |
| 739 } | 738 } |
| 740 | 739 |
| 741 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { | 740 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { |
| 742 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to | 741 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to |
| 743 // enumerate devices. | 742 // enumerate devices. |
| 744 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) | 743 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) |
| 745 .WillRepeatedly(Return(kTestFailedErrno)); | 744 .WillRepeatedly(Return(kTestFailedErrno)); |
| 746 EXPECT_CALL(mock_alsa_wrapper_, | 745 EXPECT_CALL(mock_alsa_wrapper_, |
| 747 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) | 746 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) |
| 748 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 747 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
| 749 EXPECT_CALL(mock_alsa_wrapper_, | 748 EXPECT_CALL(mock_alsa_wrapper_, |
| 750 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) | 749 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) |
| 751 .WillOnce(Return(0)); | 750 .WillOnce(Return(0)); |
| 752 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 751 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 753 .WillOnce(Return(kDummyMessage)); | 752 .WillOnce(Return(kDummyMessage)); |
| 754 | 753 |
| 755 test_stream_ = CreateStreamWithChannels(5); | 754 test_stream_ = CreateStream(5); |
| 756 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); | 755 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); |
| 757 EXPECT_TRUE(test_stream_->should_downmix_); | 756 EXPECT_TRUE(test_stream_->should_downmix_); |
| 758 } | 757 } |
| 759 | 758 |
| 760 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { | 759 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { |
| 761 InitBuffer(); | 760 InitBuffer(); |
| 762 test_stream_->stop_stream_ = true; | 761 test_stream_->stop_stream_ = true; |
| 763 bool source_exhausted; | 762 bool source_exhausted; |
| 764 test_stream_->BufferPacket(&source_exhausted); | 763 test_stream_->BufferPacket(&source_exhausted); |
| 765 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); | 764 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 796 | 795 |
| 797 test_stream_->stop_stream_ = true; | 796 test_stream_->stop_stream_ = true; |
| 798 test_stream_->ScheduleNextWrite(true); | 797 test_stream_->ScheduleNextWrite(true); |
| 799 | 798 |
| 800 // TODO(ajwong): Find a way to test whether or not another task has been | 799 // TODO(ajwong): Find a way to test whether or not another task has been |
| 801 // posted so we can verify that the Alsa code will indeed break the task | 800 // posted so we can verify that the Alsa code will indeed break the task |
| 802 // posting loop. | 801 // posting loop. |
| 803 | 802 |
| 804 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); | 803 test_stream_->shared_data_.TransitionTo(AlsaPcmOutputStream::kIsClosed); |
| 805 } | 804 } |
| OLD | NEW |