// Copyright 2023 Citra Emulator Project // Licensed under GPLv2 or any later version // Refer to the license.txt file included. #pragma once #include #include "common/common_types.h" namespace AudioCore { enum class Signedness : u8 { Signed, Unsigned, }; using Samples = std::vector; struct InputParameters { Signedness sign; u8 sample_size; bool buffer_loop; u32 sample_rate; u32 buffer_offset; u32 buffer_size; }; class Input { public: Input() = default; virtual ~Input() = default; /// Starts the microphone. Called by Core virtual void StartSampling(const InputParameters& params) = 0; /// Stops the microphone. Called by Core virtual void StopSampling() = 0; /** * Called from the actual event timing at a constant period under a given sample rate. * When sampling is enabled this function is expected to return a buffer of 16 samples in ideal * conditions, but can be lax if the data is coming in from another source like a real mic. */ virtual Samples Read() = 0; /** * Adjusts the Parameters. Implementations should update the parameters field in addition to * changing the mic to sample according to the new parameters. Called by Core */ virtual void AdjustSampleRate(u32 sample_rate) = 0; /// Value from 0 - 100 to adjust the mic gain setting. Called by Core virtual void SetGain(u8 mic_gain) { gain = mic_gain; } u8 GetGain() const { return gain; } void SetPower(bool power) { powered = power; } bool GetPower() const { return powered; } bool IsSampling() const { return is_sampling; } const InputParameters& GetParameters() const { return parameters; } protected: InputParameters parameters; u8 gain = 0; bool is_sampling = false; bool powered = false; }; } // namespace AudioCore