#ifndef MEDIA_FUCHSIA_AUDIO_FAKE_AUDIO_CAPTURER_H_
#define MEDIA_FUCHSIA_AUDIO_FAKE_AUDIO_CAPTURER_H_
#include <fuchsia/media/cpp/fidl_test_base.h>
#include <lib/fidl/cpp/binding.h>
#include <list>
#include <optional>
#include <vector>
#include "base/fuchsia/scoped_service_binding.h"
#include "base/time/time.h"
#include "base/timer/timer.h"
namespace media {
class FakeAudioCapturer final
: public fuchsia::media::testing::AudioCapturer_TestBase {
public:
enum class DataGeneration {
AUTOMATIC,
MANUAL,
};
static constexpr uint32_t kBufferId = 0;
explicit FakeAudioCapturer(
fidl::InterfaceRequest<fuchsia::media::AudioCapturer> request = {});
~FakeAudioCapturer() override;
FakeAudioCapturer(const FakeAudioCapturer&) = delete;
FakeAudioCapturer& operator=(const FakeAudioCapturer&) = delete;
void Bind(fidl::InterfaceRequest<fuchsia::media::AudioCapturer> request);
bool is_active() const { return is_active_; }
size_t GetPacketSize() const;
void SetDataGeneration(DataGeneration data_generation);
void SendData(base::TimeTicks timestamp, void* data);
void SetPcmStreamType(fuchsia::media::AudioStreamType stream_type) override;
void AddPayloadBuffer(uint32_t id, zx::vmo payload_buffer) override;
void StartAsyncCapture(uint32_t frames_per_packet) override;
void StopAsyncCaptureNoReply() override;
void ReleasePacket(fuchsia::media::StreamPacket packet) override;
void NotImplemented_(const std::string& name) override;
private:
void ProducePackets();
DataGeneration data_generation_ = DataGeneration::AUTOMATIC;
fidl::Binding<fuchsia::media::AudioCapturer> binding_;
zx::vmo buffer_vmo_;
uint64_t buffer_size_ = 0;
std::optional<fuchsia::media::AudioStreamType> stream_type_;
bool is_active_ = false;
size_t frames_per_packet_ = 0;
std::vector<bool> packets_usage_;
base::TimeTicks start_timestamp_;
size_t packet_index_ = 0;
base::OneShotTimer timer_;
};
class FakeAudioCapturerFactory final
: public fuchsia::media::testing::Audio_TestBase {
public:
explicit FakeAudioCapturerFactory(sys::OutgoingDirectory* outgoing_directory);
~FakeAudioCapturerFactory() override;
std::unique_ptr<FakeAudioCapturer> TakeCapturer();
void CreateAudioCapturer(
fidl::InterfaceRequest<fuchsia::media::AudioCapturer> request,
bool loopback) override;
void NotImplemented_(const std::string& name) override;
private:
base::ScopedServiceBinding<fuchsia::media::Audio> binding_;
std::list<std::unique_ptr<FakeAudioCapturer>> capturers_;
};
}
#endif