48 lines
1.1 KiB
C++
48 lines
1.1 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <opusenc.h>
|
|
|
|
#define MIN(a,b) (((a)<(b))?(a):(b))
|
|
#define MAX(a,b) (((a)>(b))?(a):(b))
|
|
|
|
enum {
|
|
HEADER_TYPE_NONE = 0,
|
|
HEADER_TYPE_INFO = 0x01,
|
|
HEADER_TYPE_OPUS = 0x02,
|
|
HEADER_TYPE_SILENCE = 0x03,
|
|
HEADER_TYPE_DONE = 0x04
|
|
};
|
|
|
|
class OpusFileWriter
|
|
{
|
|
public:
|
|
OpusFileWriter();
|
|
~OpusFileWriter();
|
|
void Init(const char* file, uint32_t sampleRate);
|
|
void Close();
|
|
void SwitchState(int newState);
|
|
|
|
void WriteSamples(const int16_t* samples, uint32_t numSamples);
|
|
void PadSilence(uint64_t milliseconds);
|
|
|
|
int opus_stream_write(const unsigned char *ptr, opus_int32 len);
|
|
int opus_stream_close();
|
|
private:
|
|
FILE *m_OutFile = nullptr;
|
|
int m_State = HEADER_TYPE_NONE;
|
|
long int m_InfoStartPos;
|
|
long int m_LengthStartPos;
|
|
long int m_DataEndPos;
|
|
|
|
uint64_t m_SilenceStart = 0;
|
|
uint64_t m_SilenceSamples = 0;
|
|
|
|
OggOpusComments *m_Comments = nullptr;
|
|
OggOpusEnc *m_Enc = nullptr;
|
|
uint32_t m_SampleRate = 0;
|
|
uint64_t m_Samples = 0;
|
|
|
|
static const uint32_t bytesPerSample = 2;
|
|
};
|