OLD | NEW |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | 1 // Copyright 2013 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/strings/stringprintf.h" | 5 #include "base/strings/stringprintf.h" |
6 #include "media/audio/alsa/alsa_output.h" | 6 #include "media/audio/alsa/alsa_output.h" |
7 #include "media/audio/alsa/alsa_wrapper.h" | 7 #include "media/audio/alsa/alsa_wrapper.h" |
8 #include "media/audio/alsa/audio_manager_alsa.h" | 8 #include "media/audio/alsa/audio_manager_alsa.h" |
9 #include "media/audio/fake_audio_log_factory.h" | 9 #include "media/audio/fake_audio_log_factory.h" |
10 #include "media/audio/mock_audio_source_callback.h" | 10 #include "media/audio/mock_audio_source_callback.h" |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
107 } | 107 } |
108 | 108 |
109 virtual ~AlsaPcmOutputStreamTest() { | 109 virtual ~AlsaPcmOutputStreamTest() { |
110 } | 110 } |
111 | 111 |
112 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { | 112 AlsaPcmOutputStream* CreateStream(ChannelLayout layout) { |
113 return CreateStream(layout, kTestFramesPerPacket); | 113 return CreateStream(layout, kTestFramesPerPacket); |
114 } | 114 } |
115 | 115 |
116 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, | 116 AlsaPcmOutputStream* CreateStream(ChannelLayout layout, |
117 int32 samples_per_packet) { | 117 int32_t samples_per_packet) { |
118 AudioParameters params(kTestFormat, layout, kTestSampleRate, | 118 AudioParameters params(kTestFormat, layout, kTestSampleRate, |
119 kTestBitsPerSample, samples_per_packet); | 119 kTestBitsPerSample, samples_per_packet); |
120 return new AlsaPcmOutputStream(kTestDeviceName, | 120 return new AlsaPcmOutputStream(kTestDeviceName, |
121 params, | 121 params, |
122 &mock_alsa_wrapper_, | 122 &mock_alsa_wrapper_, |
123 mock_manager_.get()); | 123 mock_manager_.get()); |
124 } | 124 } |
125 | 125 |
126 // Helper function to malloc the string returned by DeviceNameHint for NAME. | 126 // Helper function to malloc the string returned by DeviceNameHint for NAME. |
127 static char* EchoHint(const void* name, Unused) { | 127 static char* EchoHint(const void* name, Unused) { |
(...skipping 15 matching lines...) Expand all Loading... |
143 test_stream->buffer_->Append(packet_.get()); | 143 test_stream->buffer_->Append(packet_.get()); |
144 } | 144 } |
145 | 145 |
146 static const ChannelLayout kTestChannelLayout; | 146 static const ChannelLayout kTestChannelLayout; |
147 static const int kTestSampleRate; | 147 static const int kTestSampleRate; |
148 static const int kTestBitsPerSample; | 148 static const int kTestBitsPerSample; |
149 static const int kTestBytesPerFrame; | 149 static const int kTestBytesPerFrame; |
150 static const AudioParameters::Format kTestFormat; | 150 static const AudioParameters::Format kTestFormat; |
151 static const char kTestDeviceName[]; | 151 static const char kTestDeviceName[]; |
152 static const char kDummyMessage[]; | 152 static const char kDummyMessage[]; |
153 static const uint32 kTestFramesPerPacket; | 153 static const uint32_t kTestFramesPerPacket; |
154 static const int kTestPacketSize; | 154 static const int kTestPacketSize; |
155 static const int kTestFailedErrno; | 155 static const int kTestFailedErrno; |
156 static snd_pcm_t* const kFakeHandle; | 156 static snd_pcm_t* const kFakeHandle; |
157 | 157 |
158 // Used to simulate DeviceNameHint. | 158 // Used to simulate DeviceNameHint. |
159 static char kSurround40[]; | 159 static char kSurround40[]; |
160 static char kSurround41[]; | 160 static char kSurround41[]; |
161 static char kSurround50[]; | 161 static char kSurround50[]; |
162 static char kSurround51[]; | 162 static char kSurround51[]; |
163 static char kSurround70[]; | 163 static char kSurround70[]; |
(...skipping 15 matching lines...) Expand all Loading... |
179 const int AlsaPcmOutputStreamTest::kTestSampleRate = | 179 const int AlsaPcmOutputStreamTest::kTestSampleRate = |
180 AudioParameters::kAudioCDSampleRate; | 180 AudioParameters::kAudioCDSampleRate; |
181 const int AlsaPcmOutputStreamTest::kTestBitsPerSample = 8; | 181 const int AlsaPcmOutputStreamTest::kTestBitsPerSample = 8; |
182 const int AlsaPcmOutputStreamTest::kTestBytesPerFrame = | 182 const int AlsaPcmOutputStreamTest::kTestBytesPerFrame = |
183 AlsaPcmOutputStreamTest::kTestBitsPerSample / 8 * | 183 AlsaPcmOutputStreamTest::kTestBitsPerSample / 8 * |
184 ChannelLayoutToChannelCount(AlsaPcmOutputStreamTest::kTestChannelLayout); | 184 ChannelLayoutToChannelCount(AlsaPcmOutputStreamTest::kTestChannelLayout); |
185 const AudioParameters::Format AlsaPcmOutputStreamTest::kTestFormat = | 185 const AudioParameters::Format AlsaPcmOutputStreamTest::kTestFormat = |
186 AudioParameters::AUDIO_PCM_LINEAR; | 186 AudioParameters::AUDIO_PCM_LINEAR; |
187 const char AlsaPcmOutputStreamTest::kTestDeviceName[] = "TestDevice"; | 187 const char AlsaPcmOutputStreamTest::kTestDeviceName[] = "TestDevice"; |
188 const char AlsaPcmOutputStreamTest::kDummyMessage[] = "dummy"; | 188 const char AlsaPcmOutputStreamTest::kDummyMessage[] = "dummy"; |
189 const uint32 AlsaPcmOutputStreamTest::kTestFramesPerPacket = 1000; | 189 const uint32_t AlsaPcmOutputStreamTest::kTestFramesPerPacket = 1000; |
190 const int AlsaPcmOutputStreamTest::kTestPacketSize = | 190 const int AlsaPcmOutputStreamTest::kTestPacketSize = |
191 AlsaPcmOutputStreamTest::kTestFramesPerPacket * | 191 AlsaPcmOutputStreamTest::kTestFramesPerPacket * |
192 AlsaPcmOutputStreamTest::kTestBytesPerFrame; | 192 AlsaPcmOutputStreamTest::kTestBytesPerFrame; |
193 const int AlsaPcmOutputStreamTest::kTestFailedErrno = -EACCES; | 193 const int AlsaPcmOutputStreamTest::kTestFailedErrno = -EACCES; |
194 snd_pcm_t* const AlsaPcmOutputStreamTest::kFakeHandle = | 194 snd_pcm_t* const AlsaPcmOutputStreamTest::kFakeHandle = |
195 reinterpret_cast<snd_pcm_t*>(1); | 195 reinterpret_cast<snd_pcm_t*>(1); |
196 | 196 |
197 char AlsaPcmOutputStreamTest::kSurround40[] = "surround40:CARD=foo,DEV=0"; | 197 char AlsaPcmOutputStreamTest::kSurround40[] = "surround40:CARD=foo,DEV=0"; |
198 char AlsaPcmOutputStreamTest::kSurround41[] = "surround41:CARD=foo,DEV=0"; | 198 char AlsaPcmOutputStreamTest::kSurround41[] = "surround41:CARD=foo,DEV=0"; |
199 char AlsaPcmOutputStreamTest::kSurround50[] = "surround50:CARD=foo,DEV=0"; | 199 char AlsaPcmOutputStreamTest::kSurround50[] = "surround50:CARD=foo,DEV=0"; |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
266 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); | 266 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)).WillOnce(Return(0)); |
267 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 267 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
268 .WillOnce(Return(kTestDeviceName)); | 268 .WillOnce(Return(kTestDeviceName)); |
269 test_stream->Close(); | 269 test_stream->Close(); |
270 | 270 |
271 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 271 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
272 Mock::VerifyAndClear(mock_manager_.get()); | 272 Mock::VerifyAndClear(mock_manager_.get()); |
273 | 273 |
274 // Test that having more packets ends up with a latency based on packet size. | 274 // Test that having more packets ends up with a latency based on packet size. |
275 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; | 275 const int kOverMinLatencyPacketSize = kPacketFramesInMinLatency + 1; |
276 int64 expected_micros = AlsaPcmOutputStream::FramesToTimeDelta( | 276 int64_t expected_micros = AlsaPcmOutputStream::FramesToTimeDelta( |
277 kOverMinLatencyPacketSize * 2, kTestSampleRate).InMicroseconds(); | 277 kOverMinLatencyPacketSize * 2, kTestSampleRate) |
| 278 .InMicroseconds(); |
278 | 279 |
279 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) | 280 EXPECT_CALL(mock_alsa_wrapper_, PcmOpen(_, _, _, _)) |
280 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); | 281 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), Return(0))); |
281 EXPECT_CALL(mock_alsa_wrapper_, | 282 EXPECT_CALL(mock_alsa_wrapper_, |
282 PcmSetParams(_, _, _, _, _, _, expected_micros)) | 283 PcmSetParams(_, _, _, _, _, _, expected_micros)) |
283 .WillOnce(Return(0)); | 284 .WillOnce(Return(0)); |
284 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) | 285 EXPECT_CALL(mock_alsa_wrapper_, PcmGetParams(_, _, _)) |
285 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), | 286 .WillOnce(DoAll(SetArgumentPointee<1>(kTestFramesPerPacket), |
286 SetArgumentPointee<2>(kTestFramesPerPacket / 2), | 287 SetArgumentPointee<2>(kTestFramesPerPacket / 2), |
287 Return(0))); | 288 Return(0))); |
288 | 289 |
289 test_stream = CreateStream(kTestChannelLayout, | 290 test_stream = CreateStream(kTestChannelLayout, |
290 kOverMinLatencyPacketSize); | 291 kOverMinLatencyPacketSize); |
291 ASSERT_TRUE(test_stream->Open()); | 292 ASSERT_TRUE(test_stream->Open()); |
292 | 293 |
293 // Now close it and test that everything was released. | 294 // Now close it and test that everything was released. |
294 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) | 295 EXPECT_CALL(mock_alsa_wrapper_, PcmClose(kFakeHandle)) |
295 .WillOnce(Return(0)); | 296 .WillOnce(Return(0)); |
296 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) | 297 EXPECT_CALL(mock_alsa_wrapper_, PcmName(kFakeHandle)) |
297 .WillOnce(Return(kTestDeviceName)); | 298 .WillOnce(Return(kTestDeviceName)); |
298 test_stream->Close(); | 299 test_stream->Close(); |
299 | 300 |
300 Mock::VerifyAndClear(&mock_alsa_wrapper_); | 301 Mock::VerifyAndClear(&mock_alsa_wrapper_); |
301 Mock::VerifyAndClear(mock_manager_.get()); | 302 Mock::VerifyAndClear(mock_manager_.get()); |
302 } | 303 } |
303 | 304 |
304 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { | 305 TEST_F(AlsaPcmOutputStreamTest, OpenClose) { |
305 int64 expected_micros = AlsaPcmOutputStream::FramesToTimeDelta( | 306 int64_t expected_micros = AlsaPcmOutputStream::FramesToTimeDelta( |
306 2 * kTestFramesPerPacket, kTestSampleRate).InMicroseconds(); | 307 2 * kTestFramesPerPacket, kTestSampleRate) |
| 308 .InMicroseconds(); |
307 | 309 |
308 // Open() call opens the playback device, sets the parameters, posts a task | 310 // Open() call opens the playback device, sets the parameters, posts a task |
309 // with the resulting configuration data, and transitions the object state to | 311 // with the resulting configuration data, and transitions the object state to |
310 // kIsOpened. | 312 // kIsOpened. |
311 EXPECT_CALL(mock_alsa_wrapper_, | 313 EXPECT_CALL(mock_alsa_wrapper_, |
312 PcmOpen(_, StrEq(kTestDeviceName), | 314 PcmOpen(_, StrEq(kTestDeviceName), |
313 SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) | 315 SND_PCM_STREAM_PLAYBACK, SND_PCM_NONBLOCK)) |
314 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), | 316 .WillOnce(DoAll(SetArgumentPointee<0>(kFakeHandle), |
315 Return(0))); | 317 Return(0))); |
316 EXPECT_CALL(mock_alsa_wrapper_, | 318 EXPECT_CALL(mock_alsa_wrapper_, |
(...skipping 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
848 | 850 |
849 // TODO(ajwong): Find a way to test whether or not another task has been | 851 // TODO(ajwong): Find a way to test whether or not another task has been |
850 // posted so we can verify that the Alsa code will indeed break the task | 852 // posted so we can verify that the Alsa code will indeed break the task |
851 // posting loop. | 853 // posting loop. |
852 | 854 |
853 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed); | 855 test_stream->TransitionTo(AlsaPcmOutputStream::kIsClosed); |
854 test_stream->Close(); | 856 test_stream->Close(); |
855 } | 857 } |
856 | 858 |
857 } // namespace media | 859 } // namespace media |
OLD | NEW |