Home | History | Annotate | Line # | Download | only in common
libaudio.h revision 1.3.8.1
      1  1.3.8.1  minoura /*	$NetBSD: libaudio.h,v 1.3.8.1 2000/06/23 16:30:12 minoura Exp $	*/
      2      1.1      mrg 
      3      1.2      mrg /*
      4      1.2      mrg  * Copyright (c) 1999 Matthew R. Green
      5      1.2      mrg  * All rights reserved.
      6      1.2      mrg  *
      7      1.2      mrg  * Redistribution and use in source and binary forms, with or without
      8      1.2      mrg  * modification, are permitted provided that the following conditions
      9      1.2      mrg  * are met:
     10      1.2      mrg  * 1. Redistributions of source code must retain the above copyright
     11      1.2      mrg  *    notice, this list of conditions and the following disclaimer.
     12      1.2      mrg  * 2. Redistributions in binary form must reproduce the above copyright
     13      1.2      mrg  *    notice, this list of conditions and the following disclaimer in the
     14      1.2      mrg  *    documentation and/or other materials provided with the distribution.
     15      1.2      mrg  * 3. The name of the author may not be used to endorse or promote products
     16      1.2      mrg  *    derived from this software without specific prior written permission.
     17      1.2      mrg  *
     18      1.2      mrg  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
     19      1.2      mrg  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
     20      1.2      mrg  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
     21      1.2      mrg  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
     22      1.2      mrg  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
     23      1.2      mrg  * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
     24      1.2      mrg  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
     25      1.2      mrg  * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
     26      1.2      mrg  * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     27      1.2      mrg  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     28      1.2      mrg  * SUCH DAMAGE.
     29      1.2      mrg  */
     30      1.1      mrg 
     31      1.1      mrg /*
     32      1.1      mrg  * We copy the Sun/NeXT on-disk audio header format and document what
     33      1.1      mrg  * we know of it here.
     34      1.1      mrg  *
     35      1.1      mrg  * The header size appears to be an offset to where the data really
     36      1.1      mrg  * begins, rather than defining the real length of the audio header.
     37      1.1      mrg  * The Sun/NeXT audio format seems to only use 24 bytes of data (with
     38      1.1      mrg  * an additional 8 bytes of nuls written, padding it to 32 bytes).
     39      1.1      mrg  *
     40      1.1      mrg  * If the size of the audio data is unknown (eg, reading from a pipe)
     41      1.1      mrg  * the Sun demo audio tools place AUDIO_UNKNOWN_SIZE in the
     42      1.1      mrg  * `data_size' member.
     43      1.1      mrg  *
     44      1.1      mrg  * For stereo data, the channels appear to be interleaved with the
     45      1.1      mrg  * left channel first.  For more channels, who knows?
     46      1.1      mrg  */
     47      1.1      mrg 
     48      1.1      mrg /*
     49      1.1      mrg  * This is the Sun/NeXT audio file magic value.  Note that it
     50      1.1      mrg  * is also `.snd' in ASCII.
     51      1.1      mrg  */
     52      1.1      mrg #define	AUDIO_FILE_MAGIC		((u_int32_t)0x2e736e64)
     53      1.1      mrg #define AUDIO_UNKNOWN_SIZE		((unsigned)(~0))
     54      1.1      mrg 
     55      1.1      mrg typedef struct {
     56      1.1      mrg 	u_int32_t	magic;
     57      1.1      mrg 	u_int32_t	hdr_size;	/* header size; in bytes */
     58      1.1      mrg 	u_int32_t	data_size;	/* optional; in bytes */
     59      1.1      mrg 	u_int32_t	encoding;	/* see below */
     60      1.1      mrg 	u_int32_t	sample_rate;	/* per second */
     61      1.1      mrg 	u_int32_t	channels;	/* number of interleaved channels */
     62      1.1      mrg } sun_audioheader;
     63      1.1      mrg 
     64      1.1      mrg #define Audio_filehdr sun_audioheader	/* SunOS compat(?) */
     65      1.1      mrg 
     66      1.1      mrg /*
     67      1.1      mrg  * these are the types of "encoding" for above.  taken from the
     68      1.1      mrg  * SunOS <multimedia/audio_filehdr.h>.
     69      1.1      mrg  */
     70      1.1      mrg #define	AUDIO_FILE_ENCODING_MULAW_8		1
     71      1.1      mrg #define	AUDIO_FILE_ENCODING_LINEAR_8		2
     72      1.1      mrg #define	AUDIO_FILE_ENCODING_LINEAR_16		3
     73      1.1      mrg #define	AUDIO_FILE_ENCODING_LINEAR_24		4
     74      1.1      mrg #define	AUDIO_FILE_ENCODING_LINEAR_32		5
     75      1.1      mrg #define	AUDIO_FILE_ENCODING_FLOAT		6
     76      1.1      mrg #define	AUDIO_FILE_ENCODING_DOUBLE		7
     77      1.1      mrg #define	AUDIO_FILE_ENCODING_ADPCM_G721		23
     78      1.1      mrg #define	AUDIO_FILE_ENCODING_ADPCM_G722		24
     79      1.1      mrg #define	AUDIO_FILE_ENCODING_ADPCM_G723_3	25
     80      1.1      mrg #define	AUDIO_FILE_ENCODING_ADPCM_G723_5	26
     81      1.1      mrg #define	AUDIO_FILE_ENCODING_ALAW_8		27
     82      1.1      mrg 
     83      1.1      mrg char	*audio_enc_from_val __P((int));
     84      1.1      mrg int	audio_enc_to_val __P((const char *));
     85      1.1      mrg 
     86      1.1      mrg int	audio_get_sun_encoding __P((int, int *, int *));
     87      1.1      mrg 
     88      1.1      mrg /*
     89      1.1      mrg  * M$ WAV files, info gleamed from sox sources
     90      1.1      mrg  */
     91      1.1      mrg 
     92      1.1      mrg /*
     93      1.1      mrg  * This is the WAV audio file magic value.  Note that it
     94      1.1      mrg  * is also `RIFF' and `WAVE' in ASCII.
     95      1.1      mrg  */
     96      1.1      mrg #define	WAVAUDIO_FILE_MAGIC_RIFF	((u_int32_t)0x52494646)
     97      1.1      mrg #define	WAVAUDIO_FILE_MAGIC_WAVE	((u_int32_t)0x57415645)
     98      1.1      mrg #define	WAVAUDIO_FILE_MAGIC_FMT		((u_int32_t)0x666d7420)
     99      1.1      mrg #define	WAVAUDIO_FILE_MAGIC_DATA	((u_int32_t)0x64617461)
    100      1.1      mrg 
    101      1.1      mrg /* purloined from public Microsoft RIFF docs via sox */
    102      1.1      mrg #define WAVE_FORMAT_UNKNOWN		(0x0000)
    103      1.1      mrg #define WAVE_FORMAT_PCM			(0x0001)
    104      1.1      mrg #define WAVE_FORMAT_ADPCM		(0x0002)
    105      1.1      mrg #define WAVE_FORMAT_ALAW		(0x0006)
    106      1.1      mrg #define WAVE_FORMAT_MULAW		(0x0007)
    107      1.1      mrg #define WAVE_FORMAT_OKI_ADPCM		(0x0010)
    108      1.1      mrg #define WAVE_FORMAT_DIGISTD		(0x0015)
    109      1.1      mrg #define WAVE_FORMAT_DIGIFIX		(0x0016)
    110      1.1      mrg #define IBM_FORMAT_MULAW		(0x0101)
    111      1.1      mrg #define IBM_FORMAT_ALAW			(0x0102)
    112      1.1      mrg #define IBM_FORMAT_ADPCM		(0x0103)
    113      1.1      mrg 
    114      1.1      mrg typedef struct {
    115      1.1      mrg 	char		name[4];
    116      1.1      mrg 	u_int32_t	len;
    117      1.1      mrg } wav_audioheaderpart;
    118      1.1      mrg 
    119      1.1      mrg typedef struct {
    120      1.1      mrg 	u_int16_t	tag;
    121      1.1      mrg 	u_int16_t	channels;
    122      1.1      mrg 	u_int32_t	sample_rate;
    123      1.1      mrg 	u_int32_t	avg_bps;
    124      1.1      mrg 	u_int16_t	alignment;
    125      1.1      mrg 	u_int16_t	bits_per_sample;
    126      1.1      mrg } wav_audioheaderfmt __attribute__((__packed__));
    127      1.1      mrg 
    128      1.1      mrg /* returns size of header, or -1 */
    129      1.1      mrg size_t audio_parse_wav_hdr __P((void *, size_t, int *, int *, int *, int *));
    130      1.1      mrg 
    131      1.1      mrg /*
    132      1.1      mrg  * audio routine error codes
    133      1.1      mrg  */
    134      1.1      mrg #define AUDIO_ENOENT		-1		/* no such audio format */
    135      1.1      mrg #define AUDIO_ESHORTHDR		-2		/* short header */
    136      1.1      mrg #define AUDIO_EWAVUNSUPP	-3		/* WAV: unsupported file */
    137      1.1      mrg #define AUDIO_EWAVBADPCM	-4		/* WAV: bad PCM bps */
    138      1.1      mrg #define AUDIO_EWAVNODATA	-5		/* WAV: missing data */
    139      1.1      mrg 
    140      1.1      mrg #define AUDIO_MAXERRNO		5
    141      1.1      mrg 
    142      1.1      mrg /* and something to get a string associated with this error */
    143      1.1      mrg const char *audio_errstring __P((int));
    144      1.1      mrg 
    145      1.1      mrg /*
    146      1.1      mrg  * generic routines?
    147      1.1      mrg  */
    148      1.1      mrg void	decode_int __P((const char *, int *));
    149      1.1      mrg void	decode_time __P((const char *, struct timeval *));
    150      1.1      mrg void	decode_encoding __P((const char *, int *));
    151      1.1      mrg 
    152      1.1      mrg /*
    153      1.1      mrg  * get/put 16/32 bits of big/little endian data
    154      1.1      mrg  */
    155      1.1      mrg #include <sys/types.h>
    156      1.1      mrg #include <machine/endian.h>
    157      1.1      mrg #include <machine/bswap.h>
    158      1.1      mrg 
    159      1.1      mrg #if BYTE_ORDER == BIG_ENDIAN
    160      1.1      mrg 
    161      1.1      mrg #define getle16(v)	bswap16(v)
    162      1.1      mrg #define getle32(v)	bswap32(v)
    163      1.1      mrg #define getbe16(v)	(v)
    164      1.1      mrg #define getbe32(v)	(v)
    165      1.1      mrg 
    166      1.1      mrg #else
    167      1.1      mrg 
    168      1.1      mrg #define getle16(v)	(v)
    169      1.1      mrg #define getle32(v)	(v)
    170      1.1      mrg #define getbe16(v)	bswap16(v)
    171      1.1      mrg #define getbe32(v)	bswap32(v)
    172      1.1      mrg 
    173      1.1      mrg #endif
    174