//  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
