-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathwave.h
170 lines (132 loc) · 3.05 KB
/
wave.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#ifndef SEPSPEECHTOOLS_WAVE_H
#define SEPSPEECHTOOLS_WAVE_H
#include <cinttypes>
#include <qglobal.h>
class QIODevice;
class Chunk
{
public:
Chunk(QIODevice *input);
~Chunk();
uint32_t header() const
{ return this->header_; }
uint32_t size() const
{ return this->size_; }
qint64 pos() const
{ return this->pos_; }
void skip();
QByteArray data();
static QByteArray makeChunk(uint32_t header, const uint32_t &size);
static QByteArray makeChunk(uint32_t header, const QByteArray &data);
private:
QIODevice *device_;
uint32_t header_;
uint32_t size_;
qint64 pos_;
};
class WaveFormat
{
public:
WaveFormat(uint16_t format, uint16_t channels, uint32_t framerate, uint16_t bitsPerSample);
QByteArray toByteArray() const;
uint16_t format() const
{ return this->format_; }
uint16_t channels() const
{ return this->channels_; }
uint32_t framerate() const
{ return this->framerate_; }
uint16_t bitsPerSample() const
{ return this->bitsPerSample_; }
uint16_t blockAlign() const
{
return this->channels() * (this->bitsPerSample() >> 3);
}
uint32_t avgBytesPerSec() const
{
return this->framerate() * this->blockAlign();
}
enum Format : uint16_t
{
PCM = 0x0001,
};
private:
uint16_t format_;
uint16_t channels_;
uint32_t framerate_;
uint16_t bitsPerSample_;
};
class Wave
{
public:
~Wave();
const WaveFormat format() const
{ return format_; }
const QByteArray data();
struct Header
{
static const uint32_t RIFF = 0x46464952; // "RIFF"
static const uint32_t WAVE = 0x45564157; // "WAVE"
static const uint32_t fmt_ = 0x20746d66; // "fmt "
static const uint32_t data = 0x61746164; // "data"
};
static Wave create(QIODevice *device);
private:
Wave(QIODevice *device, const WaveFormat &format, qint64 pos, uint32_t size);
QIODevice *device_;
WaveFormat format_;
qint64 pos_;
uint32_t size_;
};
class WaveBuilder
{
public:
WaveBuilder(const WaveFormat &format);
QByteArray build(const QByteArray &data) const;
private:
WaveFormat format;
};
class WaveException : public std::exception
{};
class RIFFException : public WaveException
{
public:
~RIFFException()
{}
const char *what() const noexcept;
};
class RIFFWaveException : public WaveException
{
public:
~RIFFWaveException()
{}
const char *what() const noexcept;
};
class UnknownFormatException : public WaveException
{
public:
~UnknownFormatException()
{}
const char *what() const noexcept;
};
class DataChunkException : public WaveException
{
public:
~DataChunkException()
{}
const char *what() const noexcept;
};
class ParameterException : public WaveException
{
public:
~ParameterException()
{}
const char *what() const noexcept;
};
class ChunkMissingException : public WaveException
{
public:
~ChunkMissingException()
{}
const char *what() const noexcept;
};
#endif // SEPSPEECHTOOLS_WAVE_H