/* * Copyright (c) 2011 Jan Vesely * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup wavplay * @{ */ /** @file * @brief .wav file format. */ #ifndef WAVE_H #define WAVE_H #include <stdint.h> #include <pcm/format.h> #include <pcm/sample_format.h> /** Wave file header format. * * https://ccrma.stanford.edu/courses/422/projects/WaveFormat/ * @note: 8-bit samples are stored as unsigned bytes, * 16-bit samples are stored as signed integers. * @note: The default byte ordering assumed for WAVE data files is * little-endian. Files written using the big-endian byte ordering scheme have * the identifier RIFX instead of RIFF. */ typedef struct wave_header { /** Should be 'R', 'I', 'F', 'F'. */ char chunk_id[4]; #define CHUNK_ID "RIFF" /** Total size minus the first 8 bytes */ uint32_t chunk_size; /** Should be 'W', 'A', 'V', 'E'. */ char format[4]; #define FORMAT_STR "WAVE" /** Should be 'f', 'm', 't', ' '. */ char subchunk1_id[4]; #define SUBCHUNK1_ID "fmt " /** Size of the ret of this subchunk. 16 for PCM file. */ uint32_t subchunk1_size; #define PCM_SUBCHUNK1_SIZE 16 /** Format. 1 for Linear PCM */ uint16_t audio_format; #define FORMAT_LINEAR_PCM 1 /** Number of channels. */ uint16_t channels; /** Sampling rate. */ uint32_t sampling_rate; /** Byte rate. */ uint32_t byte_rate; /** Block align. Bytes in one block (samples for all channels). */ uint16_t block_align; /** Bits per sample (one channel). */ uint16_t sample_size; /** Should be 'd', 'a', 't', 'a'. */ char subchunk2_id[4]; #define SUBCHUNK2_ID "data" /** Audio data size. */ uint32_t subchunk2_size; /** Audio data. */ uint8_t data[]; } wave_header_t; errno_t wav_parse_header(const void *, const void **, size_t *, unsigned *, unsigned *, pcm_sample_format_t *, const char **); void wav_init_header(wave_header_t *, pcm_format_t, size_t); #endif /** * @} */