forked from clandry94/agraph
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathformat.go
101 lines (89 loc) · 1.73 KB
/
format.go
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
package agraph
import (
"bytes"
"io"
)
const (
maxFileSize = 2 << 31
fmtChunkSize = 16
riffChunkToken = "RIFF"
wavFormatToken = "WAVE"
fmtChunkToken = "fmt "
// listChunkToken = "LIST" ????
dataChunkToken = "data"
)
// WAVE File Format
//0 ---------------
// | ChunkID | 4 bytes
//4 |---------------|
// | ChunkSize | 4
//8 |---------------|
// | Format | 4
//12 |---------------\
// | Subchunk1ID | 4
//16 |---------------|`
// | Subchunk1Size | 4
//20 |---------------|
// | AudioFormat | 2
//22 |---------------|
// | NumChannels | 2
//24 |---------------|
// | SampleRate | 4
//28 |---------------|
// | ByteRate | 4
//32 |---------------|
// | BlockAlign | 2
//34 |---------------|
// | BitsPerSample | 2
//36 |---------------|
// | Subchunk2ID | 4
//40 |---------------|
// | Subchunk2Size | 4
//44 |---------------|
// | |
// | |
// | data | Subchunk2Size
// | |
// | |
// ---------------
// Riff Chunk
type Riff struct {
ChunkID []byte
ChunkSize uint32
Format []byte
}
// Fmt Chunk
type Fmt struct {
ID []byte
Size uint32
Data *WavFmtData
}
type WavFmtData struct {
AudioFormat uint16
NumChannels uint16
SampleRate uint32 /// per second
ByteRate uint32
BlockAlign uint16 // data block size in bytes aka numChannels * BitsPerSample /8
BitsPerSample uint16
}
// Data Chunk
type data struct {
ID []byte
Size uint32
// Holds the data of the wave file. Shouldn't be accessed directly since it has a reader
data DataReader
}
type DataReader interface {
io.Reader
io.ReaderAt
}
type ReadSeeker interface {
io.Reader
io.Seeker
io.ReaderAt
}
type DataWriterChunk struct {
ID []byte
Size uint32
Data *bytes.Buffer
}