mirror of
https://github.com/AlexandreRouma/SDRPlusPlus.git
synced 2025-02-04 05:44:45 +01:00
62 lines
2.0 KiB
C
62 lines
2.0 KiB
C
|
#pragma once
|
||
|
#include <stdint.h>
|
||
|
#include <fstream>
|
||
|
|
||
|
#define WAV_SIGNATURE "RIFF"
|
||
|
#define WAV_TYPE "WAVE"
|
||
|
#define WAV_FORMAT_MARK "fmt "
|
||
|
#define WAV_DATA_MARK "data"
|
||
|
#define WAV_SAMPLE_TYPE_PCM 1
|
||
|
|
||
|
class WavWriter {
|
||
|
public:
|
||
|
WavWriter(std::string path, uint16_t bitDepth, uint16_t channelCount, uint32_t sampleRate) {
|
||
|
file = std::ofstream(path.c_str(), std::ios::binary);
|
||
|
memcpy(hdr.signature, WAV_SIGNATURE, 4);
|
||
|
memcpy(hdr.fileType, WAV_TYPE, 4);
|
||
|
memcpy(hdr.formatMarker, WAV_FORMAT_MARK, 4);
|
||
|
memcpy(hdr.dataMarker, WAV_DATA_MARK, 4);
|
||
|
hdr.formatHeaderLength = 16;
|
||
|
hdr.sampleType = WAV_SAMPLE_TYPE_PCM;
|
||
|
hdr.channelCount = channelCount;
|
||
|
hdr.sampleRate = sampleRate;
|
||
|
hdr.bytesPerSecond = (bitDepth / 8) * channelCount * sampleRate;
|
||
|
hdr.bytesPerSample = (bitDepth / 8) * channelCount;
|
||
|
hdr.bitDepth = bitDepth;
|
||
|
file.write((char*)&hdr, sizeof(WavHeader_t));
|
||
|
}
|
||
|
|
||
|
void writeSamples(void* data, size_t size) {
|
||
|
file.write((char*)data, size);
|
||
|
bytesWritten += size;
|
||
|
}
|
||
|
|
||
|
void close() {
|
||
|
hdr.fileSize = bytesWritten + sizeof(WavHeader_t) - 8;
|
||
|
hdr.dataSize = bytesWritten;
|
||
|
file.seekp(0);
|
||
|
file.write((char*)&hdr, sizeof(WavHeader_t));
|
||
|
file.close();
|
||
|
}
|
||
|
|
||
|
private:
|
||
|
struct WavHeader_t {
|
||
|
char signature[4]; // "RIFF"
|
||
|
uint32_t fileSize; // data bytes + sizeof(WavHeader_t) - 8
|
||
|
char fileType[4]; // "WAVE"
|
||
|
char formatMarker[4]; // "fmt "
|
||
|
uint32_t formatHeaderLength; // Always 16
|
||
|
uint16_t sampleType; // PCM (1)
|
||
|
uint16_t channelCount;
|
||
|
uint32_t sampleRate;
|
||
|
uint32_t bytesPerSecond;
|
||
|
uint16_t bytesPerSample;
|
||
|
uint16_t bitDepth;
|
||
|
char dataMarker[4]; // "data"
|
||
|
uint32_t dataSize;
|
||
|
};
|
||
|
|
||
|
std::ofstream file;
|
||
|
size_t bytesWritten = 0;
|
||
|
WavHeader_t hdr;
|
||
|
};
|