mirror of
https://github.com/SatDump/SatDump
synced 2026-08-13 17:47:30 -04:00
87 lines
2.9 KiB
C++
87 lines
2.9 KiB
C++
#pragma once
|
|
|
|
#include <cstdint>
|
|
#include <string>
|
|
#include <ctime>
|
|
|
|
/*
|
|
Simple class to read a WAV header,
|
|
meant to read out values like samplerate, sample format, etc
|
|
This is not meant to parse everything not the actual sample
|
|
data.
|
|
*/
|
|
namespace wav
|
|
{
|
|
#ifdef _WIN32
|
|
#pragma pack(push, 1)
|
|
#endif
|
|
struct WavHeader
|
|
{
|
|
char RIFF[4]; // RIFF Header
|
|
uint32_t chunk_size; // RIFF Chunk Size
|
|
char WAVE[4]; // WAVE Header
|
|
char fmt[4]; // FMT Header
|
|
uint32_t sub_chunk_size; // FMT Chunk size. 16 = PCM, 18 = IEEE Float, 40 = Extensible
|
|
uint16_t audio_Format; // Audio format. 1 = PCM, 3 = IEEE Float, 6 = mulaw, 7 = alaw, 257 = IBM Mu-Law, 258 = IBM A-Law, 259 = ADPCM, 65534 = Extensible
|
|
uint16_t channel_cnt; // Channel number 1 = Mono, 2 = Stereo
|
|
uint32_t samplerate; // Samplerate in Hz
|
|
uint32_t bytes_per_sec; // Bytes / second
|
|
uint16_t block_align; // 2 = 16-bit mono, 4 = 16-bit stereo, 6 = 24-bit stereo, 8 = 32-bit stereo
|
|
uint16_t bits_per_sample; // Bits per sample
|
|
char data[4]; // Data header
|
|
uint32_t dw_data_length; // Raw lengths
|
|
}
|
|
#ifdef _WIN32
|
|
;
|
|
#else
|
|
__attribute__((packed));
|
|
#endif
|
|
#ifdef _WIN32
|
|
#pragma pack(pop)
|
|
#endif
|
|
|
|
#ifdef _WIN32
|
|
#pragma pack(push, 1)
|
|
#endif
|
|
struct RF64Header
|
|
{
|
|
char RIFF[4]; // RIFF Header
|
|
uint32_t chunk_size; // Unused
|
|
char WAVE[4]; // WAVE Header
|
|
char fill[36]; // Ignore this
|
|
char fmt[4]; // FMT Header
|
|
uint32_t sub_chunk_size; // FMT Chunk size. 16 = PCM, 18 = IEEE Float, 40 = Extensible
|
|
uint16_t audio_Format; // Audio format. 1 = PCM, 3 = IEEE Float, 6 = mulaw, 7 = alaw, 257 = IBM Mu-Law, 258 = IBM A-Law, 259 = ADPCM, 65534 = Extensible
|
|
uint16_t channel_cnt; // Channel number 1 = Mono, 2 = Stereo
|
|
uint32_t samplerate; // Samplerate in Hz
|
|
uint32_t bytes_per_sec; // Bytes / second
|
|
uint16_t block_align; // 2 = 16-bit mono, 4 = 16-bit stereo, 6 = 24-bit stereo, 8 = 32-bit stereo
|
|
uint16_t bits_per_sample; // Bits per sample
|
|
char data[4]; // Data header
|
|
uint32_t dw_data_length; // Raw lengths
|
|
}
|
|
#ifdef _WIN32
|
|
;
|
|
#else
|
|
__attribute__((packed));
|
|
#endif
|
|
#ifdef _WIN32
|
|
#pragma pack(pop)
|
|
#endif
|
|
|
|
WavHeader parseHeaderFromFileWav(std::string file);
|
|
RF64Header parseHeaderFromFileRF64(std::string file);
|
|
bool isValidWav(WavHeader header);
|
|
bool isValidRF64(WavHeader header);
|
|
|
|
// Filenames
|
|
struct FileMetadata
|
|
{
|
|
uint64_t frequency = 0;
|
|
uint64_t samplerate = 0;
|
|
time_t timestamp = 0;
|
|
std::string baseband_format = "";
|
|
};
|
|
|
|
FileMetadata tryParseFilenameMetadata(std::string filepath, bool audio = false);
|
|
};
|