// Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include <stddef.h> #include <stdint.h> #include <algorithm> #include <memory> #include "base/environment.h" #include "base/files/file_util.h" #include "base/functional/bind.h" #include "base/logging.h" #include "base/memory/raw_ptr.h" #include "base/path_service.h" #include "base/run_loop.h" #include "base/synchronization/lock.h" #include "base/task/single_thread_task_runner.h" #include "base/test/task_environment.h" #include "base/test/test_timeouts.h" #include "base/time/time.h" #include "build/build_config.h" #include "media/audio/audio_device_description.h" #include "media/audio/audio_device_info_accessor_for_tests.h" #include "media/audio/audio_io.h" #include "media/audio/audio_manager.h" #include "media/audio/audio_unittest_util.h" #include "media/audio/test_audio_thread.h" #include "media/base/seekable_buffer.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace media { namespace { // Limits the number of delay measurements we can store in an array and // then write to file at end of the WASAPIAudioInputOutputFullDuplex test. static const size_t kMaxDelayMeasurements = …; // Name of the output text file. The output file will be stored in the // directory containing media_unittests.exe. // Example: \src\build\Debug\audio_delay_values_ms.txt. // See comments for the WASAPIAudioInputOutputFullDuplex test for more details // about the file format. static const char kDelayValuesFileName[] = …; // Contains delay values which are reported during the full-duplex test. // Total delay = |buffer_delay_ms| + |input_delay_ms| + |output_delay_ms|. struct AudioDelayState { … }; void OnLogMessage(const std::string& message) { … } // Test fixture class. class AudioLowLatencyInputOutputTest : public testing::Test { … }; // This audio source/sink implementation should be used for manual tests // only since delay measurements are stored on an output text file. // All incoming/recorded audio packets are stored in an intermediate media // buffer which the renderer reads from when it needs audio for playout. // The total effect is that recorded audio is played out in loop back using // a sync buffer as temporary storage. class FullDuplexAudioSinkSource : public AudioInputStream::AudioInputCallback, public AudioOutputStream::AudioSourceCallback { … }; class AudioInputStreamTraits { … }; class AudioOutputStreamTraits { … }; // Traits template holding a trait of StreamType. It encapsulates // AudioInputStream and AudioOutputStream stream types. template <typename StreamTraits> class StreamWrapper { … }; AudioInputStreamWrapper; AudioOutputStreamWrapper; // This test is intended for manual tests and should only be enabled // when it is required to make a real-time test of audio in full duplex and // at the same time create a text file which contains measured delay values. // The file can later be analyzed off line using e.g. MATLAB. // MATLAB example: // D=load('audio_delay_values_ms.txt'); // x=cumsum(D(:,1)); // plot(x, D(:,2), x, D(:,3), x, D(:,4), x, D(:,2)+D(:,3)+D(:,4)); // axis([0, max(x), 0, max(D(:,2)+D(:,3)+D(:,4))+10]); // legend('buffer delay','input delay','output delay','total delay'); // xlabel('time [msec]') // ylabel('delay [msec]') // title('Full-duplex audio delay measurement'); TEST_F(AudioLowLatencyInputOutputTest, DISABLED_FullDuplexDelayMeasurement) { … } } // namespace } // namespace media