70 lines
2.1 KiB
C
70 lines
2.1 KiB
C
|
#ifndef CWAVESTREAM_H
|
||
|
#define CWAVESTREAM_H
|
||
|
|
||
|
#include <QDataStream>
|
||
|
|
||
|
namespace recorder {
|
||
|
|
||
|
class HdrRiff
|
||
|
{
|
||
|
public:
|
||
|
HdrRiff() {}
|
||
|
|
||
|
static const uint32_t chunkId = 0x46464952; // RIFF
|
||
|
static const uint32_t chunkSize = 0xffffffff; // (will be overwritten) Size of file in bytes - 8 = size of data + 36
|
||
|
static const uint32_t format = 0x45564157; // WAVE
|
||
|
};
|
||
|
|
||
|
class FmtSubChunk
|
||
|
{
|
||
|
public:
|
||
|
FmtSubChunk(const uint16_t _numChannels) :
|
||
|
numChannels (_numChannels)
|
||
|
, byteRate (sampleRate * numChannels * bitsPerSample/8)
|
||
|
, blockAlign (numChannels * bitsPerSample/8)
|
||
|
{
|
||
|
}
|
||
|
static const uint32_t chunkId = 0x20746d66; // "fmt "
|
||
|
static const uint32_t chunkSize = 16; // bytes in fmtSubChunk after chunkSize
|
||
|
static const uint16_t audioFormat = 1; // PCM
|
||
|
const uint16_t numChannels; // 1 for mono, 2 for joy... uh, stereo
|
||
|
static const uint32_t sampleRate = 48000; // because it's Jamulus
|
||
|
const uint32_t byteRate; // sampleRate * numChannels * bitsPerSample/8
|
||
|
const uint16_t blockAlign; // numChannels * bitsPerSample/8
|
||
|
static const uint16_t bitsPerSample = 16;
|
||
|
};
|
||
|
|
||
|
class DataSubChunkHdr
|
||
|
{
|
||
|
public:
|
||
|
DataSubChunkHdr() {}
|
||
|
|
||
|
static const uint32_t chunkId = 0x61746164; // "data"
|
||
|
static const uint32_t chunkSize = 0xffffffff; // (will be overwritten) Size of data
|
||
|
};
|
||
|
|
||
|
class CWaveStream : public QDataStream
|
||
|
{
|
||
|
public:
|
||
|
CWaveStream(const uint16_t numChannels);
|
||
|
explicit CWaveStream(QIODevice *iod, const uint16_t numChannels);
|
||
|
CWaveStream(QByteArray *iod, QIODevice::OpenMode flags, const uint16_t numChannels);
|
||
|
CWaveStream(const QByteArray &ba, const uint16_t numChannels);
|
||
|
~CWaveStream();
|
||
|
|
||
|
private:
|
||
|
void waveStreamHeaders();
|
||
|
|
||
|
const uint16_t numChannels;
|
||
|
const int64_t initialPos;
|
||
|
const ByteOrder initialByteOrder;
|
||
|
};
|
||
|
|
||
|
}
|
||
|
|
||
|
recorder::CWaveStream& operator<<(recorder::CWaveStream& out, recorder::HdrRiff& hdrRiff);
|
||
|
recorder::CWaveStream& operator<<(recorder::CWaveStream& out, recorder::FmtSubChunk& fmtSubChunk);
|
||
|
recorder::CWaveStream& operator<<(recorder::CWaveStream& out, recorder::DataSubChunkHdr& dataSubChunkHdr);
|
||
|
|
||
|
#endif // CWAVESTREAM_H
|