Home | History | Annotate | Download | only in aplay
      1 #ifndef FORMATS_H
      2 #define FORMATS_H		1
      3 
      4 #include <endian.h>
      5 #include <byteswap.h>
      6 
      7 /* Definitions for .VOC files */
      8 
      9 #define VOC_MAGIC_STRING	"Creative Voice File\x1A"
     10 #define VOC_ACTUAL_VERSION	0x010A
     11 #define VOC_SAMPLESIZE		8
     12 
     13 #define VOC_MODE_MONO		0
     14 #define VOC_MODE_STEREO		1
     15 
     16 #define VOC_DATALEN(bp)		((u_long)(bp->datalen) | \
     17                          	((u_long)(bp->datalen_m) << 8) | \
     18                          	((u_long)(bp->datalen_h) << 16) )
     19 
     20 typedef struct voc_header {
     21 	u_char magic[20];	/* must be MAGIC_STRING */
     22 	u_short headerlen;	/* Headerlength, should be 0x1A */
     23 	u_short version;	/* VOC-file version */
     24 	u_short coded_ver;	/* 0x1233-version */
     25 } VocHeader;
     26 
     27 typedef struct voc_blocktype {
     28 	u_char type;
     29 	u_char datalen;		/* low-byte    */
     30 	u_char datalen_m;	/* medium-byte */
     31 	u_char datalen_h;	/* high-byte   */
     32 } VocBlockType;
     33 
     34 typedef struct voc_voice_data {
     35 	u_char tc;
     36 	u_char pack;
     37 } VocVoiceData;
     38 
     39 typedef struct voc_ext_block {
     40 	u_short tc;
     41 	u_char pack;
     42 	u_char mode;
     43 } VocExtBlock;
     44 
     45 /* Definitions for Microsoft WAVE format */
     46 
     47 #if __BYTE_ORDER == __LITTLE_ENDIAN
     48 #define COMPOSE_ID(a,b,c,d)	((a) | ((b)<<8) | ((c)<<16) | ((d)<<24))
     49 #define LE_SHORT(v)		(v)
     50 #define LE_INT(v)		(v)
     51 #define BE_SHORT(v)		bswap_16(v)
     52 #define BE_INT(v)		bswap_32(v)
     53 #elif __BYTE_ORDER == __BIG_ENDIAN
     54 #define COMPOSE_ID(a,b,c,d)	((d) | ((c)<<8) | ((b)<<16) | ((a)<<24))
     55 #define LE_SHORT(v)		bswap_16(v)
     56 #define LE_INT(v)		bswap_32(v)
     57 #define BE_SHORT(v)		(v)
     58 #define BE_INT(v)		(v)
     59 #else
     60 #error "Wrong endian"
     61 #endif
     62 
     63 #define WAV_RIFF		COMPOSE_ID('R','I','F','F')
     64 #define WAV_WAVE		COMPOSE_ID('W','A','V','E')
     65 #define WAV_FMT			COMPOSE_ID('f','m','t',' ')
     66 #define WAV_DATA		COMPOSE_ID('d','a','t','a')
     67 
     68 /* WAVE fmt block constants from Microsoft mmreg.h header */
     69 #define WAV_FMT_PCM             0x0001
     70 #define WAV_FMT_IEEE_FLOAT      0x0003
     71 #define WAV_FMT_DOLBY_AC3_SPDIF 0x0092
     72 #define WAV_FMT_EXTENSIBLE      0xfffe
     73 
     74 /* Used with WAV_FMT_EXTENSIBLE format */
     75 #define WAV_GUID_TAG		"\x00\x00\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71"
     76 
     77 /* it's in chunks like .voc and AMIGA iff, but my source say there
     78    are in only in this combination, so I combined them in one header;
     79    it works on all WAVE-file I have
     80  */
     81 typedef struct {
     82 	u_int magic;		/* 'RIFF' */
     83 	u_int length;		/* filelen */
     84 	u_int type;		/* 'WAVE' */
     85 } WaveHeader;
     86 
     87 typedef struct {
     88 	u_short format;		/* see WAV_FMT_* */
     89 	u_short channels;
     90 	u_int sample_fq;	/* frequence of sample */
     91 	u_int byte_p_sec;
     92 	u_short byte_p_spl;	/* samplesize; 1 or 2 bytes */
     93 	u_short bit_p_spl;	/* 8, 12 or 16 bit */
     94 } WaveFmtBody;
     95 
     96 typedef struct {
     97 	WaveFmtBody format;
     98 	u_short ext_size;
     99 	u_short bit_p_spl;
    100 	u_int channel_mask;
    101 	u_short guid_format;	/* WAV_FMT_* */
    102 	u_char guid_tag[14];	/* WAV_GUID_TAG */
    103 } WaveFmtExtensibleBody;
    104 
    105 typedef struct {
    106 	u_int type;		/* 'data' */
    107 	u_int length;		/* samplecount */
    108 } WaveChunkHeader;
    109 
    110 /* Definitions for Sparc .au header */
    111 
    112 #define AU_MAGIC		COMPOSE_ID('.','s','n','d')
    113 
    114 #define AU_FMT_ULAW		1
    115 #define AU_FMT_LIN8		2
    116 #define AU_FMT_LIN16		3
    117 
    118 typedef struct au_header {
    119 	u_int magic;		/* '.snd' */
    120 	u_int hdr_size;		/* size of header (min 24) */
    121 	u_int data_size;	/* size of data */
    122 	u_int encoding;		/* see to AU_FMT_XXXX */
    123 	u_int sample_rate;	/* sample rate */
    124 	u_int channels;		/* number of channels (voices) */
    125 } AuHeader;
    126 
    127 #endif				/* FORMATS */
    128