130 строки
4.6 KiB
Plaintext
130 строки
4.6 KiB
Plaintext
|
|
|||
|
WAV File Reference
|
|||
|
|
|||
|
Copyright (c) Wiesław Šoltés. All rights reserved.
|
|||
|
Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|||
|
|
|||
|
0. https://ccrma.stanford.edu/courses/422/projects/WaveFormat/
|
|||
|
The canonical WAVE format starts with the RIFF header
|
|||
|
|
|||
|
1. http://msdn.microsoft.com/en-us/library/dd757720(v=VS.85).aspx
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
WORD wFormatTag;
|
|||
|
WORD nChannels;
|
|||
|
DWORD nSamplesPerSec;
|
|||
|
DWORD nAvgBytesPerSec;
|
|||
|
WORD nBlockAlign;
|
|||
|
WORD wBitsPerSample;
|
|||
|
WORD cbSize;
|
|||
|
} WAVEFORMATEX;
|
|||
|
|
|||
|
Note:
|
|||
|
|
|||
|
cbSize is at Least 22
|
|||
|
|
|||
|
For WAVEFORMATEXTENSIBLE, cbSize must always be set to at least 22.
|
|||
|
This is the sum of the sizes of the Samples union (2), DWORD dwChannelMask (4), and GUID guidSubFormat (16).
|
|||
|
|
|||
|
This is appended to the initial WAVEFORMATEX Format (size 18),
|
|||
|
so a WAVEFORMATPCMEX and WAVEFORMATIEEEFLOATEX structure is 64-bit aligned.
|
|||
|
|
|||
|
2. http://msdn.microsoft.com/en-us/library/dd757721(v=VS.85).aspx
|
|||
|
http://www.microsoft.com/whdc/device/audio/multichaud.mspx
|
|||
|
|
|||
|
typedef struct
|
|||
|
{
|
|||
|
WAVEFORMATEX Format;
|
|||
|
union
|
|||
|
{
|
|||
|
WORD wValidBitsPerSample;
|
|||
|
WORD wSamplesPerBlock;
|
|||
|
WORD wReserved;
|
|||
|
} Samples;
|
|||
|
DWORD dwChannelMask;
|
|||
|
GUID SubFormat;
|
|||
|
} WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE;
|
|||
|
|
|||
|
3. http://www.microsoft.com/whdc/device/audio/multichaud.mspx
|
|||
|
|
|||
|
* KSMEDIA.H
|
|||
|
|
|||
|
#define STATIC_KSDATAFORMAT_SUBTYPE_PCM\
|
|||
|
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_PCM)
|
|||
|
DEFINE_GUIDSTRUCT("00000001-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_PCM);
|
|||
|
#define KSDATAFORMAT_SUBTYPE_PCM DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_PCM)
|
|||
|
|
|||
|
#define STATIC_KSDATAFORMAT_SUBTYPE_IEEE_FLOAT\
|
|||
|
DEFINE_WAVEFORMATEX_GUID(WAVE_FORMAT_IEEE_FLOAT)
|
|||
|
DEFINE_GUIDSTRUCT("00000003-0000-0010-8000-00aa00389b71", KSDATAFORMAT_SUBTYPE_IEEE_FLOAT);
|
|||
|
#define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT DEFINE_GUIDNAMED(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)
|
|||
|
|
|||
|
4. http://www.microsoft.com/whdc/device/audio/multichaud.mspx
|
|||
|
|
|||
|
Default Channel Ordering:
|
|||
|
1. Front Left - FL
|
|||
|
2. Front Right - FR
|
|||
|
3. Front Center - FC
|
|||
|
4. Low Frequency - LF
|
|||
|
5. Back Left - BL
|
|||
|
6. Back Right - BR
|
|||
|
7. Front Left of Center - FLC
|
|||
|
8. Front Right of Center - FRC
|
|||
|
9. Back Center - BC
|
|||
|
10. Side Left - SL
|
|||
|
11. Side Right - SR
|
|||
|
12. Top Center - TC
|
|||
|
13. Top Front Left - TFL
|
|||
|
14. Top Front Center - TFC
|
|||
|
15. Top Front Right - TFR
|
|||
|
16. Top Back Left - TBL
|
|||
|
17. Top Back Center - TBC
|
|||
|
18. Top Back Right - TBR
|
|||
|
|
|||
|
5. The canonical WAVE format starts with the RIFF header:
|
|||
|
|
|||
|
0 4 ChunkID Contains the letters "RIFF" in ASCII form
|
|||
|
(0x52494646 big-endian form).
|
|||
|
4 4 ChunkSize 36 + SubChunk2Size, or more precisely:
|
|||
|
4 + (8 + SubChunk1Size) + (8 + SubChunk2Size)
|
|||
|
This is the size of the rest of the chunk
|
|||
|
following this number. This is the size of the
|
|||
|
entire file in bytes minus 8 bytes for the
|
|||
|
two fields not included in this count:
|
|||
|
ChunkID and ChunkSize.
|
|||
|
8 4 Format Contains the letters "WAVE"
|
|||
|
(0x57415645 big-endian form).
|
|||
|
|
|||
|
The "WAVE" format consists of two subchunks: "fmt " and "data":
|
|||
|
The "fmt " subchunk describes the sound data's format:
|
|||
|
|
|||
|
12 4 Subchunk1ID Contains the letters "fmt "
|
|||
|
(0x666d7420 big-endian form).
|
|||
|
16 4 Subchunk1Size 16 for PCM. This is the size of the
|
|||
|
rest of the Subchunk which follows this number.
|
|||
|
20 2 AudioFormat PCM = 1 (i.e. Linear quantization)
|
|||
|
Values other than 1 indicate some
|
|||
|
form of compression.
|
|||
|
22 2 NumChannels Mono = 1, Stereo = 2, etc.
|
|||
|
24 4 SampleRate 8000, 44100, etc.
|
|||
|
28 4 ByteRate == SampleRate * NumChannels * BitsPerSample/8
|
|||
|
32 2 BlockAlign == NumChannels * BitsPerSample/8
|
|||
|
The number of bytes for one sample including
|
|||
|
all channels. I wonder what happens when
|
|||
|
this number isn't an integer?
|
|||
|
34 2 BitsPerSample 8 bits = 8, 16 bits = 16, etc.
|
|||
|
2 ExtraParamSize if PCM, then doesn't exist
|
|||
|
X ExtraParams space for extra parameters
|
|||
|
|
|||
|
The "data" subchunk contains the size of the data and the actual sound:
|
|||
|
|
|||
|
36 4 Subchunk2ID Contains the letters "data"
|
|||
|
(0x64617461 big-endian form).
|
|||
|
40 4 Subchunk2Size == NumSamples * NumChannels * BitsPerSample/8
|
|||
|
This is the number of bytes in the data.
|
|||
|
You can also think of this as the size
|
|||
|
of the read of the subchunk following this
|
|||
|
number.
|
|||
|
44 * Data The actual sound data.
|