| /* |
| Simple DirectMedia Layer |
| Copyright (C) 1997-2023 Sam Lantinga <slouken@libsdl.org> |
| |
| This software is provided 'as-is', without any express or implied |
| warranty. In no event will the authors be held liable for any damages |
| arising from the use of this software. |
| |
| Permission is granted to anyone to use this software for any purpose, |
| including commercial applications, and to alter it and redistribute it |
| freely, subject to the following restrictions: |
| |
| 1. The origin of this software must not be misrepresented; you must not |
| claim that you wrote the original software. If you use this software |
| in a product, an acknowledgment in the product documentation would be |
| appreciated but is not required. |
| 2. Altered source versions must be plainly marked as such, and must not be |
| misrepresented as being the original software. |
| 3. This notice may not be removed or altered from any source distribution. |
| */ |
| #include "../SDL_internal.h" |
| |
| /* RIFF WAVE files are little-endian */ |
| |
| /*******************************************/ |
| /* Define values for Microsoft WAVE format */ |
| /*******************************************/ |
| /* FOURCC */ |
| #define RIFF 0x46464952 /* "RIFF" */ |
| #define WAVE 0x45564157 /* "WAVE" */ |
| #define FACT 0x74636166 /* "fact" */ |
| #define LIST 0x5453494c /* "LIST" */ |
| #define BEXT 0x74786562 /* "bext" */ |
| #define JUNK 0x4B4E554A /* "JUNK" */ |
| #define FMT 0x20746D66 /* "fmt " */ |
| #define DATA 0x61746164 /* "data" */ |
| /* Format tags */ |
| #define UNKNOWN_CODE 0x0000 |
| #define PCM_CODE 0x0001 |
| #define MS_ADPCM_CODE 0x0002 |
| #define IEEE_FLOAT_CODE 0x0003 |
| #define ALAW_CODE 0x0006 |
| #define MULAW_CODE 0x0007 |
| #define IMA_ADPCM_CODE 0x0011 |
| #define MPEG_CODE 0x0050 |
| #define MPEGLAYER3_CODE 0x0055 |
| #define EXTENSIBLE_CODE 0xFFFE |
| |
| /* Stores the WAVE format information. */ |
| typedef struct WaveFormat |
| { |
| Uint16 formattag; /* Raw value of the first field in the fmt chunk data. */ |
| Uint16 encoding; /* Actual encoding, possibly from the extensible header. */ |
| Uint16 channels; /* Number of channels. */ |
| Uint32 frequency; /* Sampling rate in Hz. */ |
| Uint32 byterate; /* Average bytes per second. */ |
| Uint16 blockalign; /* Bytes per block. */ |
| Uint16 bitspersample; /* Currently supported are 8, 16, 24, 32, and 4 for ADPCM. */ |
| |
| /* Extra information size. Number of extra bytes starting at byte 18 in the |
| * fmt chunk data. This is at least 22 for the extensible header. |
| */ |
| Uint16 extsize; |
| |
| /* Extensible WAVE header fields */ |
| Uint16 validsamplebits; |
| Uint32 samplesperblock; /* For compressed formats. Can be zero. Actually 16 bits in the header. */ |
| Uint32 channelmask; |
| Uint8 subformat[16]; /* A format GUID. */ |
| } WaveFormat; |
| |
| /* Stores information on the fact chunk. */ |
| typedef struct WaveFact |
| { |
| /* Represents the state of the fact chunk in the WAVE file. |
| * Set to -1 if the fact chunk is invalid. |
| * Set to 0 if the fact chunk is not present |
| * Set to 1 if the fact chunk is present and valid. |
| * Set to 2 if samplelength is going to be used as the number of sample frames. |
| */ |
| Sint32 status; |
| |
| /* Version 1 of the RIFF specification calls the field in the fact chunk |
| * dwFileSize. The Standards Update then calls it dwSampleLength and specifies |
| * that it is 'the length of the data in samples'. WAVE files from Windows |
| * with this chunk have it set to the samples per channel (sample frames). |
| * This is useful to truncate compressed audio to a specific sample count |
| * because a compressed block is usually decoded to a fixed number of |
| * sample frames. |
| */ |
| Uint32 samplelength; /* Raw sample length value from the fact chunk. */ |
| } WaveFact; |
| |
| /* Generic struct for the chunks in the WAVE file. */ |
| typedef struct WaveChunk |
| { |
| Uint32 fourcc; /* FOURCC of the chunk. */ |
| Uint32 length; /* Size of the chunk data. */ |
| Sint64 position; /* Position of the data in the stream. */ |
| Uint8 *data; /* When allocated, this points to the chunk data. length is used for the memory allocation size. */ |
| size_t size; /* Number of bytes in data that could be read from the stream. Can be smaller than length. */ |
| } WaveChunk; |
| |
| /* Controls how the size of the RIFF chunk affects the loading of a WAVE file. */ |
| typedef enum WaveRiffSizeHint |
| { |
| RiffSizeNoHint, |
| RiffSizeForce, |
| RiffSizeIgnoreZero, |
| RiffSizeIgnore, |
| RiffSizeMaximum |
| } WaveRiffSizeHint; |
| |
| /* Controls how a truncated WAVE file is handled. */ |
| typedef enum WaveTruncationHint |
| { |
| TruncNoHint, |
| TruncVeryStrict, |
| TruncStrict, |
| TruncDropFrame, |
| TruncDropBlock |
| } WaveTruncationHint; |
| |
| /* Controls how the fact chunk affects the loading of a WAVE file. */ |
| typedef enum WaveFactChunkHint |
| { |
| FactNoHint, |
| FactTruncate, |
| FactStrict, |
| FactIgnoreZero, |
| FactIgnore |
| } WaveFactChunkHint; |
| |
| typedef struct WaveFile |
| { |
| WaveChunk chunk; |
| WaveFormat format; |
| WaveFact fact; |
| |
| /* Number of sample frames that will be decoded. Calculated either with the |
| * size of the data chunk or, if the appropriate hint is enabled, with the |
| * sample length value from the fact chunk. |
| */ |
| Sint64 sampleframes; |
| |
| void *decoderdata; /* Some decoders require extra data for a state. */ |
| |
| WaveRiffSizeHint riffhint; |
| WaveTruncationHint trunchint; |
| WaveFactChunkHint facthint; |
| } WaveFile; |
| |
| /* vi: set ts=4 sw=4 expandtab: */ |