| 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/android/build_info.h" | 5 #include "base/android/build_info.h" |
| 6 #include "base/basictypes.h" | 6 #include "base/basictypes.h" |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/files/file_util.h" | 8 #include "base/files/file_util.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "base/message_loop/message_loop.h" | 10 #include "base/message_loop/message_loop.h" |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 84 | 84 |
| 85 static double ExpectedTimeBetweenCallbacks(AudioParameters params) { | 85 static double ExpectedTimeBetweenCallbacks(AudioParameters params) { |
| 86 return (base::TimeDelta::FromMicroseconds( | 86 return (base::TimeDelta::FromMicroseconds( |
| 87 params.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / | 87 params.frames_per_buffer() * base::Time::kMicrosecondsPerSecond / |
| 88 static_cast<double>(params.sample_rate()))).InMillisecondsF(); | 88 static_cast<double>(params.sample_rate()))).InMillisecondsF(); |
| 89 } | 89 } |
| 90 | 90 |
| 91 // Helper method which verifies that the device list starts with a valid | 91 // Helper method which verifies that the device list starts with a valid |
| 92 // default device name followed by non-default device names. | 92 // default device name followed by non-default device names. |
| 93 static void CheckDeviceNames(const AudioDeviceNames& device_names) { | 93 static void CheckDeviceNames(const AudioDeviceNames& device_names) { |
| 94 VLOG(2) << "Got " << device_names.size() << " audio devices."; | 94 DVLOG(2) << "Got " << device_names.size() << " audio devices."; |
| 95 if (device_names.empty()) { | 95 if (device_names.empty()) { |
| 96 // Log a warning so we can see the status on the build bots. No need to | 96 // Log a warning so we can see the status on the build bots. No need to |
| 97 // break the test though since this does successfully test the code and | 97 // break the test though since this does successfully test the code and |
| 98 // some failure cases. | 98 // some failure cases. |
| 99 LOG(WARNING) << "No input devices detected"; | 99 LOG(WARNING) << "No input devices detected"; |
| 100 return; | 100 return; |
| 101 } | 101 } |
| 102 | 102 |
| 103 AudioDeviceNames::const_iterator it = device_names.begin(); | 103 AudioDeviceNames::const_iterator it = device_names.begin(); |
| 104 | 104 |
| 105 // The first device in the list should always be the default device. | 105 // The first device in the list should always be the default device. |
| 106 EXPECT_EQ(std::string(AudioManagerBase::kDefaultDeviceName), | 106 EXPECT_EQ(std::string(AudioManagerBase::kDefaultDeviceName), |
| 107 it->device_name); | 107 it->device_name); |
| 108 EXPECT_EQ(std::string(AudioManagerBase::kDefaultDeviceId), it->unique_id); | 108 EXPECT_EQ(std::string(AudioManagerBase::kDefaultDeviceId), it->unique_id); |
| 109 ++it; | 109 ++it; |
| 110 | 110 |
| 111 // Other devices should have non-empty name and id and should not contain | 111 // Other devices should have non-empty name and id and should not contain |
| 112 // default name or id. | 112 // default name or id. |
| 113 while (it != device_names.end()) { | 113 while (it != device_names.end()) { |
| 114 EXPECT_FALSE(it->device_name.empty()); | 114 EXPECT_FALSE(it->device_name.empty()); |
| 115 EXPECT_FALSE(it->unique_id.empty()); | 115 EXPECT_FALSE(it->unique_id.empty()); |
| 116 VLOG(2) << "Device ID(" << it->unique_id | 116 DVLOG(2) << "Device ID(" << it->unique_id |
| 117 << "), label: " << it->device_name; | 117 << "), label: " << it->device_name; |
| 118 EXPECT_NE(std::string(AudioManagerBase::kDefaultDeviceName), | 118 EXPECT_NE(std::string(AudioManagerBase::kDefaultDeviceName), |
| 119 it->device_name); | 119 it->device_name); |
| 120 EXPECT_NE(std::string(AudioManagerBase::kDefaultDeviceId), | 120 EXPECT_NE(std::string(AudioManagerBase::kDefaultDeviceId), |
| 121 it->unique_id); | 121 it->unique_id); |
| 122 ++it; | 122 ++it; |
| 123 } | 123 } |
| 124 } | 124 } |
| 125 | 125 |
| 126 // We clear the data bus to ensure that the test does not cause noise. | 126 // We clear the data bus to ensure that the test does not cause noise. |
| 127 static int RealOnMoreData(AudioBus* dest, uint32 total_bytes_delay) { | 127 static int RealOnMoreData(AudioBus* dest, uint32 total_bytes_delay) { |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 class FileAudioSource : public AudioOutputStream::AudioSourceCallback { | 162 class FileAudioSource : public AudioOutputStream::AudioSourceCallback { |
| 163 public: | 163 public: |
| 164 explicit FileAudioSource(base::WaitableEvent* event, const std::string& name) | 164 explicit FileAudioSource(base::WaitableEvent* event, const std::string& name) |
| 165 : event_(event), pos_(0) { | 165 : event_(event), pos_(0) { |
| 166 // Reads a test file from media/test/data directory and stores it in | 166 // Reads a test file from media/test/data directory and stores it in |
| 167 // a DecoderBuffer. | 167 // a DecoderBuffer. |
| 168 file_ = ReadTestDataFile(name); | 168 file_ = ReadTestDataFile(name); |
| 169 | 169 |
| 170 // Log the name of the file which is used as input for this test. | 170 // Log the name of the file which is used as input for this test. |
| 171 base::FilePath file_path = GetTestDataFilePath(name); | 171 base::FilePath file_path = GetTestDataFilePath(name); |
| 172 VLOG(0) << "Reading from file: " << file_path.value().c_str(); | 172 DVLOG(0) << "Reading from file: " << file_path.value().c_str(); |
| 173 } | 173 } |
| 174 | 174 |
| 175 virtual ~FileAudioSource() {} | 175 virtual ~FileAudioSource() {} |
| 176 | 176 |
| 177 // AudioOutputStream::AudioSourceCallback implementation. | 177 // AudioOutputStream::AudioSourceCallback implementation. |
| 178 | 178 |
| 179 // Use samples read from a data file and fill up the audio buffer | 179 // Use samples read from a data file and fill up the audio buffer |
| 180 // provided to us in the callback. | 180 // provided to us in the callback. |
| 181 virtual int OnMoreData(AudioBus* audio_bus, | 181 virtual int OnMoreData(AudioBus* audio_bus, |
| 182 uint32 total_bytes_delay) override { | 182 uint32 total_bytes_delay) override { |
| (...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 233 // Allocate space for ~10 seconds of data. | 233 // Allocate space for ~10 seconds of data. |
| 234 const int kMaxBufferSize = 10 * params.GetBytesPerSecond(); | 234 const int kMaxBufferSize = 10 * params.GetBytesPerSecond(); |
| 235 buffer_.reset(new media::SeekableBuffer(0, kMaxBufferSize)); | 235 buffer_.reset(new media::SeekableBuffer(0, kMaxBufferSize)); |
| 236 | 236 |
| 237 // Open up the binary file which will be written to in the destructor. | 237 // Open up the binary file which will be written to in the destructor. |
| 238 base::FilePath file_path; | 238 base::FilePath file_path; |
| 239 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); | 239 EXPECT_TRUE(PathService::Get(base::DIR_SOURCE_ROOT, &file_path)); |
| 240 file_path = file_path.AppendASCII(file_name.c_str()); | 240 file_path = file_path.AppendASCII(file_name.c_str()); |
| 241 binary_file_ = base::OpenFile(file_path, "wb"); | 241 binary_file_ = base::OpenFile(file_path, "wb"); |
| 242 DLOG_IF(ERROR, !binary_file_) << "Failed to open binary PCM data file."; | 242 DLOG_IF(ERROR, !binary_file_) << "Failed to open binary PCM data file."; |
| 243 VLOG(0) << "Writing to file: " << file_path.value().c_str(); | 243 DVLOG(0) << "Writing to file: " << file_path.value().c_str(); |
| 244 } | 244 } |
| 245 | 245 |
| 246 virtual ~FileAudioSink() { | 246 virtual ~FileAudioSink() { |
| 247 int bytes_written = 0; | 247 int bytes_written = 0; |
| 248 while (bytes_written < buffer_->forward_capacity()) { | 248 while (bytes_written < buffer_->forward_capacity()) { |
| 249 const uint8* chunk; | 249 const uint8* chunk; |
| 250 int chunk_size; | 250 int chunk_size; |
| 251 | 251 |
| 252 // Stop writing if no more data is available. | 252 // Stop writing if no more data is available. |
| 253 if (!buffer_->GetCurrentChunk(&chunk, &chunk_size)) | 253 if (!buffer_->GetCurrentChunk(&chunk, &chunk_size)) |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 505 OpenAndStartAudioOutputStreamOnAudioThread(&source); | 505 OpenAndStartAudioOutputStreamOnAudioThread(&source); |
| 506 | 506 |
| 507 start_time_ = base::TimeTicks::Now(); | 507 start_time_ = base::TimeTicks::Now(); |
| 508 loop()->Run(); | 508 loop()->Run(); |
| 509 end_time_ = base::TimeTicks::Now(); | 509 end_time_ = base::TimeTicks::Now(); |
| 510 | 510 |
| 511 StopAndCloseAudioOutputStreamOnAudioThread(); | 511 StopAndCloseAudioOutputStreamOnAudioThread(); |
| 512 | 512 |
| 513 double average_time_between_callbacks_ms = | 513 double average_time_between_callbacks_ms = |
| 514 AverageTimeBetweenCallbacks(num_callbacks); | 514 AverageTimeBetweenCallbacks(num_callbacks); |
| 515 VLOG(0) << "expected time between callbacks: " | 515 DVLOG(0) << "expected time between callbacks: " |
| 516 << expected_time_between_callbacks_ms << " ms"; | 516 << expected_time_between_callbacks_ms << " ms"; |
| 517 VLOG(0) << "average time between callbacks: " | 517 DVLOG(0) << "average time between callbacks: " |
| 518 << average_time_between_callbacks_ms << " ms"; | 518 << average_time_between_callbacks_ms << " ms"; |
| 519 EXPECT_GE(average_time_between_callbacks_ms, | 519 EXPECT_GE(average_time_between_callbacks_ms, |
| 520 0.70 * expected_time_between_callbacks_ms); | 520 0.70 * expected_time_between_callbacks_ms); |
| 521 EXPECT_LE(average_time_between_callbacks_ms, | 521 EXPECT_LE(average_time_between_callbacks_ms, |
| 522 1.50 * expected_time_between_callbacks_ms); | 522 1.50 * expected_time_between_callbacks_ms); |
| 523 } | 523 } |
| 524 | 524 |
| 525 void GetDefaultOutputStreamParameters() { | 525 void GetDefaultOutputStreamParameters() { |
| 526 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 526 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); |
| 527 audio_output_parameters_ = | 527 audio_output_parameters_ = |
| 528 audio_manager()->GetDefaultOutputStreamParameters(); | 528 audio_manager()->GetDefaultOutputStreamParameters(); |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 659 OpenAndStartAudioInputStreamOnAudioThread(&sink); | 659 OpenAndStartAudioInputStreamOnAudioThread(&sink); |
| 660 | 660 |
| 661 start_time_ = base::TimeTicks::Now(); | 661 start_time_ = base::TimeTicks::Now(); |
| 662 loop()->Run(); | 662 loop()->Run(); |
| 663 end_time_ = base::TimeTicks::Now(); | 663 end_time_ = base::TimeTicks::Now(); |
| 664 | 664 |
| 665 StopAndCloseAudioInputStreamOnAudioThread(); | 665 StopAndCloseAudioInputStreamOnAudioThread(); |
| 666 | 666 |
| 667 double average_time_between_callbacks_ms = | 667 double average_time_between_callbacks_ms = |
| 668 AverageTimeBetweenCallbacks(num_callbacks); | 668 AverageTimeBetweenCallbacks(num_callbacks); |
| 669 VLOG(0) << "expected time between callbacks: " | 669 DVLOG(0) << "expected time between callbacks: " |
| 670 << expected_time_between_callbacks_ms << " ms"; | 670 << expected_time_between_callbacks_ms << " ms"; |
| 671 VLOG(0) << "average time between callbacks: " | 671 DVLOG(0) << "average time between callbacks: " |
| 672 << average_time_between_callbacks_ms << " ms"; | 672 << average_time_between_callbacks_ms << " ms"; |
| 673 EXPECT_GE(average_time_between_callbacks_ms, | 673 EXPECT_GE(average_time_between_callbacks_ms, |
| 674 0.70 * expected_time_between_callbacks_ms); | 674 0.70 * expected_time_between_callbacks_ms); |
| 675 EXPECT_LE(average_time_between_callbacks_ms, | 675 EXPECT_LE(average_time_between_callbacks_ms, |
| 676 1.30 * expected_time_between_callbacks_ms); | 676 1.30 * expected_time_between_callbacks_ms); |
| 677 } | 677 } |
| 678 | 678 |
| 679 void GetDefaultInputStreamParameters() { | 679 void GetDefaultInputStreamParameters() { |
| 680 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); | 680 DCHECK(audio_manager()->GetTaskRunner()->BelongsToCurrentThread()); |
| 681 audio_input_parameters_ = audio_manager()->GetInputStreamParameters( | 681 audio_input_parameters_ = audio_manager()->GetInputStreamParameters( |
| 682 AudioManagerBase::kDefaultDeviceId); | 682 AudioManagerBase::kDefaultDeviceId); |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 715 private: | 715 private: |
| 716 DISALLOW_COPY_AND_ASSIGN(AudioAndroidInputTest); | 716 DISALLOW_COPY_AND_ASSIGN(AudioAndroidInputTest); |
| 717 }; | 717 }; |
| 718 | 718 |
| 719 // Get the default audio input parameters and log the result. | 719 // Get the default audio input parameters and log the result. |
| 720 TEST_P(AudioAndroidInputTest, GetDefaultInputStreamParameters) { | 720 TEST_P(AudioAndroidInputTest, GetDefaultInputStreamParameters) { |
| 721 // We don't go through AudioAndroidInputTest::GetInputStreamParameters() here | 721 // We don't go through AudioAndroidInputTest::GetInputStreamParameters() here |
| 722 // so that we can log the real (non-overridden) values of the effects. | 722 // so that we can log the real (non-overridden) values of the effects. |
| 723 GetDefaultInputStreamParametersOnAudioThread(); | 723 GetDefaultInputStreamParametersOnAudioThread(); |
| 724 EXPECT_TRUE(audio_input_parameters().IsValid()); | 724 EXPECT_TRUE(audio_input_parameters().IsValid()); |
| 725 VLOG(1) << audio_input_parameters(); | 725 DVLOG(1) << audio_input_parameters(); |
| 726 } | 726 } |
| 727 | 727 |
| 728 // Get the default audio output parameters and log the result. | 728 // Get the default audio output parameters and log the result. |
| 729 TEST_F(AudioAndroidOutputTest, GetDefaultOutputStreamParameters) { | 729 TEST_F(AudioAndroidOutputTest, GetDefaultOutputStreamParameters) { |
| 730 GetDefaultOutputStreamParametersOnAudioThread(); | 730 GetDefaultOutputStreamParametersOnAudioThread(); |
| 731 VLOG(1) << audio_output_parameters(); | 731 DVLOG(1) << audio_output_parameters(); |
| 732 } | 732 } |
| 733 | 733 |
| 734 // Verify input device enumeration. | 734 // Verify input device enumeration. |
| 735 TEST_F(AudioAndroidInputTest, GetAudioInputDeviceNames) { | 735 TEST_F(AudioAndroidInputTest, GetAudioInputDeviceNames) { |
| 736 if (!audio_manager()->HasAudioInputDevices()) | 736 if (!audio_manager()->HasAudioInputDevices()) |
| 737 return; | 737 return; |
| 738 AudioDeviceNames devices; | 738 AudioDeviceNames devices; |
| 739 RunOnAudioThread( | 739 RunOnAudioThread( |
| 740 base::Bind(&AudioManager::GetAudioInputDeviceNames, | 740 base::Bind(&AudioManager::GetAudioInputDeviceNames, |
| 741 base::Unretained(audio_manager()), | 741 base::Unretained(audio_manager()), |
| (...skipping 91 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 833 audio_output_parameters().sample_rate() / 100); | 833 audio_output_parameters().sample_rate() / 100); |
| 834 StartOutputStreamCallbacks(params); | 834 StartOutputStreamCallbacks(params); |
| 835 } | 835 } |
| 836 | 836 |
| 837 // Play out a PCM file segment in real time and allow the user to verify that | 837 // Play out a PCM file segment in real time and allow the user to verify that |
| 838 // the rendered audio sounds OK. | 838 // the rendered audio sounds OK. |
| 839 // NOTE: this test requires user interaction and is not designed to run as an | 839 // NOTE: this test requires user interaction and is not designed to run as an |
| 840 // automatized test on bots. | 840 // automatized test on bots. |
| 841 TEST_F(AudioAndroidOutputTest, DISABLED_RunOutputStreamWithFileAsSource) { | 841 TEST_F(AudioAndroidOutputTest, DISABLED_RunOutputStreamWithFileAsSource) { |
| 842 GetDefaultOutputStreamParametersOnAudioThread(); | 842 GetDefaultOutputStreamParametersOnAudioThread(); |
| 843 VLOG(1) << audio_output_parameters(); | 843 DVLOG(1) << audio_output_parameters(); |
| 844 MakeAudioOutputStreamOnAudioThread(audio_output_parameters()); | 844 MakeAudioOutputStreamOnAudioThread(audio_output_parameters()); |
| 845 | 845 |
| 846 std::string file_name; | 846 std::string file_name; |
| 847 const AudioParameters params = audio_output_parameters(); | 847 const AudioParameters params = audio_output_parameters(); |
| 848 if (params.sample_rate() == 48000 && params.channels() == 2) { | 848 if (params.sample_rate() == 48000 && params.channels() == 2) { |
| 849 file_name = kSpeechFile_16b_s_48k; | 849 file_name = kSpeechFile_16b_s_48k; |
| 850 } else if (params.sample_rate() == 48000 && params.channels() == 1) { | 850 } else if (params.sample_rate() == 48000 && params.channels() == 1) { |
| 851 file_name = kSpeechFile_16b_m_48k; | 851 file_name = kSpeechFile_16b_m_48k; |
| 852 } else if (params.sample_rate() == 44100 && params.channels() == 2) { | 852 } else if (params.sample_rate() == 44100 && params.channels() == 2) { |
| 853 file_name = kSpeechFile_16b_s_44k; | 853 file_name = kSpeechFile_16b_s_44k; |
| 854 } else if (params.sample_rate() == 44100 && params.channels() == 1) { | 854 } else if (params.sample_rate() == 44100 && params.channels() == 1) { |
| 855 file_name = kSpeechFile_16b_m_44k; | 855 file_name = kSpeechFile_16b_m_44k; |
| 856 } else { | 856 } else { |
| 857 FAIL() << "This test supports 44.1kHz and 48kHz mono/stereo only."; | 857 FAIL() << "This test supports 44.1kHz and 48kHz mono/stereo only."; |
| 858 return; | 858 return; |
| 859 } | 859 } |
| 860 | 860 |
| 861 base::WaitableEvent event(false, false); | 861 base::WaitableEvent event(false, false); |
| 862 FileAudioSource source(&event, file_name); | 862 FileAudioSource source(&event, file_name); |
| 863 | 863 |
| 864 OpenAndStartAudioOutputStreamOnAudioThread(&source); | 864 OpenAndStartAudioOutputStreamOnAudioThread(&source); |
| 865 VLOG(0) << ">> Verify that the file is played out correctly..."; | 865 DVLOG(0) << ">> Verify that the file is played out correctly..."; |
| 866 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); | 866 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); |
| 867 StopAndCloseAudioOutputStreamOnAudioThread(); | 867 StopAndCloseAudioOutputStreamOnAudioThread(); |
| 868 } | 868 } |
| 869 | 869 |
| 870 // Start input streaming and run it for ten seconds while recording to a | 870 // Start input streaming and run it for ten seconds while recording to a |
| 871 // local audio file. | 871 // local audio file. |
| 872 // NOTE: this test requires user interaction and is not designed to run as an | 872 // NOTE: this test requires user interaction and is not designed to run as an |
| 873 // automatized test on bots. | 873 // automatized test on bots. |
| 874 TEST_P(AudioAndroidInputTest, DISABLED_RunSimplexInputStreamWithFileAsSink) { | 874 TEST_P(AudioAndroidInputTest, DISABLED_RunSimplexInputStreamWithFileAsSink) { |
| 875 AudioParameters params = GetInputStreamParameters(); | 875 AudioParameters params = GetInputStreamParameters(); |
| 876 VLOG(1) << params; | 876 DVLOG(1) << params; |
| 877 MakeAudioInputStreamOnAudioThread(params); | 877 MakeAudioInputStreamOnAudioThread(params); |
| 878 | 878 |
| 879 std::string file_name = base::StringPrintf("out_simplex_%d_%d_%d.pcm", | 879 std::string file_name = base::StringPrintf("out_simplex_%d_%d_%d.pcm", |
| 880 params.sample_rate(), | 880 params.sample_rate(), |
| 881 params.frames_per_buffer(), | 881 params.frames_per_buffer(), |
| 882 params.channels()); | 882 params.channels()); |
| 883 | 883 |
| 884 base::WaitableEvent event(false, false); | 884 base::WaitableEvent event(false, false); |
| 885 FileAudioSink sink(&event, params, file_name); | 885 FileAudioSink sink(&event, params, file_name); |
| 886 | 886 |
| 887 OpenAndStartAudioInputStreamOnAudioThread(&sink); | 887 OpenAndStartAudioInputStreamOnAudioThread(&sink); |
| 888 VLOG(0) << ">> Speak into the microphone to record audio..."; | 888 DVLOG(0) << ">> Speak into the microphone to record audio..."; |
| 889 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); | 889 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); |
| 890 StopAndCloseAudioInputStreamOnAudioThread(); | 890 StopAndCloseAudioInputStreamOnAudioThread(); |
| 891 } | 891 } |
| 892 | 892 |
| 893 // Same test as RunSimplexInputStreamWithFileAsSink but this time output | 893 // Same test as RunSimplexInputStreamWithFileAsSink but this time output |
| 894 // streaming is active as well (reads zeros only). | 894 // streaming is active as well (reads zeros only). |
| 895 // NOTE: this test requires user interaction and is not designed to run as an | 895 // NOTE: this test requires user interaction and is not designed to run as an |
| 896 // automatized test on bots. | 896 // automatized test on bots. |
| 897 TEST_P(AudioAndroidInputTest, DISABLED_RunDuplexInputStreamWithFileAsSink) { | 897 TEST_P(AudioAndroidInputTest, DISABLED_RunDuplexInputStreamWithFileAsSink) { |
| 898 AudioParameters in_params = GetInputStreamParameters(); | 898 AudioParameters in_params = GetInputStreamParameters(); |
| 899 VLOG(1) << in_params; | 899 DVLOG(1) << in_params; |
| 900 MakeAudioInputStreamOnAudioThread(in_params); | 900 MakeAudioInputStreamOnAudioThread(in_params); |
| 901 | 901 |
| 902 GetDefaultOutputStreamParametersOnAudioThread(); | 902 GetDefaultOutputStreamParametersOnAudioThread(); |
| 903 VLOG(1) << audio_output_parameters(); | 903 DVLOG(1) << audio_output_parameters(); |
| 904 MakeAudioOutputStreamOnAudioThread(audio_output_parameters()); | 904 MakeAudioOutputStreamOnAudioThread(audio_output_parameters()); |
| 905 | 905 |
| 906 std::string file_name = base::StringPrintf("out_duplex_%d_%d_%d.pcm", | 906 std::string file_name = base::StringPrintf("out_duplex_%d_%d_%d.pcm", |
| 907 in_params.sample_rate(), | 907 in_params.sample_rate(), |
| 908 in_params.frames_per_buffer(), | 908 in_params.frames_per_buffer(), |
| 909 in_params.channels()); | 909 in_params.channels()); |
| 910 | 910 |
| 911 base::WaitableEvent event(false, false); | 911 base::WaitableEvent event(false, false); |
| 912 FileAudioSink sink(&event, in_params, file_name); | 912 FileAudioSink sink(&event, in_params, file_name); |
| 913 MockAudioSourceCallback source; | 913 MockAudioSourceCallback source; |
| 914 | 914 |
| 915 EXPECT_CALL(source, OnMoreData(NotNull(), _)) | 915 EXPECT_CALL(source, OnMoreData(NotNull(), _)) |
| 916 .WillRepeatedly(Invoke(RealOnMoreData)); | 916 .WillRepeatedly(Invoke(RealOnMoreData)); |
| 917 EXPECT_CALL(source, OnError(audio_output_stream_)).Times(0); | 917 EXPECT_CALL(source, OnError(audio_output_stream_)).Times(0); |
| 918 | 918 |
| 919 OpenAndStartAudioInputStreamOnAudioThread(&sink); | 919 OpenAndStartAudioInputStreamOnAudioThread(&sink); |
| 920 OpenAndStartAudioOutputStreamOnAudioThread(&source); | 920 OpenAndStartAudioOutputStreamOnAudioThread(&source); |
| 921 VLOG(0) << ">> Speak into the microphone to record audio"; | 921 DVLOG(0) << ">> Speak into the microphone to record audio"; |
| 922 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); | 922 EXPECT_TRUE(event.TimedWait(TestTimeouts::action_max_timeout())); |
| 923 StopAndCloseAudioOutputStreamOnAudioThread(); | 923 StopAndCloseAudioOutputStreamOnAudioThread(); |
| 924 StopAndCloseAudioInputStreamOnAudioThread(); | 924 StopAndCloseAudioInputStreamOnAudioThread(); |
| 925 } | 925 } |
| 926 | 926 |
| 927 // Start audio in both directions while feeding captured data into a FIFO so | 927 // Start audio in both directions while feeding captured data into a FIFO so |
| 928 // it can be read directly (in loopback) by the render side. A small extra | 928 // it can be read directly (in loopback) by the render side. A small extra |
| 929 // delay will be added by the FIFO and an estimate of this delay will be | 929 // delay will be added by the FIFO and an estimate of this delay will be |
| 930 // printed out during the test. | 930 // printed out during the test. |
| 931 // NOTE: this test requires user interaction and is not designed to run as an | 931 // NOTE: this test requires user interaction and is not designed to run as an |
| 932 // automatized test on bots. | 932 // automatized test on bots. |
| 933 TEST_P(AudioAndroidInputTest, | 933 TEST_P(AudioAndroidInputTest, |
| 934 DISABLED_RunSymmetricInputAndOutputStreamsInFullDuplex) { | 934 DISABLED_RunSymmetricInputAndOutputStreamsInFullDuplex) { |
| 935 // Get native audio parameters for the input side. | 935 // Get native audio parameters for the input side. |
| 936 AudioParameters default_input_params = GetInputStreamParameters(); | 936 AudioParameters default_input_params = GetInputStreamParameters(); |
| 937 | 937 |
| 938 // Modify the parameters so that both input and output can use the same | 938 // Modify the parameters so that both input and output can use the same |
| 939 // parameters by selecting 10ms as buffer size. This will also ensure that | 939 // parameters by selecting 10ms as buffer size. This will also ensure that |
| 940 // the output stream will be a mono stream since mono is default for input | 940 // the output stream will be a mono stream since mono is default for input |
| 941 // audio on Android. | 941 // audio on Android. |
| 942 AudioParameters io_params(default_input_params.format(), | 942 AudioParameters io_params(default_input_params.format(), |
| 943 default_input_params.channel_layout(), | 943 default_input_params.channel_layout(), |
| 944 ChannelLayoutToChannelCount( | 944 ChannelLayoutToChannelCount( |
| 945 default_input_params.channel_layout()), | 945 default_input_params.channel_layout()), |
| 946 default_input_params.sample_rate(), | 946 default_input_params.sample_rate(), |
| 947 default_input_params.bits_per_sample(), | 947 default_input_params.bits_per_sample(), |
| 948 default_input_params.sample_rate() / 100, | 948 default_input_params.sample_rate() / 100, |
| 949 default_input_params.effects()); | 949 default_input_params.effects()); |
| 950 VLOG(1) << io_params; | 950 DVLOG(1) << io_params; |
| 951 | 951 |
| 952 // Create input and output streams using the common audio parameters. | 952 // Create input and output streams using the common audio parameters. |
| 953 MakeAudioInputStreamOnAudioThread(io_params); | 953 MakeAudioInputStreamOnAudioThread(io_params); |
| 954 MakeAudioOutputStreamOnAudioThread(io_params); | 954 MakeAudioOutputStreamOnAudioThread(io_params); |
| 955 | 955 |
| 956 FullDuplexAudioSinkSource full_duplex(io_params); | 956 FullDuplexAudioSinkSource full_duplex(io_params); |
| 957 | 957 |
| 958 // Start a full duplex audio session and print out estimates of the extra | 958 // Start a full duplex audio session and print out estimates of the extra |
| 959 // delay we should expect from the FIFO. If real-time delay measurements are | 959 // delay we should expect from the FIFO. If real-time delay measurements are |
| 960 // performed, the result should be reduced by this extra delay since it is | 960 // performed, the result should be reduced by this extra delay since it is |
| 961 // something that has been added by the test. | 961 // something that has been added by the test. |
| 962 OpenAndStartAudioInputStreamOnAudioThread(&full_duplex); | 962 OpenAndStartAudioInputStreamOnAudioThread(&full_duplex); |
| 963 OpenAndStartAudioOutputStreamOnAudioThread(&full_duplex); | 963 OpenAndStartAudioOutputStreamOnAudioThread(&full_duplex); |
| 964 VLOG(1) << "HINT: an estimate of the extra FIFO delay will be updated " | 964 DVLOG(1) << "HINT: an estimate of the extra FIFO delay will be updated " |
| 965 << "once per second during this test."; | 965 << "once per second during this test."; |
| 966 VLOG(0) << ">> Speak into the mic and listen to the audio in loopback..."; | 966 DVLOG(0) << ">> Speak into the mic and listen to the audio in loopback..."; |
| 967 fflush(stdout); | 967 fflush(stdout); |
| 968 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); | 968 base::PlatformThread::Sleep(base::TimeDelta::FromSeconds(20)); |
| 969 printf("\n"); | 969 printf("\n"); |
| 970 StopAndCloseAudioOutputStreamOnAudioThread(); | 970 StopAndCloseAudioOutputStreamOnAudioThread(); |
| 971 StopAndCloseAudioInputStreamOnAudioThread(); | 971 StopAndCloseAudioInputStreamOnAudioThread(); |
| 972 } | 972 } |
| 973 | 973 |
| 974 INSTANTIATE_TEST_CASE_P(AudioAndroidInputTest, AudioAndroidInputTest, | 974 INSTANTIATE_TEST_CASE_P(AudioAndroidInputTest, AudioAndroidInputTest, |
| 975 testing::ValuesIn(RunAudioRecordInputPathTests())); | 975 testing::ValuesIn(RunAudioRecordInputPathTests())); |
| 976 | 976 |
| 977 } // namespace media | 977 } // namespace media |
| OLD | NEW |