OpenGothic
Open source reimplementation of Gothic I and II
Loading...
Searching...
No Matches
wave.h
Go to the documentation of this file.
1#pragma once
2
3#include "info.h"
4#include "riff.h"
5
6#include <vector>
7#include <cstdint>
8
9#include <Tempest/MemReader>
10#include <Tempest/Sound>
11
12namespace Dx8 {
13
14class Wave final {
15 public:
16 Wave(Riff &input);
17 Wave(const char* dbg);
18 Wave(const int16_t* pcm,size_t count);
19
20 enum WaveFormatTag : uint16_t {
21 UNKNOWN = 0x0000,
22 PCM = 0x0001,
23 ADPCM = 0x0002,
24 };
25
26 struct WaveFormat final {
28 uint16_t wChannels = 0;
29 uint32_t dwSamplesPerSec = 0;
30 uint32_t dwAvgBytesPerSec = 0;
31 uint16_t wBlockAlign = 0;
32 uint16_t wBitsPerSample = 0;
33 };
34
35 struct WaveSample final {
36 uint32_t cbSize =0;
37 uint16_t usUnityNote =0;
38 int16_t sFineTune =0;
39 int32_t lAttenuation=0;
40 uint32_t fulOptions =0;
41 uint32_t cSampleLoops=0;
42 };
43
44 struct WaveSampleLoop final {
45 uint32_t cbSize =0;
46 uint32_t ulLoopType =0;
47 uint32_t ulLoopStart =0;
48 uint32_t ulLoopLength=0;
49 };
50
51 struct PoolTable final {
52 uint32_t cbSize=0;
53 uint32_t cCues =0;
54 };
55
57 std::vector<uint8_t> extra;
58 std::vector<uint8_t> wavedata;
60 std::vector<WaveSampleLoop> loop;
62
63 void toFloatSamples(float* out) const;
64
65 void save(const char* path) const;
66
67 private:
68 enum {
69 MAX_CACHED_FRAMES=4
70 };
71 struct AdpcHdrMono final {
72 int16_t delta;
73 int16_t prevFrames1;
74 int16_t prevFrames0;
75 };
76
77 struct AdpcHdrStereo final {
78 int16_t delta[2];
79 int16_t prevFrames1[2];
80 int16_t prevFrames0[2];
81 };
82
83 struct AdpcChannel final {
84 uint16_t predictor;
85 int32_t delta;
86 int32_t prevFrames[2];
87 };
88
89 struct AdpcState final {
90 int32_t cachedFrames[MAX_CACHED_FRAMES]; // samples are stored in this cache during decoding.
91 uint32_t cachedFrameCount;
92 AdpcChannel channel[2];
93 };
94
95 void implRead(Riff &input);
96 void implParse(Riff &input);
97
98 size_t decodeAdpcm(Tempest::MemReader& rd, const size_t framesToRead,
99 uint16_t blockAlign, uint16_t channels, int16_t* pBufferOut);
100 size_t decodeAdpcmBlock(Tempest::MemReader& rd, const size_t framesToRead,
101 uint16_t blockAlign, uint16_t channels, int16_t* pBufferOut);
102 int32_t decodeADPCMFrame(AdpcChannel& msadpcm, int32_t nibble);
103 };
104
105}
WaveSample waveSample
Definition wave.h:59
WaveFormatTag
Definition wave.h:20
@ UNKNOWN
Definition wave.h:21
@ ADPCM
Definition wave.h:23
@ PCM
Definition wave.h:22
std::vector< uint8_t > extra
Definition wave.h:57
Info info
Definition wave.h:61
void save(const char *path) const
Definition wave.cpp:284
WaveFormat wfmt
Definition wave.h:56
void toFloatSamples(float *out) const
Definition wave.cpp:276
std::vector< uint8_t > wavedata
Definition wave.h:58
std::vector< WaveSampleLoop > loop
Definition wave.h:60
Definition band.h:10
uint32_t cbSize
Definition wave.h:52
uint32_t cCues
Definition wave.h:53
WaveFormatTag wFormatTag
Definition wave.h:27
uint32_t dwAvgBytesPerSec
Definition wave.h:30
uint16_t wBitsPerSample
Definition wave.h:32
uint32_t dwSamplesPerSec
Definition wave.h:29
uint16_t wBlockAlign
Definition wave.h:31
uint16_t wChannels
Definition wave.h:28
uint32_t ulLoopLength
Definition wave.h:48
int32_t lAttenuation
Definition wave.h:39
int16_t sFineTune
Definition wave.h:38
uint32_t fulOptions
Definition wave.h:40
uint16_t usUnityNote
Definition wave.h:37
uint32_t cSampleLoops
Definition wave.h:41
uint32_t cbSize
Definition wave.h:36