SourcePP
Several modern C++20 libraries for sanely parsing Valve's formats.
Loading...
Searching...
No Matches
WAV.h
Go to the documentation of this file.
1#pragma once
2
3#include <array>
4#include <cstddef>
5#include <memory>
6#include <span>
7#include <string>
8#include <vector>
9
11
12namespace sndpp {
13
17
18class WAV {
19public:
20 static constexpr auto RIFF_TYPE = sourcepp::parser::binary::makeFourCC("WAVE");
21
22 enum class ChunkType : uint32_t {
23 FMT = sourcepp::parser::binary::makeFourCC("fmt "), // Track details
24 DATA = sourcepp::parser::binary::makeFourCC("data"), // The audio data
25 CUE = sourcepp::parser::binary::makeFourCC("cue "), // Cue points / markers
26 PLST = sourcepp::parser::binary::makeFourCC("plst"), // Playlist for cue points
27 FACT = sourcepp::parser::binary::makeFourCC("fact"), // More track details
28 SMPL = sourcepp::parser::binary::makeFourCC("smpl"), // Sampler
29 INST = sourcepp::parser::binary::makeFourCC("inst"), // Instrument
30 CSET = sourcepp::parser::binary::makeFourCC("CSET"), // Character set
31 MD5 = sourcepp::parser::binary::makeFourCC("MD5 "), // Checksums
32 JUNK = sourcepp::parser::binary::makeFourCC("JUNK"), // Useless
33 PAD = sourcepp::parser::binary::makeFourCC("PAD "), // Useless
34 FLLR = sourcepp::parser::binary::makeFourCC("FLLR"), // Useless
35 LIST = sourcepp::parser::binary::makeFourCC("LIST"), // Metadata
36 };
37
38 enum class ChunkListType : uint32_t {
39 WAVL = sourcepp::parser::binary::makeFourCC("WAVL"), // Wave list
40 INFO = sourcepp::parser::binary::makeFourCC("INFO"), // Overall metadata
41 ADTL = sourcepp::parser::binary::makeFourCC("adtl"), // Cue points metadata
42 };
43
44 enum class ChunkListInfoType : uint32_t {
45 IARL = sourcepp::parser::binary::makeFourCC("IARL"), // Archive location
47 IKEY = sourcepp::parser::binary::makeFourCC("IKEY"), // Keywords
48 ILGT = sourcepp::parser::binary::makeFourCC("ILGT"), // Lightness
51 IPLT = sourcepp::parser::binary::makeFourCC("IPLT"), // Palatte setting
52 IPRD = sourcepp::parser::binary::makeFourCC("IPRD"), // Product
53 ISBJ = sourcepp::parser::binary::makeFourCC("ISBJ"), // Subject
54 ISFT = sourcepp::parser::binary::makeFourCC("ISFT"), // Software used
55 ISHP = sourcepp::parser::binary::makeFourCC("ISHP"), // Sharpness
57 ISRC = sourcepp::parser::binary::makeFourCC("ISRC"), // Source (file supplier)
58 ISRF = sourcepp::parser::binary::makeFourCC("ISRF"), // Source form
59 ITCH = sourcepp::parser::binary::makeFourCC("ITCH"), // Technician
60 ICMS = sourcepp::parser::binary::makeFourCC("ICMS"), // Commissioner
61 ICMT = sourcepp::parser::binary::makeFourCC("ICMT"), // Comments
62 ICOP = sourcepp::parser::binary::makeFourCC("ICOP"), // Copyright
64 IDPI = sourcepp::parser::binary::makeFourCC("IDPI"), // Dots per inch
65 IENG = sourcepp::parser::binary::makeFourCC("IENG"), // Engineer
66 ISMP = sourcepp::parser::binary::makeFourCC("ISMP"), // Digitization start time (SMPTE time code)
67 IDIT = sourcepp::parser::binary::makeFourCC("IDIT"), // Digitization start time (26 characters, formatted like "Wed Jan 02 02:03:55 1990\n\0")
68 ICRD = sourcepp::parser::binary::makeFourCC("ICRD"), // Creation date (YYYY, YYYY-MM, YYYY-MM-DD)
69 ITRK = sourcepp::parser::binary::makeFourCC("ITRK"), // Track number
70 };
71
72 enum class ChunkListADTLType {
73 LABL = sourcepp::parser::binary::makeFourCC("labl"), // Cue point label
74 NOTE = sourcepp::parser::binary::makeFourCC("note"), // Cue point note
75 LTXT = sourcepp::parser::binary::makeFourCC("ltxt"), // Section label
76 };
77
78 struct ChunkBase {
79 virtual ~ChunkBase() = default;
80
82 };
83
85 uint16_t format;
86 uint16_t channels;
89 uint16_t blockAlign;
90 uint16_t bitsPerSample;
91 std::vector<std::byte> extraCompressionInfo;
92 };
93
95 std::vector<std::byte> data;
96 };
97
99 struct CuePoint {
100 uint32_t id;
101 int32_t position;
103 uint32_t chunkStart;
104 uint32_t blockStart;
105 uint32_t sampleOffset;
106 };
107
108 std::vector<CuePoint> cuePoints;
109 };
110
112 struct Segment {
113 uint32_t id;
114 uint32_t length;
115 uint32_t repeats;
116 };
117
118 std::vector<Segment> segments;
119 };
120
122 uint32_t samples;
123 std::vector<std::byte> extraCompressionInfo;
124 };
125
127 struct SampleLoop {
128 uint32_t id;
129 uint32_t type;
130 uint32_t start;
131 uint32_t end;
132 uint32_t fraction;
133 uint32_t playCount;
134 };
135
136 uint32_t manufacturer;
137 uint32_t product;
138 uint32_t samplePeriod;
141 uint32_t smpteFormat;
142 uint32_t smpteOffset;
143 uint32_t sampleLoops;
144 uint32_t samplerData;
145 std::vector<SampleLoop> loops;
146 };
147
150 int8_t fineTune;
151 int8_t gain;
152 uint8_t lowNote;
153 uint8_t highNote;
154 uint8_t lowVelocity;
156 };
157
159 uint16_t codePage;
160 uint16_t countryCode;
161 uint16_t language;
162 uint16_t dialect;
163 };
164
166 std::array<uint8_t, 16> md5;
167 };
168
170 std::vector<std::byte> junk;
171 };
172
174 std::vector<std::byte> padding;
175 };
176
178 std::vector<std::byte> filler;
179 };
180
181 struct ChunkLIST : ChunkBase {};
182
184 struct META {
186 std::string metadata;
187 };
188
189 std::vector<META> metadata;
190 };
191
193 struct LABL {
194 uint32_t id;
195 std::string label;
196 };
197
198 struct NOTE {
199 uint32_t id;
200 std::string note;
201 };
202
203 struct LTXT {
204 uint32_t id;
205 uint32_t sampleLength;
206 uint32_t purpose;
207 uint16_t country;
208 uint16_t language;
209 uint16_t dialect;
210 uint16_t codePage;
211 std::string label;
212 };
213
214 std::vector<LABL> labels;
215 std::vector<NOTE> notes;
216 std::vector<LTXT> labelTexts;
217 };
218
220 std::vector<std::byte> data;
221 };
222
223 WAV();
224
225 explicit WAV(std::span<const std::byte> wavData);
226
227 explicit WAV(const std::string& wavPath);
228
229 [[nodiscard]] explicit operator bool() const;
230
231 [[nodiscard]] const std::vector<std::unique_ptr<ChunkBase>>& getChunks() const;
232
233 [[nodiscard]] std::vector<std::unique_ptr<ChunkBase>>& getChunks();
234
235 [[nodiscard]] const ChunkBase* getFirstChunk(WAV::ChunkType type) const;
236
237 [[nodiscard]] const ChunkFMT* getChunkFMT() const;
238 [[nodiscard]] const ChunkDATA* getChunkDATA() const;
239 [[nodiscard]] const ChunkCUE* getChunkCUE() const;
240 [[nodiscard]] const ChunkPLST* getChunkPLST() const;
241 [[nodiscard]] const ChunkFACT* getChunkFACT() const;
242 [[nodiscard]] const ChunkSMPL* getChunkSMPL() const;
243 [[nodiscard]] const ChunkINST* getChunkINST() const;
244 [[nodiscard]] const ChunkCSET* getChunkCSET() const;
245 [[nodiscard]] const ChunkMD5* getChunkMD5() const;
246 [[nodiscard]] const ChunkJUNK* getChunkJUNK() const;
247 [[nodiscard]] const ChunkPAD* getChunkPAD() const;
248 [[nodiscard]] const ChunkFLLR* getChunkFLLR() const;
249 [[nodiscard]] const ChunkLIST* getChunkLIST() const;
250
251 [[nodiscard]] uint32_t getSignature() const;
252
253 void setSignature(uint32_t newSignature);
254
255protected:
256 std::vector<std::unique_ptr<ChunkBase>> chunks;
257 uint32_t signature;
258};
259
260} // namespace sndpp
Definition: WAV.h:18
const ChunkPAD * getChunkPAD() const
ChunkListADTLType
Definition: WAV.h:72
const ChunkCSET * getChunkCSET() const
std::vector< std::unique_ptr< ChunkBase > > chunks
Definition: WAV.h:256
const ChunkDATA * getChunkDATA() const
const ChunkFMT * getChunkFMT() const
const ChunkPLST * getChunkPLST() const
const ChunkLIST * getChunkLIST() const
const std::vector< std::unique_ptr< ChunkBase > > & getChunks() const
Definition: WAV.cpp:231
const ChunkBase * getFirstChunk(WAV::ChunkType type) const
Definition: WAV.cpp:239
ChunkListInfoType
Definition: WAV.h:44
uint32_t getSignature() const
Definition: WAV.cpp:248
const ChunkCUE * getChunkCUE() const
const ChunkFACT * getChunkFACT() const
void setSignature(uint32_t newSignature)
Definition: WAV.cpp:252
const ChunkMD5 * getChunkMD5() const
const ChunkFLLR * getChunkFLLR() const
const ChunkSMPL * getChunkSMPL() const
ChunkListType
Definition: WAV.h:38
const ChunkJUNK * getChunkJUNK() const
const ChunkINST * getChunkINST() const
static constexpr auto RIFF_TYPE
Definition: WAV.h:20
ChunkType
Definition: WAV.h:22
uint32_t signature
Definition: WAV.h:257
Definition: WAV.h:12
constexpr auto FFIR_SIGNATURE
Definition: WAV.h:16
constexpr auto RIFX_SIGNATURE
Definition: WAV.h:15
constexpr auto RIFF_SIGNATURE
Definition: WAV.h:14
consteval uint32_t makeFourCC(const char fourCC[4])
Creates a FourCC identifier from a string of 4 characters.
Definition: Binary.h:18
std::string label
Definition: WAV.h:195
std::string label
Definition: WAV.h:211
std::string note
Definition: WAV.h:200
std::vector< NOTE > notes
Definition: WAV.h:215
std::vector< LABL > labels
Definition: WAV.h:214
std::vector< LTXT > labelTexts
Definition: WAV.h:216
ChunkType type
Definition: WAV.h:81
virtual ~ChunkBase()=default
uint16_t codePage
Definition: WAV.h:159
uint16_t dialect
Definition: WAV.h:162
uint16_t language
Definition: WAV.h:161
uint16_t countryCode
Definition: WAV.h:160
std::vector< CuePoint > cuePoints
Definition: WAV.h:108
std::vector< std::byte > data
Definition: WAV.h:95
std::vector< std::byte > extraCompressionInfo
Definition: WAV.h:123
uint32_t samples
Definition: WAV.h:122
std::vector< std::byte > filler
Definition: WAV.h:178
uint16_t channels
Definition: WAV.h:86
uint16_t format
Definition: WAV.h:85
uint32_t samplesPerSecond
Definition: WAV.h:87
uint16_t bitsPerSample
Definition: WAV.h:90
uint16_t blockAlign
Definition: WAV.h:89
std::vector< std::byte > extraCompressionInfo
Definition: WAV.h:91
uint32_t averageBytesPerSecond
Definition: WAV.h:88
std::string metadata
Definition: WAV.h:186
ChunkListInfoType type
Definition: WAV.h:185
std::vector< META > metadata
Definition: WAV.h:189
uint8_t highVelocity
Definition: WAV.h:155
uint8_t unshiftedNote
Definition: WAV.h:149
uint8_t highNote
Definition: WAV.h:153
uint8_t lowNote
Definition: WAV.h:152
int8_t fineTune
Definition: WAV.h:150
uint8_t lowVelocity
Definition: WAV.h:154
std::vector< std::byte > junk
Definition: WAV.h:170
std::array< uint8_t, 16 > md5
Definition: WAV.h:166
std::vector< std::byte > padding
Definition: WAV.h:174
std::vector< Segment > segments
Definition: WAV.h:118
uint32_t product
Definition: WAV.h:137
uint32_t midiUnityNote
Definition: WAV.h:139
uint32_t samplerData
Definition: WAV.h:144
std::vector< SampleLoop > loops
Definition: WAV.h:145
uint32_t smpteFormat
Definition: WAV.h:141
uint32_t midiPitchFraction
Definition: WAV.h:140
uint32_t sampleLoops
Definition: WAV.h:143
uint32_t samplePeriod
Definition: WAV.h:138
uint32_t manufacturer
Definition: WAV.h:136
uint32_t smpteOffset
Definition: WAV.h:142
std::vector< std::byte > data
Definition: WAV.h:220