#pragma once #include "AudioInterface.hpp" #include #include #include #include #include #include class DefaultAudioInterface : public AudioInterface { public: static constexpr int INPUT_FRAMES_PER_BUFFER = 4000; // 250ms @ 16kHz static constexpr int OUTPUT_FRAMES_PER_BUFFER = 1000; // 62.5ms @ 16kHz DefaultAudioInterface(); ~DefaultAudioInterface() override; void start(AudioCallback inputCallback) override; void stop() override; void output(const std::vector& audio) override; void interrupt() override; private: static int inputCallbackStatic(const void* input, void* output, unsigned long frameCount, const PaStreamCallbackTimeInfo* timeInfo, PaStreamCallbackFlags statusFlags, void* userData); int inputCallbackInternal(const void* input, unsigned long frameCount); void outputThreadFunc(); PaStream* inputStream_{}; PaStream* outputStream_{}; AudioCallback inputCallback_; std::queue> outputQueue_; std::mutex queueMutex_; std::condition_variable queueCv_; std::thread outputThread_; std::atomic shouldStop_{false}; std::atomic outputPlaying_{false}; };