| 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 <stdint.h> | 5 #include <stdint.h> |
| 6 | 6 |
| 7 #include <memory> | 7 #include <memory> |
| 8 | 8 |
| 9 #include "base/environment.h" | 9 #include "base/environment.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 116 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 127 | 127 |
| 128 // Convenience method which creates a default AudioInputStream object using | 128 // Convenience method which creates a default AudioInputStream object using |
| 129 // a 10ms frame size and a sample rate which is set to the hardware sample | 129 // a 10ms frame size and a sample rate which is set to the hardware sample |
| 130 // rate. | 130 // rate. |
| 131 AudioInputStream* CreateDefaultAudioInputStream() { | 131 AudioInputStream* CreateDefaultAudioInputStream() { |
| 132 int fs = static_cast<int>(AUAudioInputStream::HardwareSampleRate()); | 132 int fs = static_cast<int>(AUAudioInputStream::HardwareSampleRate()); |
| 133 int samples_per_packet = fs / 100; | 133 int samples_per_packet = fs / 100; |
| 134 AudioInputStream* ais = audio_manager_->MakeAudioInputStream( | 134 AudioInputStream* ais = audio_manager_->MakeAudioInputStream( |
| 135 AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, | 135 AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, |
| 136 CHANNEL_LAYOUT_STEREO, fs, 16, samples_per_packet), | 136 CHANNEL_LAYOUT_STEREO, fs, 16, samples_per_packet), |
| 137 AudioDeviceDescription::kDefaultDeviceId); | 137 AudioDeviceDescription::kDefaultDeviceId, |
| 138 base::Bind(&MacAudioInputTest::OnLogMessage, base::Unretained(this))); |
| 138 EXPECT_TRUE(ais); | 139 EXPECT_TRUE(ais); |
| 139 return ais; | 140 return ais; |
| 140 } | 141 } |
| 141 | 142 |
| 142 // Convenience method which creates an AudioInputStream object with a | 143 // Convenience method which creates an AudioInputStream object with a |
| 143 // specified channel layout. | 144 // specified channel layout. |
| 144 AudioInputStream* CreateAudioInputStream(ChannelLayout channel_layout) { | 145 AudioInputStream* CreateAudioInputStream(ChannelLayout channel_layout) { |
| 145 int fs = static_cast<int>(AUAudioInputStream::HardwareSampleRate()); | 146 int fs = static_cast<int>(AUAudioInputStream::HardwareSampleRate()); |
| 146 int samples_per_packet = fs / 100; | 147 int samples_per_packet = fs / 100; |
| 147 AudioInputStream* ais = audio_manager_->MakeAudioInputStream( | 148 AudioInputStream* ais = audio_manager_->MakeAudioInputStream( |
| 148 AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, | 149 AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, channel_layout, |
| 149 fs, 16, samples_per_packet), | 150 fs, 16, samples_per_packet), |
| 150 AudioDeviceDescription::kDefaultDeviceId); | 151 AudioDeviceDescription::kDefaultDeviceId, |
| 152 base::Bind(&MacAudioInputTest::OnLogMessage, base::Unretained(this))); |
| 151 EXPECT_TRUE(ais); | 153 EXPECT_TRUE(ais); |
| 152 return ais; | 154 return ais; |
| 153 } | 155 } |
| 154 | 156 |
| 157 void OnLogMessage(const std::string& message) { log_message_ = message; } |
| 158 |
| 155 base::MessageLoop message_loop_; | 159 base::MessageLoop message_loop_; |
| 156 ScopedAudioManagerPtr audio_manager_; | 160 ScopedAudioManagerPtr audio_manager_; |
| 161 std::string log_message_; |
| 157 }; | 162 }; |
| 158 | 163 |
| 159 // Test Create(), Close(). | 164 // Test Create(), Close(). |
| 160 TEST_F(MacAudioInputTest, AUAudioInputStreamCreateAndClose) { | 165 TEST_F(MacAudioInputTest, AUAudioInputStreamCreateAndClose) { |
| 161 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); | 166 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
| 162 AudioInputStream* ais = CreateDefaultAudioInputStream(); | 167 AudioInputStream* ais = CreateDefaultAudioInputStream(); |
| 163 ais->Close(); | 168 ais->Close(); |
| 164 } | 169 } |
| 165 | 170 |
| 166 // Test Open(), Close(). | 171 // Test Open(), Close(). |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 209 // estimate. | 214 // estimate. |
| 210 base::RunLoop run_loop; | 215 base::RunLoop run_loop; |
| 211 EXPECT_CALL(sink, OnData(ais, NotNull(), _, _)) | 216 EXPECT_CALL(sink, OnData(ais, NotNull(), _, _)) |
| 212 .Times(AtLeast(10)) | 217 .Times(AtLeast(10)) |
| 213 .WillRepeatedly(CheckCountAndPostQuitTask( | 218 .WillRepeatedly(CheckCountAndPostQuitTask( |
| 214 &count, 10, &message_loop_, run_loop.QuitClosure())); | 219 &count, 10, &message_loop_, run_loop.QuitClosure())); |
| 215 ais->Start(&sink); | 220 ais->Start(&sink); |
| 216 run_loop.Run(); | 221 run_loop.Run(); |
| 217 ais->Stop(); | 222 ais->Stop(); |
| 218 ais->Close(); | 223 ais->Close(); |
| 224 |
| 225 EXPECT_FALSE(log_message_.empty()); |
| 219 } | 226 } |
| 220 | 227 |
| 221 // Verify that recording starts and stops correctly in mono using mocked sink. | 228 // Verify that recording starts and stops correctly in mono using mocked sink. |
| 222 TEST_F(MacAudioInputTest, AUAudioInputStreamVerifyStereoRecording) { | 229 TEST_F(MacAudioInputTest, AUAudioInputStreamVerifyStereoRecording) { |
| 223 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); | 230 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
| 224 | 231 |
| 225 int count = 0; | 232 int count = 0; |
| 226 | 233 |
| 227 // Create an audio input stream which records in stereo. | 234 // Create an audio input stream which records in stereo. |
| 228 AudioInputStream* ais = CreateAudioInputStream(CHANNEL_LAYOUT_STEREO); | 235 AudioInputStream* ais = CreateAudioInputStream(CHANNEL_LAYOUT_STEREO); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 242 // more analysis of the delay estimates are done. | 249 // more analysis of the delay estimates are done. |
| 243 base::RunLoop run_loop; | 250 base::RunLoop run_loop; |
| 244 EXPECT_CALL(sink, OnData(ais, NotNull(), _, _)) | 251 EXPECT_CALL(sink, OnData(ais, NotNull(), _, _)) |
| 245 .Times(AtLeast(10)) | 252 .Times(AtLeast(10)) |
| 246 .WillRepeatedly(CheckCountAndPostQuitTask( | 253 .WillRepeatedly(CheckCountAndPostQuitTask( |
| 247 &count, 10, &message_loop_, run_loop.QuitClosure())); | 254 &count, 10, &message_loop_, run_loop.QuitClosure())); |
| 248 ais->Start(&sink); | 255 ais->Start(&sink); |
| 249 run_loop.Run(); | 256 run_loop.Run(); |
| 250 ais->Stop(); | 257 ais->Stop(); |
| 251 ais->Close(); | 258 ais->Close(); |
| 259 |
| 260 EXPECT_FALSE(log_message_.empty()); |
| 252 } | 261 } |
| 253 | 262 |
| 254 // This test is intended for manual tests and should only be enabled | 263 // This test is intended for manual tests and should only be enabled |
| 255 // when it is required to store the captured data on a local file. | 264 // when it is required to store the captured data on a local file. |
| 256 // By default, GTest will print out YOU HAVE 1 DISABLED TEST. | 265 // By default, GTest will print out YOU HAVE 1 DISABLED TEST. |
| 257 // To include disabled tests in test execution, just invoke the test program | 266 // To include disabled tests in test execution, just invoke the test program |
| 258 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS | 267 // with --gtest_also_run_disabled_tests or set the GTEST_ALSO_RUN_DISABLED_TESTS |
| 259 // environment variable to a value greater than 0. | 268 // environment variable to a value greater than 0. |
| 260 TEST_F(MacAudioInputTest, DISABLED_AUAudioInputStreamRecordToFile) { | 269 TEST_F(MacAudioInputTest, DISABLED_AUAudioInputStreamRecordToFile) { |
| 261 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); | 270 ABORT_AUDIO_TEST_IF_NOT(InputDevicesAvailable()); |
| 262 const char* file_name = "out_stereo_10sec.pcm"; | 271 const char* file_name = "out_stereo_10sec.pcm"; |
| 263 | 272 |
| 264 int fs = static_cast<int>(AUAudioInputStream::HardwareSampleRate()); | 273 int fs = static_cast<int>(AUAudioInputStream::HardwareSampleRate()); |
| 265 AudioInputStream* ais = CreateDefaultAudioInputStream(); | 274 AudioInputStream* ais = CreateDefaultAudioInputStream(); |
| 266 EXPECT_TRUE(ais->Open()); | 275 EXPECT_TRUE(ais->Open()); |
| 267 | 276 |
| 268 fprintf(stderr, " File name : %s\n", file_name); | 277 fprintf(stderr, " File name : %s\n", file_name); |
| 269 fprintf(stderr, " Sample rate: %d\n", fs); | 278 fprintf(stderr, " Sample rate: %d\n", fs); |
| 270 WriteToFileAudioSink file_sink(file_name); | 279 WriteToFileAudioSink file_sink(file_name); |
| 271 fprintf(stderr, " >> Speak into the mic while recording...\n"); | 280 fprintf(stderr, " >> Speak into the mic while recording...\n"); |
| 272 ais->Start(&file_sink); | 281 ais->Start(&file_sink); |
| 273 base::PlatformThread::Sleep(TestTimeouts::action_timeout()); | 282 base::PlatformThread::Sleep(TestTimeouts::action_timeout()); |
| 274 ais->Stop(); | 283 ais->Stop(); |
| 275 fprintf(stderr, " >> Recording has stopped.\n"); | 284 fprintf(stderr, " >> Recording has stopped.\n"); |
| 276 ais->Close(); | 285 ais->Close(); |
| 277 } | 286 } |
| 278 | 287 |
| 279 } // namespace media | 288 } // namespace media |
| OLD | NEW |