1 /***************************************************************************
2  *
3  *  Copyright (c) Microsoft Corporation.  All rights reserved.
4  *
5  *  File:     audiodefs.h
6  *  Content:  Basic constants and data types for audio work.
7  *
8  *  Remarks:  This header file defines all of the audio format constants and
9  *            structures required for XAudio2 and XACT work.  Providing these
10  *            in a single location avoids certain dependency problems in the
11  *            legacy audio headers (mmreg.h, mmsystem.h, ksmedia.h).
12  *
13  *            NOTE: Including the legacy headers after this one may cause a
14  *            compilation error, because they define some of the same types
15  *            defined here without preprocessor guards to avoid multiple
16  *            definitions.  If a source file needs one of the old headers,
17  *            it must include it before including audiodefs.h.
18  *
19  ***************************************************************************/
20 
21 #ifndef __AUDIODEFS_INCLUDED__
22 #define __AUDIODEFS_INCLUDED__
23 
24 #include <windef.h>  // For WORD, DWORD, etc.
25 
26 #pragma pack(push, 1)  // Pack structures to 1-byte boundaries
27 
28 
29 /**************************************************************************
30  *
31  *  WAVEFORMATEX: Base structure for many audio formats.  Format-specific
32  *  extensions can be defined for particular formats by using a non-zero
33  *  cbSize value and adding extra fields to the end of this structure.
34  *
35  ***************************************************************************/
36 
37 #ifndef _WAVEFORMATEX_
38 
39     #define _WAVEFORMATEX_
40     typedef struct tWAVEFORMATEX
41     {
42         WORD wFormatTag;        // Integer identifier of the format
43         WORD nChannels;         // Number of audio channels
44         DWORD nSamplesPerSec;   // Audio sample rate
45         DWORD nAvgBytesPerSec;  // Bytes per second (possibly approximate)
46         WORD nBlockAlign;       // Size in bytes of a sample block (all channels)
47         WORD wBitsPerSample;    // Size in bits of a single per-channel sample
48         WORD cbSize;            // Bytes of extra data appended to this struct
49     } WAVEFORMATEX;
50 
51 #endif
52 
53 // Defining pointer types outside of the #if block to make sure they are
54 // defined even if mmreg.h or mmsystem.h is #included before this file
55 
56 typedef WAVEFORMATEX *PWAVEFORMATEX, *NPWAVEFORMATEX, *LPWAVEFORMATEX;
57 typedef const WAVEFORMATEX *PCWAVEFORMATEX, *LPCWAVEFORMATEX;
58 
59 
60 /**************************************************************************
61  *
62  *  WAVEFORMATEXTENSIBLE: Extended version of WAVEFORMATEX that should be
63  *  used as a basis for all new audio formats.  The format tag is replaced
64  *  with a GUID, allowing new formats to be defined without registering a
65  *  format tag with Microsoft.  There are also new fields that can be used
66  *  to specify the spatial positions for each channel and the bit packing
67  *  used for wide samples (e.g. 24-bit PCM samples in 32-bit containers).
68  *
69  ***************************************************************************/
70 
71 #ifndef _WAVEFORMATEXTENSIBLE_
72 
73     #define _WAVEFORMATEXTENSIBLE_
74     typedef struct
75     {
76         WAVEFORMATEX Format;          // Base WAVEFORMATEX data
77         union
78         {
79             WORD wValidBitsPerSample; // Valid bits in each sample container
80             WORD wSamplesPerBlock;    // Samples per block of audio data; valid
81                                       // if wBitsPerSample=0 (but rarely used).
82             WORD wReserved;           // Zero if neither case above applies.
83         } Samples;
84         DWORD dwChannelMask;          // Positions of the audio channels
85         GUID SubFormat;               // Format identifier GUID
86     } WAVEFORMATEXTENSIBLE;
87 
88 #endif
89 
90 typedef WAVEFORMATEXTENSIBLE *PWAVEFORMATEXTENSIBLE, *LPWAVEFORMATEXTENSIBLE;
91 typedef const WAVEFORMATEXTENSIBLE *PCWAVEFORMATEXTENSIBLE, *LPCWAVEFORMATEXTENSIBLE;
92 
93 
94 
95 /**************************************************************************
96  *
97  *  Define the most common wave format tags used in WAVEFORMATEX formats.
98  *
99  ***************************************************************************/
100 
101 #ifndef WAVE_FORMAT_PCM  // Pulse Code Modulation
102 
103     // If WAVE_FORMAT_PCM is not defined, we need to define some legacy types
104     // for compatibility with the Windows mmreg.h / mmsystem.h header files.
105 
106     // Old general format structure (information common to all formats)
107     typedef struct waveformat_tag
108     {
109         WORD wFormatTag;
110         WORD nChannels;
111         DWORD nSamplesPerSec;
112         DWORD nAvgBytesPerSec;
113         WORD nBlockAlign;
114     } WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;
115 
116     // Specific format structure for PCM data
117     typedef struct pcmwaveformat_tag
118     {
119         WAVEFORMAT wf;
120         WORD wBitsPerSample;
121     } PCMWAVEFORMAT, *PPCMWAVEFORMAT, NEAR *NPPCMWAVEFORMAT, FAR *LPPCMWAVEFORMAT;
122 
123     #define WAVE_FORMAT_PCM 0x0001
124 
125 #endif
126 
127 #ifndef WAVE_FORMAT_ADPCM  // Microsoft Adaptive Differental PCM
128 
129     // Replicate the Microsoft ADPCM type definitions from mmreg.h.
130 
131     typedef struct adpcmcoef_tag
132     {
133         short iCoef1;
134         short iCoef2;
135     } ADPCMCOEFSET;
136 
137     #pragma warning(push)
138     #pragma warning(disable:4200)  // Disable zero-sized array warnings
139 
140     typedef struct adpcmwaveformat_tag {
141         WAVEFORMATEX wfx;
142         WORD wSamplesPerBlock;
143         WORD wNumCoef;
144         ADPCMCOEFSET aCoef[];  // Always 7 coefficient pairs for MS ADPCM
145     } ADPCMWAVEFORMAT;
146 
147     #pragma warning(pop)
148 
149     #define WAVE_FORMAT_ADPCM 0x0002
150 
151 #endif
152 
153 // Other frequently used format tags
154 
155 #ifndef WAVE_FORMAT_UNKNOWN
156     #define WAVE_FORMAT_UNKNOWN         0x0000 // Unknown or invalid format tag
157 #endif
158 
159 #ifndef WAVE_FORMAT_IEEE_FLOAT
160     #define WAVE_FORMAT_IEEE_FLOAT      0x0003 // 32-bit floating-point
161 #endif
162 
163 #ifndef WAVE_FORMAT_MPEGLAYER3
164     #define WAVE_FORMAT_MPEGLAYER3      0x0055 // ISO/MPEG Layer3
165 #endif
166 
167 #ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF
168     #define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 // Dolby Audio Codec 3 over S/PDIF
169 #endif
170 
171 #ifndef WAVE_FORMAT_WMAUDIO2
172     #define WAVE_FORMAT_WMAUDIO2        0x0161 // Windows Media Audio
173 #endif
174 
175 #ifndef WAVE_FORMAT_WMAUDIO3
176     #define WAVE_FORMAT_WMAUDIO3        0x0162 // Windows Media Audio Pro
177 #endif
178 
179 #ifndef WAVE_FORMAT_WMASPDIF
180     #define WAVE_FORMAT_WMASPDIF        0x0164 // Windows Media Audio over S/PDIF
181 #endif
182 
183 #ifndef WAVE_FORMAT_EXTENSIBLE
184     #define WAVE_FORMAT_EXTENSIBLE      0xFFFE // All WAVEFORMATEXTENSIBLE formats
185 #endif
186 
187 
188 /**************************************************************************
189  *
190  *  Define the most common wave format GUIDs used in WAVEFORMATEXTENSIBLE
191  *  formats.  Note that including the Windows ksmedia.h header after this
192  *  one will cause build problems; this cannot be avoided, since ksmedia.h
193  *  defines these macros without preprocessor guards.
194  *
195  ***************************************************************************/
196 
197 #ifdef __cplusplus // uuid() and __uuidof() are only available in C++
198 
199     #ifndef KSDATAFORMAT_SUBTYPE_PCM
200         struct __declspec(uuid("00000001-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_PCM_STRUCT;
201         #define KSDATAFORMAT_SUBTYPE_PCM __uuidof(KSDATAFORMAT_SUBTYPE_PCM_STRUCT)
202     #endif
203 
204     #ifndef KSDATAFORMAT_SUBTYPE_ADPCM
205         struct __declspec(uuid("00000002-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT;
206         #define KSDATAFORMAT_SUBTYPE_ADPCM __uuidof(KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT)
207     #endif
208 
209     #ifndef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
210         struct __declspec(uuid("00000003-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT;
211         #define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT __uuidof(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT)
212     #endif
213 
214 #endif
215 
216 
217 /**************************************************************************
218  *
219  *  Speaker positions used in the WAVEFORMATEXTENSIBLE dwChannelMask field.
220  *
221  ***************************************************************************/
222 
223 #ifndef SPEAKER_FRONT_LEFT
224     #define SPEAKER_FRONT_LEFT            0x00000001
225     #define SPEAKER_FRONT_RIGHT           0x00000002
226     #define SPEAKER_FRONT_CENTER          0x00000004
227     #define SPEAKER_LOW_FREQUENCY         0x00000008
228     #define SPEAKER_BACK_LEFT             0x00000010
229     #define SPEAKER_BACK_RIGHT            0x00000020
230     #define SPEAKER_FRONT_LEFT_OF_CENTER  0x00000040
231     #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080
232     #define SPEAKER_BACK_CENTER           0x00000100
233     #define SPEAKER_SIDE_LEFT             0x00000200
234     #define SPEAKER_SIDE_RIGHT            0x00000400
235     #define SPEAKER_TOP_CENTER            0x00000800
236     #define SPEAKER_TOP_FRONT_LEFT        0x00001000
237     #define SPEAKER_TOP_FRONT_CENTER      0x00002000
238     #define SPEAKER_TOP_FRONT_RIGHT       0x00004000
239     #define SPEAKER_TOP_BACK_LEFT         0x00008000
240     #define SPEAKER_TOP_BACK_CENTER       0x00010000
241     #define SPEAKER_TOP_BACK_RIGHT        0x00020000
242     #define SPEAKER_RESERVED              0x7FFC0000
243     #define SPEAKER_ALL                   0x80000000
244     #define _SPEAKER_POSITIONS_
245 #endif
246 
247 #ifndef SPEAKER_STEREO
248     #define SPEAKER_MONO             (SPEAKER_FRONT_CENTER)
249     #define SPEAKER_STEREO           (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)
250     #define SPEAKER_2POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY)
251     #define SPEAKER_SURROUND         (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)
252     #define SPEAKER_QUAD             (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
253     #define SPEAKER_4POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
254     #define SPEAKER_5POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)
255     #define SPEAKER_7POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_FRONT_LEFT_OF_CENTER | SPEAKER_FRONT_RIGHT_OF_CENTER)
256     #define SPEAKER_5POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)
257     #define SPEAKER_7POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT | SPEAKER_SIDE_LEFT  | SPEAKER_SIDE_RIGHT)
258 #endif
259 
260 
261 #pragma pack(pop)
262 
263 #endif // #ifndef __AUDIODEFS_INCLUDED__
264