Chromium Code Reviews| 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 "base/message_loop.h" | 5 #include "base/message_loop.h" |
| 6 #include "base/stringprintf.h" | 6 #include "base/stringprintf.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 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 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_METHOD2(OnError, void(AudioOutputStream* stream, int code)); | 73 MOCK_METHOD2(OnError, void(AudioOutputStream* stream, int code)); |
| 74 }; | 74 }; |
| 75 | 75 |
| 76 class MockAudioManagerLinux : public AudioManagerLinux { | 76 class MockAudioManagerLinux : public AudioManagerLinux { |
| 77 public: | 77 public: |
| 78 MOCK_METHOD0(Init, void()); | 78 MOCK_METHOD0(Init, void()); |
|
no longer working on chromium
2012/03/01 16:02:19
Question to Tommi: We don't use these mock functio
| |
| 79 MOCK_METHOD0(HasAudioOutputDevices, bool()); | 79 MOCK_METHOD0(HasAudioOutputDevices, bool()); |
| 80 MOCK_METHOD0(HasAudioInputDevices, bool()); | 80 MOCK_METHOD0(HasAudioInputDevices, bool()); |
| 81 MOCK_METHOD1(MakeAudioOutputStream, AudioOutputStream*( | |
| 82 const AudioParameters& params)); | |
| 83 MOCK_METHOD2(MakeAudioInputStream, AudioInputStream*( | |
| 84 const AudioParameters& params, const std::string& device_id)); | |
| 85 MOCK_METHOD0(MuteAll, void()); | 81 MOCK_METHOD0(MuteAll, void()); |
| 86 MOCK_METHOD0(UnMuteAll, void()); | 82 MOCK_METHOD0(UnMuteAll, void()); |
| 87 MOCK_METHOD1(ReleaseOutputStream, void(AudioOutputStream* stream)); | 83 MOCK_METHOD0(GetMaxAudioOutputStreamsAllowed, int()); |
| 84 MOCK_METHOD1(MakeAudioLinearOutputStream, AudioOutputStream*( | |
| 85 const AudioParameters& params)); | |
| 86 MOCK_METHOD1(MakeAudioLowLatencyOutputStream, AudioOutputStream*( | |
| 87 const AudioParameters& params)); | |
| 88 MOCK_METHOD2(MakeAudioLinearOutputStream, AudioInputStream*( | |
| 89 const AudioParameters& params, const std::string& device_id)); | |
| 90 MOCK_METHOD2(MakeAudioLowLatencyInputStream, AudioInputStream*( | |
| 91 const AudioParameters& params, const std::string& device_id)); | |
| 92 | |
| 93 // We need to override this function because we want to skip the checking | |
| 94 // the number of active streams. | |
| 95 virtual void ReleaseOutputStream(AudioOutputStream* stream) OVERRIDE { | |
| 96 DCHECK(stream); | |
| 97 delete stream; | |
| 98 } | |
| 88 | 99 |
| 89 // We don't mock this method since all tests will do the same thing | 100 // We don't mock this method since all tests will do the same thing |
| 90 // and use the current message loop. | 101 // and use the current message loop. |
| 91 virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE { | 102 virtual scoped_refptr<base::MessageLoopProxy> GetMessageLoop() OVERRIDE { |
| 92 return MessageLoop::current()->message_loop_proxy(); | 103 return MessageLoop::current()->message_loop_proxy(); |
| 93 } | 104 } |
| 94 }; | 105 }; |
| 95 | 106 |
| 96 class AlsaPcmOutputStreamTest : public testing::Test { | 107 class AlsaPcmOutputStreamTest : public testing::Test { |
| 97 protected: | 108 protected: |
| 98 AlsaPcmOutputStreamTest() { | 109 AlsaPcmOutputStreamTest() { |
| 99 mock_manager_.reset(new StrictMock<MockAudioManagerLinux>()); | 110 mock_manager_.reset(new StrictMock<MockAudioManagerLinux>()); |
| 100 test_stream_.reset(CreateStream(kTestChannelLayout)); | 111 test_stream_ = CreateStream(kTestChannelLayout); |
| 101 } | 112 } |
| 102 | 113 |
| 103 virtual ~AlsaPcmOutputStreamTest() { | 114 virtual ~AlsaPcmOutputStreamTest() { |
| 104 test_stream_.reset(NULL); | 115 test_stream_ = NULL; |
| 105 } | 116 } |
| 106 | 117 |
| 107 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { | 118 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { |
| 108 return CreateStream(layout, kTestFramesPerPacket); | 119 return CreateStream(layout, kTestFramesPerPacket); |
| 109 } | 120 } |
| 110 | 121 |
| 111 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, | 122 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, |
| 112 int32 samples_per_packet) { | 123 int32 samples_per_packet) { |
| 113 AudioParameters params(kTestFormat, layout, kTestSampleRate, | 124 AudioParameters params(kTestFormat, layout, kTestSampleRate, |
| 114 kTestBitsPerSample, samples_per_packet); | 125 kTestBitsPerSample, samples_per_packet); |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 158 static char kSurround41[]; | 169 static char kSurround41[]; |
| 159 static char kSurround50[]; | 170 static char kSurround50[]; |
| 160 static char kSurround51[]; | 171 static char kSurround51[]; |
| 161 static char kSurround70[]; | 172 static char kSurround70[]; |
| 162 static char kSurround71[]; | 173 static char kSurround71[]; |
| 163 static void* kFakeHints[]; | 174 static void* kFakeHints[]; |
| 164 | 175 |
| 165 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; | 176 StrictMock<MockAlsaWrapper> mock_alsa_wrapper_; |
| 166 scoped_ptr<StrictMock<MockAudioManagerLinux> > mock_manager_; | 177 scoped_ptr<StrictMock<MockAudioManagerLinux> > mock_manager_; |
| 167 MessageLoop message_loop_; | 178 MessageLoop message_loop_; |
| 168 scoped_ptr<AlsaPcmOutputStream> test_stream_; | 179 AlsaPcmOutputStream* test_stream_; |
| 169 scoped_refptr<media::DataBuffer> packet_; | 180 scoped_refptr<media::DataBuffer> packet_; |
| 170 | 181 |
| 171 private: | 182 private: |
| 172 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); | 183 DISALLOW_COPY_AND_ASSIGN(AlsaPcmOutputStreamTest); |
| 173 }; | 184 }; |
| 174 | 185 |
| 175 const ChannelLayout AlsaPcmOutputStreamTest::kTestChannelLayout = | 186 const ChannelLayout AlsaPcmOutputStreamTest::kTestChannelLayout = |
| 176 CHANNEL_LAYOUT_STEREO; | 187 CHANNEL_LAYOUT_STEREO; |
| 177 const int AlsaPcmOutputStreamTest::kTestSampleRate = | 188 const int AlsaPcmOutputStreamTest::kTestSampleRate = |
| 178 AudioParameters::kAudioCDSampleRate; | 189 AudioParameters::kAudioCDSampleRate; |
| (...skipping 20 matching lines...) Expand all Loading... | |
| 199 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0"; | 210 char AlsaPcmOutputStreamTest::kSurround70[] = "surround70:CARD=foo,DEV=0"; |
| 200 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; | 211 char AlsaPcmOutputStreamTest::kSurround71[] = "surround71:CARD=foo,DEV=0"; |
| 201 void* AlsaPcmOutputStreamTest::kFakeHints[] = { | 212 void* AlsaPcmOutputStreamTest::kFakeHints[] = { |
| 202 kSurround40, kSurround41, kSurround50, kSurround51, | 213 kSurround40, kSurround41, kSurround50, kSurround51, |
| 203 kSurround70, kSurround71, NULL }; | 214 kSurround70, kSurround71, NULL }; |
| 204 | 215 |
| 205 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { | 216 TEST_F(AlsaPcmOutputStreamTest, ConstructedState) { |
| 206 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); | 217 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); |
| 207 | 218 |
| 208 // Should support mono. | 219 // Should support mono. |
| 209 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_MONO)); | 220 test_stream_ = CreateStream(CHANNEL_LAYOUT_MONO); |
| 210 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); | 221 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); |
| 211 | 222 |
| 212 // Should support multi-channel. | 223 // Should support multi-channel. |
| 213 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_SURROUND)); | 224 test_stream_ = CreateStream(CHANNEL_LAYOUT_SURROUND); |
| 214 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); | 225 EXPECT_EQ(AlsaPcmOutputStream::kCreated, test_stream_->state()); |
| 215 | 226 |
| 216 // Bad bits per sample. | 227 // Bad bits per sample. |
| 217 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout, | 228 AudioParameters bad_bps_params(kTestFormat, kTestChannelLayout, |
| 218 kTestSampleRate, kTestBitsPerSample - 1, | 229 kTestSampleRate, kTestBitsPerSample - 1, |
| 219 kTestFramesPerPacket); | 230 kTestFramesPerPacket); |
| 220 test_stream_.reset(new AlsaPcmOutputStream(kTestDeviceName, | 231 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, |
| 221 bad_bps_params, | 232 bad_bps_params, |
| 222 &mock_alsa_wrapper_, | 233 &mock_alsa_wrapper_, |
| 223 mock_manager_.get())); | 234 mock_manager_.get()); |
| 224 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); | 235 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); |
| 225 | 236 |
| 226 // Bad format. | 237 // Bad format. |
| 227 AudioParameters bad_format_params( | 238 AudioParameters bad_format_params( |
| 228 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate, | 239 AudioParameters::AUDIO_LAST_FORMAT, kTestChannelLayout, kTestSampleRate, |
| 229 kTestBitsPerSample, kTestFramesPerPacket); | 240 kTestBitsPerSample, kTestFramesPerPacket); |
| 230 test_stream_.reset(new AlsaPcmOutputStream(kTestDeviceName, | 241 test_stream_ = new AlsaPcmOutputStream(kTestDeviceName, |
| 231 bad_format_params, | 242 bad_format_params, |
| 232 &mock_alsa_wrapper_, | 243 &mock_alsa_wrapper_, |
| 233 mock_manager_.get())); | 244 mock_manager_.get()); |
| 234 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); | 245 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); |
| 235 } | 246 } |
| 236 | 247 |
| 237 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { | 248 TEST_F(AlsaPcmOutputStreamTest, LatencyFloor) { |
| 238 const double kMicrosPerFrame = | 249 const double kMicrosPerFrame = |
| 239 static_cast<double>(1000000) / kTestSampleRate; | 250 static_cast<double>(1000000) / kTestSampleRate; |
| 240 const double kPacketFramesInMinLatency = | 251 const double kPacketFramesInMinLatency = |
| 241 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; | 252 AlsaPcmOutputStream::kMinLatencyMicros / kMicrosPerFrame / 2.0; |
| 242 | 253 |
| 243 // Test that packets which would cause a latency under less than | 254 // Test that packets which would cause a latency under less than |
| 244 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to | 255 // AlsaPcmOutputStream::kMinLatencyMicros will get clipped to |
| 245 // AlsaPcmOutputStream::kMinLatencyMicros, | 256 // AlsaPcmOutputStream::kMinLatencyMicros, |
| 246 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 257 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 247 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 258 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 248 Return(0))); | 259 Return(0))); |
| 249 EXPECT_CALL(mock_alsa_wrapper_, | 260 EXPECT_CALL(mock_alsa_wrapper_, |
| 250 PcmSetParams(_, _, _, _, _, _, | 261 PcmSetParams(_, _, _, _, _, _, |
| 251 AlsaPcmOutputStream::kMinLatencyMicros)) | 262 AlsaPcmOutputStream::kMinLatencyMicros)) |
| 252 .WillOnce(Return(0)); | 263 .WillOnce(Return(0)); |
| 253 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 264 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
| 254 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 265 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
| 255 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 266 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
| 256 Return(0))); | 267 Return(0))); |
| 257 | 268 |
| 258 test_stream_.reset(CreateStream(kTestChannelLayout, | 269 test_stream_ = CreateStream(kTestChannelLayout, kPacketFramesInMinLatency); |
| 259 kPacketFramesInMinLatency)); | |
| 260 ASSERT_TRUE(test_stream_->Open()); | 270 ASSERT_TRUE(test_stream_->Open()); |
| 261 | 271 |
| 262 // Now close it and test that everything was released. | 272 // Now close it and test that everything was released. |
| 263 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); | 273 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); |
| 264 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 274 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 265 .WillOnce(Return(kTestDeviceName)); | 275 .WillOnce(Return(kTestDeviceName)); |
| 266 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get())); | 276 // EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_)); |
| 267 test_stream_->Close(); | 277 test_stream_->Close(); |
| 268 | 278 |
| 269 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 279 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
| 270 Mock::VerifyAndClear(mock_manager_.get()); | 280 Mock::VerifyAndClear(mock_manager_.get()); |
| 271 | 281 |
| 272 // Test that having more packets ends up with a latency based on packet size. | 282 // Test that having more packets ends up with a latency based on packet size. |
| 273 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; | 283 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; |
| 274 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( | 284 int64 expected_micros = 2 * AlsaPcmOutputStream::FramesToMicros( |
| 275 kOverMinLatencyPacketSize, kTestSampleRate); | 285 kOverMinLatencyPacketSize, kTestSampleRate); |
| 276 | 286 |
| 277 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 287 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 278 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 288 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
| 279 EXPECT_CALL(mock_alsa_wrapper_, | 289 EXPECT_CALL(mock_alsa_wrapper_, |
| 280 PcmSetParams(_, _, _, _, _, _, expected_micros)) | 290 PcmSetParams(_, _, _, _, _, _, expected_micros)) |
| 281 .WillOnce(Return(0)); | 291 .WillOnce(Return(0)); |
| 282 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 292 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
| 283 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 293 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
| 284 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 294 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
| 285 Return(0))); | 295 Return(0))); |
| 286 | 296 |
| 287 test_stream_.reset(CreateStream(kTestChannelLayout, | 297 test_stream_ = CreateStream(kTestChannelLayout, kOverMinLatencyPacketSize); |
| 288 kOverMinLatencyPacketSize)); | |
| 289 ASSERT_TRUE(test_stream_->Open()); | 298 ASSERT_TRUE(test_stream_->Open()); |
| 290 | 299 |
| 291 // Now close it and test that everything was released. | 300 // Now close it and test that everything was released. |
| 292 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 301 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 293 .WillOnce(Return(0)); | 302 .WillOnce(Return(0)); |
| 294 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 303 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 295 .WillOnce(Return(kTestDeviceName)); | 304 .WillOnce(Return(kTestDeviceName)); |
| 296 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get())); | |
| 297 test_stream_->Close(); | 305 test_stream_->Close(); |
| 298 | 306 |
| 299 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 307 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
| 300 Mock::VerifyAndClear(mock_manager_.get()); | 308 Mock::VerifyAndClear(mock_manager_.get()); |
| 301 } | 309 } |
| 302 | 310 |
| 303 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { | 311 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { |
| 304 int64 expected_micros = 2 * | 312 int64 expected_micros = 2 * |
| 305 AlsaPcmOutputStream::FramesToMicros(kTestPacketSize / kTestBytesPerFrame, | 313 AlsaPcmOutputStream::FramesToMicros(kTestPacketSize / kTestBytesPerFrame, |
| 306 kTestSampleRate); | 314 kTestSampleRate); |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 334 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); | 342 EXPECT_EQ(kFakeHandle, test_stream_->playback_handle_); |
| 335 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); | 343 EXPECT_EQ(kTestFramesPerPacket, test_stream_->frames_per_packet_); |
| 336 EXPECT_TRUE(test_stream_->buffer_.get()); | 344 EXPECT_TRUE(test_stream_->buffer_.get()); |
| 337 EXPECT_FALSE(test_stream_->stop_stream_); | 345 EXPECT_FALSE(test_stream_->stop_stream_); |
| 338 | 346 |
| 339 // Now close it and test that everything was released. | 347 // Now close it and test that everything was released. |
| 340 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 348 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 341 .WillOnce(Return(0)); | 349 .WillOnce(Return(0)); |
| 342 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 350 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 343 .WillOnce(Return(kTestDeviceName)); | 351 .WillOnce(Return(kTestDeviceName)); |
| 344 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get())); | |
| 345 test_stream_->Close(); | 352 test_stream_->Close(); |
| 346 | |
| 347 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | |
| 348 EXPECT_FALSE(test_stream_->buffer_.get()); | |
| 349 EXPECT_TRUE(test_stream_->stop_stream_); | |
| 350 } | 353 } |
| 351 | 354 |
| 352 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { | 355 TEST_F(AlsaPcmOutputStreamTest, PcmOpenFailed) { |
| 353 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 356 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 354 .WillOnce(Return(kTestFailedErrno)); | 357 .WillOnce(Return(kTestFailedErrno)); |
| 355 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 358 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 356 .WillOnce(Return(kDummyMessage)); | 359 .WillOnce(Return(kDummyMessage)); |
| 357 | 360 |
| 358 ASSERT_FALSE(test_stream_->Open()); | 361 ASSERT_FALSE(test_stream_->Open()); |
| 359 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); | 362 ASSERT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); |
| 360 | 363 |
| 361 // Ensure internal state is set for a no-op stream if PcmOpen() failes. | 364 // Ensure internal state is set for a no-op stream if PcmOpen() failes. |
| 362 EXPECT_TRUE(test_stream_->stop_stream_); | 365 EXPECT_TRUE(test_stream_->stop_stream_); |
| 363 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 366 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| 364 EXPECT_FALSE(test_stream_->buffer_.get()); | 367 EXPECT_FALSE(test_stream_->buffer_.get()); |
| 365 | 368 |
| 366 // Close the stream since we opened it to make destruction happy. | 369 // Close the stream since we opened it to make destruction happy. |
| 367 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get())); | |
| 368 test_stream_->Close(); | 370 test_stream_->Close(); |
| 369 } | 371 } |
| 370 | 372 |
| 371 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { | 373 TEST_F(AlsaPcmOutputStreamTest, PcmSetParamsFailed) { |
| 372 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 374 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 373 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 375 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 374 Return(0))); | 376 Return(0))); |
| 375 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) | 377 EXPECT_CALL(mock_alsa_wrapper_, PcmSetParams(_, _, _, _, _, _, _)) |
| 376 .WillOnce(Return(kTestFailedErrno)); | 378 .WillOnce(Return(kTestFailedErrno)); |
| 377 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 379 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 378 .WillOnce(Return(0)); | 380 .WillOnce(Return(0)); |
| 379 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 381 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 380 .WillOnce(Return(kTestDeviceName)); | 382 .WillOnce(Return(kTestDeviceName)); |
| 381 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 383 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 382 .WillOnce(Return(kDummyMessage)); | 384 .WillOnce(Return(kDummyMessage)); |
| 383 | 385 |
| 384 // If open fails, the stream stays in kCreated because it has effectively had | 386 // If open fails, the stream stays in kCreated because it has effectively had |
| 385 // no changes. | 387 // no changes. |
| 386 ASSERT_FALSE(test_stream_->Open()); | 388 ASSERT_FALSE(test_stream_->Open()); |
| 387 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); | 389 EXPECT_EQ(AlsaPcmOutputStream::kInError, test_stream_->state()); |
| 388 | 390 |
| 389 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. | 391 // Ensure internal state is set for a no-op stream if PcmSetParams() failes. |
| 390 EXPECT_TRUE(test_stream_->stop_stream_); | 392 EXPECT_TRUE(test_stream_->stop_stream_); |
| 391 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); | 393 EXPECT_TRUE(test_stream_->playback_handle_ == NULL); |
| 392 EXPECT_FALSE(test_stream_->buffer_.get()); | 394 EXPECT_FALSE(test_stream_->buffer_.get()); |
| 393 | 395 |
| 394 // Close the stream since we opened it to make destruction happy. | 396 // Close the stream since we opened it to make destruction happy. |
| 395 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get())); | |
| 396 test_stream_->Close(); | 397 test_stream_->Close(); |
| 397 } | 398 } |
| 398 | 399 |
| 399 TEST_F(AlsaPcmOutputStreamTest, StartStop) { | 400 TEST_F(AlsaPcmOutputStreamTest, StartStop) { |
| 400 // Open() call opens the playback device, sets the parameters, posts a task | 401 // Open() call opens the playback device, sets the parameters, posts a task |
| 401 // with the resulting configuration data, and transitions the object state to | 402 // with the resulting configuration data, and transitions the object state to |
| 402 // kIsOpened. | 403 // kIsOpened. |
| 403 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 404 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
| 404 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 405 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
| 405 Return(0))); | 406 Return(0))); |
| (...skipping 15 matching lines...) Expand all Loading... | |
| 421 | 422 |
| 422 // Expect the pre-roll. | 423 // Expect the pre-roll. |
| 423 MockAudioSourceCallback mock_callback; | 424 MockAudioSourceCallback mock_callback; |
| 424 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) | 425 EXPECT_CALL(mock_alsa_wrapper_, PcmState(kFakeHandle)) |
| 425 .Times(3) | 426 .Times(3) |
| 426 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); | 427 .WillRepeatedly(Return(SND_PCM_STATE_RUNNING)); |
| 427 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) | 428 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(kFakeHandle, _)) |
| 428 .Times(2) | 429 .Times(2) |
| 429 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); | 430 .WillRepeatedly(DoAll(SetArgumentPointee<1>(0), Return(0))); |
| 430 EXPECT_CALL(mock_callback, | 431 EXPECT_CALL(mock_callback, |
| 431 OnMoreData(test_stream_.get(), _, kTestPacketSize, _)) | 432 OnMoreData(test_stream_, _, kTestPacketSize, _)) |
| 432 .Times(2) | 433 .Times(2) |
| 433 .WillOnce(Return(kTestPacketSize)) | 434 .WillOnce(Return(kTestPacketSize)) |
| 434 .WillOnce(Return(0)); | 435 .WillOnce(Return(0)); |
| 435 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) | 436 EXPECT_CALL(mock_alsa_wrapper_, PcmWritei(kFakeHandle, _, _)) |
| 436 .WillOnce(Return(kTestFramesPerPacket)); | 437 .WillOnce(Return(kTestFramesPerPacket)); |
| 437 | 438 |
| 438 // Expect scheduling. | 439 // Expect scheduling. |
| 439 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) | 440 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(kFakeHandle)) |
| 440 .Times(AtLeast(3)) | 441 .Times(AtLeast(3)) |
| 441 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. | 442 .WillOnce(Return(kTestFramesPerPacket)) // Buffer is empty. |
| 442 .WillOnce(Return(kTestFramesPerPacket)) | 443 .WillOnce(Return(kTestFramesPerPacket)) |
| 443 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, | 444 .WillRepeatedly(DoAll(InvokeWithoutArgs(&message_loop_, |
| 444 &MessageLoop::QuitNow), | 445 &MessageLoop::QuitNow), |
| 445 Return(0))); // Buffer is full. | 446 Return(0))); // Buffer is full. |
| 446 | 447 |
| 447 test_stream_->Start(&mock_callback); | 448 test_stream_->Start(&mock_callback); |
| 448 message_loop_.RunAllPending(); | 449 message_loop_.RunAllPending(); |
| 449 | 450 |
| 450 EXPECT_CALL(mock_manager(), ReleaseOutputStream(test_stream_.get())); | |
| 451 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 451 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
| 452 .WillOnce(Return(0)); | 452 .WillOnce(Return(0)); |
| 453 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 453 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
| 454 .WillOnce(Return(kTestDeviceName)); | 454 .WillOnce(Return(kTestDeviceName)); |
| 455 test_stream_->Close(); | 455 test_stream_->Close(); |
| 456 } | 456 } |
| 457 | 457 |
| 458 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { | 458 TEST_F(AlsaPcmOutputStreamTest, WritePacket_FinishedPacket) { |
| 459 InitBuffer(); | 459 InitBuffer(); |
| 460 | 460 |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 532 MockAudioSourceCallback mock_callback; | 532 MockAudioSourceCallback mock_callback; |
| 533 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 533 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
| 534 .WillOnce(Return(SND_PCM_STATE_RUNNING)); | 534 .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
| 535 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) | 535 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
| 536 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); | 536 .WillOnce(DoAll(SetArgumentPointee<1>(1), Return(0))); |
| 537 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) | 537 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) |
| 538 .WillRepeatedly(Return(0)); // Buffer is full. | 538 .WillRepeatedly(Return(0)); // Buffer is full. |
| 539 | 539 |
| 540 // Return a partially filled packet. | 540 // Return a partially filled packet. |
| 541 EXPECT_CALL(mock_callback, | 541 EXPECT_CALL(mock_callback, |
| 542 OnMoreData(test_stream_.get(), _, _, _)) | 542 OnMoreData(test_stream_, _, _, _)) |
| 543 .WillOnce(Return(10)); | 543 .WillOnce(Return(10)); |
| 544 | 544 |
| 545 bool source_exhausted; | 545 bool source_exhausted; |
| 546 test_stream_->set_source_callback(&mock_callback); | 546 test_stream_->set_source_callback(&mock_callback); |
| 547 test_stream_->packet_size_ = kTestPacketSize; | 547 test_stream_->packet_size_ = kTestPacketSize; |
| 548 test_stream_->BufferPacket(&source_exhausted); | 548 test_stream_->BufferPacket(&source_exhausted); |
| 549 | 549 |
| 550 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); | 550 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); |
| 551 EXPECT_FALSE(source_exhausted); | 551 EXPECT_FALSE(source_exhausted); |
| 552 } | 552 } |
| 553 | 553 |
| 554 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { | 554 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Negative) { |
| 555 InitBuffer(); | 555 InitBuffer(); |
| 556 test_stream_->buffer_->Clear(); | 556 test_stream_->buffer_->Clear(); |
| 557 | 557 |
| 558 // Simulate where the underrun has occurred right after checking the delay. | 558 // Simulate where the underrun has occurred right after checking the delay. |
| 559 MockAudioSourceCallback mock_callback; | 559 MockAudioSourceCallback mock_callback; |
| 560 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 560 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
| 561 .WillOnce(Return(SND_PCM_STATE_RUNNING)); | 561 .WillOnce(Return(SND_PCM_STATE_RUNNING)); |
| 562 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) | 562 EXPECT_CALL(mock_alsa_wrapper_, PcmDelay(_, _)) |
| 563 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); | 563 .WillOnce(DoAll(SetArgumentPointee<1>(-1), Return(0))); |
| 564 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) | 564 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) |
| 565 .WillRepeatedly(Return(0)); // Buffer is full. | 565 .WillRepeatedly(Return(0)); // Buffer is full. |
| 566 EXPECT_CALL(mock_callback, | 566 EXPECT_CALL(mock_callback, |
| 567 OnMoreData(test_stream_.get(), _, _, _)) | 567 OnMoreData(test_stream_, _, _, _)) |
| 568 .WillOnce(Return(10)); | 568 .WillOnce(Return(10)); |
| 569 | 569 |
| 570 bool source_exhausted; | 570 bool source_exhausted; |
| 571 test_stream_->set_source_callback(&mock_callback); | 571 test_stream_->set_source_callback(&mock_callback); |
| 572 test_stream_->packet_size_ = kTestPacketSize; | 572 test_stream_->packet_size_ = kTestPacketSize; |
| 573 test_stream_->BufferPacket(&source_exhausted); | 573 test_stream_->BufferPacket(&source_exhausted); |
| 574 | 574 |
| 575 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); | 575 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); |
| 576 EXPECT_FALSE(source_exhausted); | 576 EXPECT_FALSE(source_exhausted); |
| 577 } | 577 } |
| 578 | 578 |
| 579 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { | 579 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_Underrun) { |
| 580 InitBuffer(); | 580 InitBuffer(); |
| 581 test_stream_->buffer_->Clear(); | 581 test_stream_->buffer_->Clear(); |
| 582 | 582 |
| 583 // If ALSA has underrun then we should assume a delay of zero. | 583 // If ALSA has underrun then we should assume a delay of zero. |
| 584 MockAudioSourceCallback mock_callback; | 584 MockAudioSourceCallback mock_callback; |
| 585 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) | 585 EXPECT_CALL(mock_alsa_wrapper_, PcmState(_)) |
| 586 .WillOnce(Return(SND_PCM_STATE_XRUN)); | 586 .WillOnce(Return(SND_PCM_STATE_XRUN)); |
| 587 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) | 587 EXPECT_CALL(mock_alsa_wrapper_, PcmAvailUpdate(_)) |
| 588 .WillRepeatedly(Return(0)); // Buffer is full. | 588 .WillRepeatedly(Return(0)); // Buffer is full. |
| 589 EXPECT_CALL(mock_callback, | 589 EXPECT_CALL(mock_callback, |
| 590 OnMoreData(test_stream_.get(), _, _, AllOf( | 590 OnMoreData(test_stream_, _, _, AllOf( |
| 591 Field(&AudioBuffersState::pending_bytes, 0), | 591 Field(&AudioBuffersState::pending_bytes, 0), |
| 592 Field(&AudioBuffersState::hardware_delay_bytes, 0)))) | 592 Field(&AudioBuffersState::hardware_delay_bytes, 0)))) |
| 593 .WillOnce(Return(10)); | 593 .WillOnce(Return(10)); |
| 594 | 594 |
| 595 bool source_exhausted; | 595 bool source_exhausted; |
| 596 test_stream_->set_source_callback(&mock_callback); | 596 test_stream_->set_source_callback(&mock_callback); |
| 597 test_stream_->packet_size_ = kTestPacketSize; | 597 test_stream_->packet_size_ = kTestPacketSize; |
| 598 test_stream_->BufferPacket(&source_exhausted); | 598 test_stream_->BufferPacket(&source_exhausted); |
| 599 | 599 |
| 600 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); | 600 EXPECT_EQ(10u, test_stream_->buffer_->forward_bytes()); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 663 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) | 663 PcmSetParams(kFakeHandle, _, _, i, _, _, _)) |
| 664 .WillOnce(Return(0)); | 664 .WillOnce(Return(0)); |
| 665 | 665 |
| 666 // The parameters are specified by ALSA documentation, and are in constants | 666 // The parameters are specified by ALSA documentation, and are in constants |
| 667 // in the implementation files. | 667 // in the implementation files. |
| 668 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) | 668 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("IOID"))) |
| 669 .WillRepeatedly(Invoke(OutputHint)); | 669 .WillRepeatedly(Invoke(OutputHint)); |
| 670 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) | 670 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameGetHint(_, StrEq("NAME"))) |
| 671 .WillRepeatedly(Invoke(EchoHint)); | 671 .WillRepeatedly(Invoke(EchoHint)); |
| 672 | 672 |
| 673 test_stream_.reset(CreateStream(kExpectedLayouts[i])); | 673 test_stream_ = CreateStream(kExpectedLayouts[i]); |
| 674 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); | 674 EXPECT_TRUE(test_stream_->AutoSelectDevice(i)); |
| 675 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); | 675 EXPECT_EQ(kExpectedDownmix[i], test_stream_->should_downmix_); |
| 676 | 676 |
| 677 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); | 677 Mock::VerifyAndClearExpectations(&mock_alsa_wrapper_); |
| 678 Mock::VerifyAndClearExpectations(mock_manager_.get()); | 678 Mock::VerifyAndClearExpectations(mock_manager_.get()); |
| 679 } | 679 } |
| 680 } | 680 } |
| 681 | 681 |
| 682 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { | 682 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_FallbackDevices) { |
| 683 using std::string; | 683 using std::string; |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 713 InSequence s; | 713 InSequence s; |
| 714 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) | 714 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(first_try.c_str()), _, _)) |
| 715 .WillOnce(Return(kTestFailedErrno)); | 715 .WillOnce(Return(kTestFailedErrno)); |
| 716 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) | 716 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(second_try.c_str()), _, _)) |
| 717 .WillOnce(Return(kTestFailedErrno)); | 717 .WillOnce(Return(kTestFailedErrno)); |
| 718 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) | 718 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(third_try.c_str()), _, _)) |
| 719 .WillOnce(Return(kTestFailedErrno)); | 719 .WillOnce(Return(kTestFailedErrno)); |
| 720 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) | 720 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, StrEq(fourth_try.c_str()), _, _)) |
| 721 .WillOnce(Return(kTestFailedErrno)); | 721 .WillOnce(Return(kTestFailedErrno)); |
| 722 | 722 |
| 723 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0)); | 723 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0); |
| 724 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); | 724 EXPECT_FALSE(test_stream_->AutoSelectDevice(5)); |
| 725 } | 725 } |
| 726 | 726 |
| 727 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { | 727 TEST_F(AlsaPcmOutputStreamTest, AutoSelectDevice_HintFail) { |
| 728 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to | 728 // Should get |kDefaultDevice|, and force a 2-channel downmix on a failure to |
| 729 // enumerate devices. | 729 // enumerate devices. |
| 730 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) | 730 EXPECT_CALL(mock_alsa_wrapper_, DeviceNameHint(_, _, _)) |
| 731 .WillRepeatedly(Return(kTestFailedErrno)); | 731 .WillRepeatedly(Return(kTestFailedErrno)); |
| 732 EXPECT_CALL(mock_alsa_wrapper_, | 732 EXPECT_CALL(mock_alsa_wrapper_, |
| 733 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) | 733 PcmOpen(_, StrEq(AlsaPcmOutputStream::kDefaultDevice), _, _)) |
| 734 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 734 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
| 735 EXPECT_CALL(mock_alsa_wrapper_, | 735 EXPECT_CALL(mock_alsa_wrapper_, |
| 736 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) | 736 PcmSetParams(kFakeHandle, _, _, 2, _, _, _)) |
| 737 .WillOnce(Return(0)); | 737 .WillOnce(Return(0)); |
| 738 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) | 738 EXPECT_CALL(mock_alsa_wrapper_, StrError(kTestFailedErrno)) |
| 739 .WillOnce(Return(kDummyMessage)); | 739 .WillOnce(Return(kDummyMessage)); |
| 740 | 740 |
| 741 test_stream_.reset(CreateStream(CHANNEL_LAYOUT_5POINT0)); | 741 test_stream_ = CreateStream(CHANNEL_LAYOUT_5POINT0); |
| 742 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); | 742 EXPECT_TRUE(test_stream_->AutoSelectDevice(5)); |
| 743 EXPECT_TRUE(test_stream_->should_downmix_); | 743 EXPECT_TRUE(test_stream_->should_downmix_); |
| 744 } | 744 } |
| 745 | 745 |
| 746 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { | 746 TEST_F(AlsaPcmOutputStreamTest, BufferPacket_StopStream) { |
| 747 InitBuffer(); | 747 InitBuffer(); |
| 748 test_stream_->stop_stream_ = true; | 748 test_stream_->stop_stream_ = true; |
| 749 bool source_exhausted; | 749 bool source_exhausted; |
| 750 test_stream_->BufferPacket(&source_exhausted); | 750 test_stream_->BufferPacket(&source_exhausted); |
| 751 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); | 751 EXPECT_EQ(0u, test_stream_->buffer_->forward_bytes()); |
| (...skipping 29 matching lines...) Expand all Loading... | |
| 781 | 781 |
| 782 test_stream_->stop_stream_ = true; | 782 test_stream_->stop_stream_ = true; |
| 783 test_stream_->ScheduleNextWrite(true); | 783 test_stream_->ScheduleNextWrite(true); |
| 784 | 784 |
| 785 // TODO(ajwong): Find a way to test whether or not another task has been | 785 // TODO(ajwong): Find a way to test whether or not another task has been |
| 786 // posted so we can verify that the Alsa code will indeed break the task | 786 // posted so we can verify that the Alsa code will indeed break the task |
| 787 // posting loop. | 787 // posting loop. |
| 788 | 788 |
| 789 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed); | 789 test_stream_->TransitionTo(AlsaPcmOutputStream::kIsClosed); |
| 790 } | 790 } |
| OLD | NEW |