// Copyright 2018 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/351564777): Remove this and convert code to safer constructs. #pragma allow_unsafe_buffers #endif #include "services/audio/snooper_node.h" #include <algorithm> #include <memory> #include <optional> #include <string_view> #include <vector> #include "base/command_line.h" #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/test/test_mock_time_task_runner.h" #include "base/time/time.h" #include "media/base/audio_bus.h" #include "media/base/audio_parameters.h" #include "media/base/channel_layout.h" #include "services/audio/test/fake_consumer.h" #include "services/audio/test/fake_loopback_group_member.h" #include "testing/gtest/include/gtest/gtest.h" namespace audio { namespace { // Used to test whether the output AudioBuses have had all their values set to // something finite. constexpr float kInvalidAudioSample = …; // The tones the source should generate into the left and right channels. constexpr double kLeftChannelFrequency = …; constexpr double kRightChannelFrequency = …; constexpr double kSourceVolume = …; // The duration of the audio that flows through the SnooperNode for each test. constexpr base::TimeDelta kTestDuration = …; // The amount of time in the future where the inbound audio is being recorded. // This simulates an audio output stream that has rendered audio that is // scheduled to be played out in the near future. constexpr base::TimeDelta kInputAdvanceTime = …; // Command-line switch to request dumping the recorded output to a WAV file for // analyzing the recorded output from one of the tests. constexpr std::string_view kDumpAsWavSwitch = …; // Test parameters. struct InputAndOutputParams { … }; // Helper so that gtest can produce useful logging of the test parameters. std::ostream& operator<<(std::ostream& out, const InputAndOutputParams& test_params) { … } class SnooperNodeTest : public testing::TestWithParam<InputAndOutputParams> { … }; // The skew test here is generating 10 seconds of audio per iteration, with // 5*5=25 iterations. That's 250 seconds of audio being generated to check for // skew-related issues. That's a lot of processing power needed! Thus, only // enable this test on optimized, non-debug builds, where it will run in a // reasonable amount of time. http://crbug.com/842428 #ifdef NDEBUG #define MAYBE_ContinuousAudioFlowAdaptsToSkew … #else #define MAYBE_ContinuousAudioFlowAdaptsToSkew … #endif // Tests that the internal time-stretching logic can handle various combinations // of input and output skews. TEST_P(SnooperNodeTest, MAYBE_ContinuousAudioFlowAdaptsToSkew) { … } // Tests that gaps in the input are detected, are handled by introducing // zero-fill gaps in the output, and don't throw-off the timing/synchronization // between input and output. TEST_P(SnooperNodeTest, HandlesMissingInput) { … } // Tests that a backwards-jump in input reference timestamps doesn't attempt to // "re-write history" and otherwise maintains the timing/synchronization between // input and output. This is a regression test for http://crbug.com/934770. TEST_P(SnooperNodeTest, HandlesBackwardsInput) { … } // Tests that reasonable render times are suggested as audio is feeding into, or // not feeding into, the SnooperNode. TEST_P(SnooperNodeTest, SuggestsRenderTimes) { … } namespace { // Used in the HandlesSeekedRenderTimes test below. Returns one of 10 possible // tone frequencies to use at the specified time |offset| in the audio. double MapTimeOffsetToATone(base::TimeDelta offset) { … } } // namespace // Tests that the SnooperNode can be asked to seek (forward or backward) its // Render() positions, as the needs of the system demand. TEST_P(SnooperNodeTest, HandlesSeekedRenderTimes) { … } InputAndOutputParams MakeParams( media::ChannelLayoutConfig input_channel_layout_config, int input_sample_rate, int input_frames_per_buffer, media::ChannelLayoutConfig output_channel_layout_config, int output_sample_rate, int output_frames_per_buffer) { … } INSTANTIATE_TEST_SUITE_P(…); } // namespace } // namespace audio