// BlockyFroggy
// Copyright © 2017 John Ryland.
// All rights reserved.
#pragma once
#ifndef AUDIO_RENDERER_H
#define AUDIO_RENDERER_H
#include <memory>
enum SampleRate
{
SampleRate_8000Hz = 8000,
SampleRate_22050Hz = 22050,
SampleRate_44100Hz = 44100,
};
enum BitsPerChannel
{
Bits_8 = 8,
Bits_16 = 16
};
enum Channels
{
Mono = 1,
Stereo = 2
};
class AudioRenderer
{
public:
AudioRenderer();
virtual ~AudioRenderer();
void initialize(SampleRate a_rate, BitsPerChannel a_bitsPerChannel, Channels a_channels);
void start();
void stop();
virtual void renderSamples(void* a_outputBuffer, size_t a_frameCount) = 0;
private:
struct Pimpl;
std::unique_ptr<Pimpl> m_pimpl;
inline Pimpl* D() const { return m_pimpl.get(); }
// For efficiency if required, can remove the pimpl allocation and have the compiler optimize the indirection
//static const size_t pimpl_size = 3*sizeof(int)+sizeof(void*)+sizeof(int);
//char pimpl_buf[pimpl_size];
//inline Pimpl* D() const { return (Pimpl*)&pimpl_buf[0]; }
// For safety, add this to the cpp if doing the above instead:
// static_assert(sizeof(AudioRenderer::Pimpl) == AudioRenderer::pimpl_size, "wrong pimpl size");
};
#endif // AUDIO_RENDERER_H