This repository has been archived on 2022-05-21. You can view files and clone it, but cannot push or open issues or pull requests.
glyphs-juke/src/AudioDevice.h

72 lines
1.4 KiB
C
Raw Permalink Normal View History

2021-08-27 04:12:26 +00:00
#pragma once
#include <atomic>
#include <cstdint>
#include <memory>
#include <mutex>
#include <string>
2021-08-28 03:13:52 +00:00
#include <vector>
2021-08-27 04:12:26 +00:00
#define NOMINMAX /* miniaudio includes windows.h */
#include "thirdparty/miniaudio.h"
#undef NOMINMAX
#include "iAudioDevice.h"
#include "iClock.h"
namespace gj {
class AudioDevice : public iAudioDevice, public iClock {
public:
static constexpr auto kFormat = ma_format_f32;
static constexpr auto kChannel = 2;
static constexpr auto kSampleRate = 48000;
AudioDevice(AudioDevice&&) = default;
AudioDevice(const AudioDevice&) = default;
AudioDevice& operator=(AudioDevice&&) = default;
AudioDevice& operator=(const AudioDevice&) = default;
AudioDevice();
~AudioDevice();
2021-08-28 03:13:52 +00:00
void AddEffect(iAudioEffect* fx) override {
std::lock_guard _(mtx_);
effects_.push_back(fx);
}
void RemoveEffect(iAudioEffect* fx) override {
std::lock_guard _(mtx_);
auto itr = std::find(effects_.begin(), effects_.end(), fx);
if (itr == effects_.end()) return;
effects_.erase(itr);
}
2021-08-27 04:12:26 +00:00
2021-08-28 03:13:52 +00:00
uint8_t ch() const override {
return kChannel;
}
2021-08-28 03:13:52 +00:00
uint32_t sampleRate() const override {
return kSampleRate;
}
2021-08-27 04:12:26 +00:00
uint64_t now() const override {
return time_.load() * 1000 / kSampleRate;
}
private:
std::mutex mtx_;
ma_device ma_{0};
std::atomic<uint64_t> time_;
2021-08-28 03:13:52 +00:00
std::vector<iAudioEffect*> effects_;
2021-08-27 04:12:26 +00:00
static void Callback_(ma_device* ma, void* out, const void* in, ma_uint32 framecnt);
};
}