/***************************************************************************

 *

 *  Copyright (c) Microsoft Corporation.  All rights reserved.

 *

 *  File:     audiodefs.h

 *  Content:  Basic constants and data types for audio work.

 *

 ***************************************************************************/



#ifndef __AUDIODEFS_INCLUDED__

#define __AUDIODEFS_INCLUDED__



#include <windef.h>  // For WORD, DWORD, etc.



#pragma pack(push, 1) // Pack structures to 1-byte boundaries





/**************************************************************************

 *

 *  WAVEFORMATEX: Base structure for many audio formats.  Format-specific

 *  extensions can be defined for particular formats by using a non-zero

 *  cbSize value and adding extra fields to the end of this structure.

 *

 ***************************************************************************/



#ifndef _WAVEFORMATEX_



    #define _WAVEFORMATEX_

    typedef struct tWAVEFORMATEX

    {

        WORD wFormatTag;        // Integer identifier of the format

        WORD nChannels;         // Number of audio channels

        DWORD nSamplesPerSec;   // Audio sample rate

        DWORD nAvgBytesPerSec;  // Bytes per second (possibly approximate)

        WORD nBlockAlign;       // Size in bytes of a sample block (all channels)

        WORD wBitsPerSample;    // Size in bits of a single per-channel sample

        WORD cbSize;            // Bytes of extra data appended to this struct

    } WAVEFORMATEX, *PWAVEFORMATEX, *LPWAVEFORMATEX;

    typedef const WAVEFORMATEX *LPCWAVEFORMATEX;



#endif





/**************************************************************************

 *

 *  WAVEFORMATEXTENSIBLE: Extended version of WAVEFORMATEX that should be

 *  used as a basis for all new audio formats.  The format tag is replaced

 *  with a GUID, allowing new formats to be defined without registering a

 *  format tag with Microsoft.  There are also new fields that can be used

 *  to specify the spatial positions for each channel and the bit packing

 *  used for wide samples (e.g. 24-bit PCM samples in 32-bit containers).

 *

 ***************************************************************************/



#ifndef _WAVEFORMATEXTENSIBLE_



    #define _WAVEFORMATEXTENSIBLE_

    typedef struct

    {

        WAVEFORMATEX Format;          // Base WAVEFORMATEX data

        union

        {

            WORD wValidBitsPerSample; // Valid bits in each sample container

            WORD wSamplesPerBlock;    // Samples per block of audio data; valid

                                      // if wBitsPerSample=0 (but rarely used).

            WORD wReserved;           // Zero if neither case above applies.

        } Samples;

        DWORD dwChannelMask;          // Positions of the audio channels

        GUID SubFormat;               // Format identifier GUID

    } WAVEFORMATEXTENSIBLE, *PWAVEFORMATEXTENSIBLE, *LPPWAVEFORMATEXTENSIBLE;

    typedef const WAVEFORMATEXTENSIBLE* LPCWAVEFORMATEXTENSIBLE;



#endif





/**************************************************************************

 *

 *  Define the most common wave format tags used in WAVEFORMATEX formats.

 *  Note that including the mmreg.h header after this one may cause build

 *  problems; this cannot be avoided, since mmreg.h defines these macros

 *  without preprocessor guards.

 *

 ***************************************************************************/



#ifndef WAVE_FORMAT_PCM

    // If WAVE_FORMAT_PCM is not defined, we need to define some legacy types

    // for compatibility with the Windows mmreg.h / mmsystem.h header files.



    // Old general format structure (information common to all formats)

    typedef struct waveformat_tag

    {

        WORD wFormatTag;

        WORD nChannels;

        DWORD nSamplesPerSec;

        DWORD nAvgBytesPerSec;

        WORD nBlockAlign;

    } WAVEFORMAT, *PWAVEFORMAT, NEAR *NPWAVEFORMAT, FAR *LPWAVEFORMAT;



    // Specific format structure for PCM data

    typedef struct pcmwaveformat_tag

    {

        WAVEFORMAT wf;

        WORD wBitsPerSample;

    } PCMWAVEFORMAT, *PPCMWAVEFORMAT, NEAR *NPPCMWAVEFORMAT, FAR *LPPCMWAVEFORMAT;



    #define WAVE_FORMAT_PCM             0x0001 // Pulse code modulation

#endif



#ifndef WAVE_FORMAT_ADPCM

    #define WAVE_FORMAT_ADPCM           0x0002 // Adaptive differental PCM

#endif



#ifndef WAVE_FORMAT_IEEE_FLOAT

    #define WAVE_FORMAT_IEEE_FLOAT      0x0003 // 32-bit floating-point

#endif



#ifndef WAVE_FORMAT_MPEGLAYER3

    #define WAVE_FORMAT_MPEGLAYER3      0x0055 // ISO/MPEG Layer3

#endif



#ifndef WAVE_FORMAT_DOLBY_AC3_SPDIF

    #define WAVE_FORMAT_DOLBY_AC3_SPDIF 0x0092 // Dolby Audio Codec 3 over S/PDIF

#endif



#ifndef WAVE_FORMAT_WMASPDIF

    #define WAVE_FORMAT_WMASPDIF        0x0164 // Windows Media Audio over S/PDIF

#endif



#ifndef WAVE_FORMAT_EXTENSIBLE

    #define WAVE_FORMAT_EXTENSIBLE      0xFFFE // All WAVEFORMATEXTENSIBLE formats

#endif





/**************************************************************************

 *

 *  Define the most common wave format GUIDs used in WAVEFORMATEXTENSIBLE

 *  formats.  Note that including the Windows ksmedia.h header after this

 *  one will cause build problems; this cannot be avoided, since ksmedia.h

 *  defines these macros without preprocessor guards.

 *

 ***************************************************************************/



#ifdef __cplusplus // uuid() and __uuidof() are only available in C++



    #ifndef KSDATAFORMAT_SUBTYPE_PCM

        struct __declspec(uuid("00000001-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_PCM_STRUCT;

        #define KSDATAFORMAT_SUBTYPE_PCM __uuidof(KSDATAFORMAT_SUBTYPE_PCM_STRUCT)

    #endif



    #ifndef KSDATAFORMAT_SUBTYPE_ADPCM

        struct __declspec(uuid("00000002-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT;

        #define KSDATAFORMAT_SUBTYPE_ADPCM __uuidof(KSDATAFORMAT_SUBTYPE_ADPCM_STRUCT)

    #endif



    #ifndef KSDATAFORMAT_SUBTYPE_IEEE_FLOAT

        struct __declspec(uuid("00000003-0000-0010-8000-00aa00389b71")) KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT;

        #define KSDATAFORMAT_SUBTYPE_IEEE_FLOAT __uuidof(KSDATAFORMAT_SUBTYPE_IEEE_FLOAT_STRUCT)

    #endif



#endif





/**************************************************************************

 *

 *  Speaker positions used in the WAVEFORMATEXTENSIBLE dwChannelMask field.

 *

 ***************************************************************************/



#ifndef SPEAKER_FRONT_LEFT

    #define SPEAKER_FRONT_LEFT            0x00000001

    #define SPEAKER_FRONT_RIGHT           0x00000002

    #define SPEAKER_FRONT_CENTER          0x00000004

    #define SPEAKER_LOW_FREQUENCY         0x00000008

    #define SPEAKER_BACK_LEFT             0x00000010

    #define SPEAKER_BACK_RIGHT            0x00000020

    #define SPEAKER_FRONT_LEFT_OF_CENTER  0x00000040

    #define SPEAKER_FRONT_RIGHT_OF_CENTER 0x00000080

    #define SPEAKER_BACK_CENTER           0x00000100

    #define SPEAKER_SIDE_LEFT             0x00000200

    #define SPEAKER_SIDE_RIGHT            0x00000400

    #define SPEAKER_TOP_CENTER            0x00000800

    #define SPEAKER_TOP_FRONT_LEFT        0x00001000

    #define SPEAKER_TOP_FRONT_CENTER      0x00002000

    #define SPEAKER_TOP_FRONT_RIGHT       0x00004000

    #define SPEAKER_TOP_BACK_LEFT         0x00008000

    #define SPEAKER_TOP_BACK_CENTER       0x00010000

    #define SPEAKER_TOP_BACK_RIGHT        0x00020000

    #define SPEAKER_RESERVED              0x7FFC0000

    #define SPEAKER_ALL                   0x80000000

    #define _SPEAKER_POSITIONS_

#endif



#ifndef SPEAKER_STEREO

    #define SPEAKER_MONO             (SPEAKER_FRONT_CENTER)

    #define SPEAKER_STEREO           (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT)

    #define SPEAKER_2POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY)

    #define SPEAKER_SURROUND         (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_BACK_CENTER)

    #define SPEAKER_QUAD             (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)

    #define SPEAKER_4POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)

    #define SPEAKER_5POINT1          (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_BACK_LEFT | SPEAKER_BACK_RIGHT)

    #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)

    #define SPEAKER_5POINT1_SURROUND (SPEAKER_FRONT_LEFT | SPEAKER_FRONT_RIGHT | SPEAKER_FRONT_CENTER | SPEAKER_LOW_FREQUENCY | SPEAKER_SIDE_LEFT | SPEAKER_SIDE_RIGHT)

    #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)

#endif





#pragma pack(pop)



#endif // #ifndef __AUDIODEFS_INCLUDED__

