• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 /* Note: the following macros evaluate the parameter v twice */
64 #define TO_CPU_SHORT(v, be) \
65 	((be) ? BE_SHORT(v) : LE_SHORT(v))
66 #define TO_CPU_INT(v, be) \
67 	((be) ? BE_INT(v) : LE_INT(v))
68 
69 #define WAV_RIFF		COMPOSE_ID('R','I','F','F')
70 #define WAV_RIFX		COMPOSE_ID('R','I','F','X')
71 #define WAV_WAVE		COMPOSE_ID('W','A','V','E')
72 #define WAV_FMT			COMPOSE_ID('f','m','t',' ')
73 #define WAV_DATA		COMPOSE_ID('d','a','t','a')
74 
75 /* WAVE fmt block constants from Microsoft mmreg.h header */
76 #define WAV_FMT_PCM             0x0001
77 #define WAV_FMT_IEEE_FLOAT      0x0003
78 #define WAV_FMT_DOLBY_AC3_SPDIF 0x0092
79 #define WAV_FMT_EXTENSIBLE      0xfffe
80 
81 /* Used with WAV_FMT_EXTENSIBLE format */
82 #define WAV_GUID_TAG		"\x00\x00\x00\x00\x10\x00\x80\x00\x00\xAA\x00\x38\x9B\x71"
83 
84 /* it's in chunks like .voc and AMIGA iff, but my source say there
85    are in only in this combination, so I combined them in one header;
86    it works on all WAVE-file I have
87  */
88 typedef struct {
89 	u_int magic;		/* 'RIFF' */
90 	u_int length;		/* filelen */
91 	u_int type;		/* 'WAVE' */
92 } WaveHeader;
93 
94 typedef struct {
95 	u_short format;		/* see WAV_FMT_* */
96 	u_short channels;
97 	u_int sample_fq;	/* frequence of sample */
98 	u_int byte_p_sec;
99 	u_short byte_p_spl;	/* samplesize; 1 or 2 bytes */
100 	u_short bit_p_spl;	/* 8, 12 or 16 bit */
101 } WaveFmtBody;
102 
103 typedef struct {
104 	WaveFmtBody format;
105 	u_short ext_size;
106 	u_short bit_p_spl;
107 	u_int channel_mask;
108 	u_short guid_format;	/* WAV_FMT_* */
109 	u_char guid_tag[14];	/* WAV_GUID_TAG */
110 } WaveFmtExtensibleBody;
111 
112 typedef struct {
113 	u_int type;		/* 'data' */
114 	u_int length;		/* samplecount */
115 } WaveChunkHeader;
116 
117 /* Definitions for Sparc .au header */
118 
119 #define AU_MAGIC		COMPOSE_ID('.','s','n','d')
120 
121 #define AU_FMT_ULAW		1
122 #define AU_FMT_LIN8		2
123 #define AU_FMT_LIN16		3
124 
125 typedef struct au_header {
126 	u_int magic;		/* '.snd' */
127 	u_int hdr_size;		/* size of header (min 24) */
128 	u_int data_size;	/* size of data */
129 	u_int encoding;		/* see to AU_FMT_XXXX */
130 	u_int sample_rate;	/* sample rate */
131 	u_int channels;		/* number of channels (voices) */
132 } AuHeader;
133 
134 #endif				/* FORMATS */
135