Chromium Code Reviews| Index: webrtc/test/fake_audio_device.h |
| diff --git a/webrtc/test/fake_audio_device.h b/webrtc/test/fake_audio_device.h |
| index 4daeab43650066c258d0bb172a12d14f36fe64c3..386f8390f98fc0eee7f81d1faccf9f4eb433bed8 100644 |
| --- a/webrtc/test/fake_audio_device.h |
| +++ b/webrtc/test/fake_audio_device.h |
| @@ -14,7 +14,10 @@ |
| #include <string> |
| #include <vector> |
| +#include "webrtc/base/array_view.h" |
| +#include "webrtc/base/buffer.h" |
| #include "webrtc/base/criticalsection.h" |
| +#include "webrtc/base/event.h" |
| #include "webrtc/base/platform_thread.h" |
| #include "webrtc/modules/audio_device/include/fake_audio_device.h" |
| #include "webrtc/typedefs.h" |
| @@ -29,18 +32,68 @@ namespace test { |
| // capturer and a renderer. It will use 10ms audio frames. |
| class FakeAudioDevice : public FakeAudioDeviceModule { |
| public: |
| + // Returns the number of samples that Capturers and Renderers with this |
| + // sampling frequency will work with every time Capture or Render is called. |
| + static size_t SamplesPerFrame(int sampling_frequency_in_hz); |
|
kwiberg-webrtc
2017/03/13 14:22:28
Can this function be in the anonymous namespace in
oprypin_webrtc
2017/03/13 15:11:36
I intend to implement more specialized Capturers/R
kwiberg-webrtc
2017/03/14 10:02:03
Acknowledged.
|
| + |
| + class Capturer { |
| + public: |
| + virtual ~Capturer() {} |
| + // Returns the sampling frequency in Hz of the audio data that this |
| + // capturer produces. |
| + virtual int SamplingFrequency() const = 0; |
| + // Captures some audio data and puts it into the passed buffer. The final |
| + // size of the buffer should not exceed its initial size, which is equal to |
| + // SamplesPerFrame. Returns true if the capturer can keep producing data, |
|
kwiberg-webrtc
2017/03/13 14:22:29
Hmmm... why the behavior described in the second s
oprypin_webrtc
2017/03/13 15:11:36
It's just not obvious what 10ms of data is, I thou
kwiberg-webrtc
2017/03/14 10:02:03
Thanks, looks good now.
|
| + // or false when the capture finishes. |
| + virtual bool Capture(rtc::BufferT<int16_t>* buffer) = 0; |
| + }; |
| + |
| + class Renderer { |
| + public: |
| + virtual ~Renderer() {} |
| + // Returns the sampling frequency in Hz of the audio data that this |
| + // renderer receives. |
| + virtual int SamplingFrequency() const = 0; |
| + // Renders the passed audio data and returns true if the renderer wants |
| + // to keep receiving data, or false otherwise. |
| + virtual bool Render(rtc::ArrayView<const int16_t> data) = 0; |
| + }; |
| + |
| // Creates a new FakeAudioDevice. When capturing or playing, 10 ms audio |
| - // frames will be processed every 100ms / |speed|. |
| - // |sampling_frequency_in_hz| can be 8, 16, 32, 44.1 or 48kHz. |
| - // When recording is started, it will generates a signal where every second |
| + // frames will be processed every 10ms / |speed|. |
| + // |capturer| is an object that produces audio data. Can be nullptr if this |
| + // device is never used for recording. |
| + // |renderer| is an object that receives audio data that would have been |
| + // played out. Can be nullptr if this device is never used for playing. |
| + // Use one of the Create... functions to get these instances. |
| + FakeAudioDevice(std::unique_ptr<Capturer> capturer, |
| + std::unique_ptr<Renderer> renderer, |
| + float speed = 1); |
| + ~FakeAudioDevice() override; |
| + |
| + // Returns a Capturer instance that generates a signal where every second |
| // frame is zero and every second frame is evenly distributed random noise |
| // with max amplitude |max_amplitude|. |
| - FakeAudioDevice(float speed, |
| - int sampling_frequency_in_hz, |
| - int16_t max_amplitude); |
| - ~FakeAudioDevice() override; |
| + static std::unique_ptr<Capturer> CreatePulsedNoiseCapturer( |
| + int16_t max_amplitude, int sampling_frequency_in_hz); |
| + |
| + // Returns a Capturer instance that gets its data from a file. |
| + static std::unique_ptr<Capturer> CreateWavFileReader( |
| + std::string filename, int sampling_frequency_in_hz); |
| + |
| + // Returns a Capturer instance that gets its data from a file. |
| + // Automatically detects sample rate. |
| + static std::unique_ptr<Capturer> CreateWavFileReader(std::string filename); |
| + |
| + // Returns a Renderer instance that writes its data to a file. |
| + static std::unique_ptr<Renderer> CreateWavFileWriter( |
| + std::string filename, int sampling_frequency_in_hz); |
| + |
| + // Returns a Renderer instance that does nothing with the audio data. |
| + static std::unique_ptr<Renderer> CreateDiscardRenderer( |
| + int sampling_frequency_in_hz); |
| - private: |
| int32_t Init() override; |
| int32_t RegisterAudioCallback(AudioTransport* callback) override; |
| @@ -52,22 +105,30 @@ class FakeAudioDevice : public FakeAudioDeviceModule { |
| bool Playing() const override; |
| bool Recording() const override; |
| + // Blocks until the Renderer refuses to receive data. |
| + // Returns false if |timeout_ms| passes before that happens. |
| + bool WaitForPlayoutEnd(int timeout_ms = rtc::Event::kForever); |
| + // Blocks until the Recorder stops producing data. |
| + // Returns false if |timeout_ms| passes before that happens. |
| + bool WaitForRecordingEnd(int timeout_ms = rtc::Event::kForever); |
| + |
| + private: |
| static bool Run(void* obj); |
| void ProcessAudio(); |
| - const int sampling_frequency_in_hz_; |
| - const size_t num_samples_per_frame_; |
| + const std::unique_ptr<Capturer> capturer_ GUARDED_BY(lock_); |
| + const std::unique_ptr<Renderer> renderer_ GUARDED_BY(lock_); |
| const float speed_; |
| rtc::CriticalSection lock_; |
| AudioTransport* audio_callback_ GUARDED_BY(lock_); |
| bool rendering_ GUARDED_BY(lock_); |
| bool capturing_ GUARDED_BY(lock_); |
| - |
| - class PulsedNoiseCapturer; |
| - const std::unique_ptr<PulsedNoiseCapturer> capturer_ GUARDED_BY(lock_); |
| + rtc::Event done_rendering_; |
| + rtc::Event done_capturing_; |
| std::vector<int16_t> playout_buffer_ GUARDED_BY(lock_); |
| + rtc::BufferT<int16_t> recording_buffer_ GUARDED_BY(lock_); |
| std::unique_ptr<EventTimerWrapper> tick_; |
| rtc::PlatformThread thread_; |