/*
  Simple DirectMedia Layer
  Copyright (C) 1997-2021 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 malloc 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: */
