45 lines
1.3 KiB
C++
45 lines
1.3 KiB
C++
#pragma once
|
|
|
|
#include "AudioInterface.hpp"
|
|
#include <portaudio.h>
|
|
#include <mutex>
|
|
#include <condition_variable>
|
|
#include <queue>
|
|
#include <thread>
|
|
#include <atomic>
|
|
|
|
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<char>& 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<std::vector<char>> outputQueue_;
|
|
std::mutex queueMutex_;
|
|
std::condition_variable queueCv_;
|
|
|
|
std::thread outputThread_;
|
|
std::atomic<bool> shouldStop_{false};
|
|
std::atomic<bool> outputPlaying_{false};
|
|
};
|