/*- * Copyright (c) 2008 Ariff Abdullah * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. 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. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``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 OR CONTRIBUTORS 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. * * $FreeBSD$ */ #ifndef _SND_WAVEUTIL_H_ #define _SND_WAVEUTIL_H_ struct wave_info { uint32_t format; uint32_t bit; uint32_t channels; uint32_t rate; uint32_t endian; uint32_t header_size; uint32_t data_size; FILE *fp; int seekable; }; #define WAVE_HEADER_SIZE 44 #define WAVE_HEADER_SIZE_G711 58 #define WAVE_HEADER_SIZE_EXT 80 #define WAVE_DATA_SIZE_BIG 0x7ffff000U #define WAVE_BLOCK_ALIGN(w) (((w)->bit >> 3) * (w)->channels) #define WAVE_FORMAT_UNKNOWN 0x0000U #define WAVE_FORMAT_PCM 0x0001U #define WAVE_FORMAT_ALAW 0x0006U #define WAVE_FORMAT_ULAW 0x0007U #define WAVE_FORMAT_EXT 0xfffeU #define WAVE_MKMAGIC(a, b, c, d) ((uint32_t)(a) << 24 | \ (b) << 16 | (c) << 8 | (d)) #define WAVE_MAGIC_RIFF WAVE_MKMAGIC('R', 'I', 'F', 'F') #define WAVE_MAGIC_RIFX WAVE_MKMAGIC('R', 'I', 'F', 'X') #define WAVE_MAGIC_WAVE WAVE_MKMAGIC('W', 'A', 'V', 'E') #define WAVE_MAGIC_FMT WAVE_MKMAGIC('f', 'm', 't', ' ') #define WAVE_MAGIC_DATA WAVE_MKMAGIC('d', 'a', 't', 'a') #define WAVE_MAGIC_FACT WAVE_MKMAGIC('f', 'a', 'c', 't') enum { WAVE_UNKNOWN_ENDIAN, WAVE_LITTLE_ENDIAN, WAVE_BIG_ENDIAN }; #define WAVE_READ_32(i, b) ((uint32_t) \ (((i)->endian == \ WAVE_LITTLE_ENDIAN) ? \ _PCM_READ_S32_LE(b) : \ _PCM_READ_S32_BE(b))) #define WAVE_WRITE_32(i, b, v) do { \ if ((i)->endian == WAVE_LITTLE_ENDIAN) \ _PCM_WRITE_S32_LE(b, (uint32_t)v); \ else \ _PCM_WRITE_S32_BE(b, (uint32_t)v); \ } while (0) #define WAVE_MAGIC_READ(b) ((uint32_t)_PCM_READ_S32_BE(b)) #define WAVE_MAGIC_WRITE(b, v) _PCM_WRITE_S32_BE(b, (uint32_t)v) #define WAVE_READ_16(i, b) ((uint32_t) \ (((i)->endian == \ WAVE_LITTLE_ENDIAN) ? \ _PCM_READ_S16_LE(b) : \ _PCM_READ_S16_BE(b)) & 0x0000ffff) #define WAVE_WRITE_16(i, b, v) do { \ if ((i)->endian == WAVE_LITTLE_ENDIAN) \ _PCM_WRITE_S16_LE(b, (uint32_t)(v) & 0x0000ffff); \ else \ _PCM_WRITE_S16_BE(b, (uint32_t)(v) & 0x0000ffff); \ } while (0) int wave_header_read(struct wave_info *); int wave_header_write(struct wave_info *); #endif /* !_SND_WAVEUTIL_H_ */