#ifndef __OPUSENCODER_H__
#define __OPUSENCODER_H__

#include "opus/opus.h"
#include <string>
#include <vector>

namespace Opus {

class Packet {
public:
    uint8_t *data = nullptr;
    uint32_t byteSize = 0;
};

class Encoder {
public:
    ~Encoder();
    bool open(int32_t samplerate, int32_t channels, uint32_t sampleSize);
    void close();
    const Packet encode(const int16_t *pcm, int32_t framesize);

private:
    OpusEncoder *m_encoder = nullptr;
    std::vector<uint8_t> m_buffer;
};

class Decoder {
public:
    bool open(int32_t samplerate, int32_t channels);
    int32_t decode(const uint8_t *data, int32_t dataSize, int16_t *pcm, int32_t pcmBuffer);

private:
    OpusDecoder *m_decoder = nullptr;
};

} // namespace Opus

#endif // __OPUSENCODER_H__