1/*
2	Audio File Library
3	Copyright (C) 1998-2000, Michael Pruett <michael@68k.org>
4
5	This library is free software; you can redistribute it and/or
6	modify it under the terms of the GNU Library General Public
7	License as published by the Free Software Foundation; either
8	version 2 of the License, or (at your option) any later version.
9
10	This library is distributed in the hope that it will be useful,
11	but WITHOUT ANY WARRANTY; without even the implied warranty of
12	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13	Library General Public License for more details.
14
15	You should have received a copy of the GNU Library General Public
16	License along with this library; if not, write to the
17	Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18	Boston, MA  02111-1307  USA.
19*/
20
21/*
22	audiofile.h
23
24	This file contains the public interfaces to the Audio File Library.
25*/
26
27#ifndef AUDIOFILE_H
28#define AUDIOFILE_H
29
30#include <sys/types.h>
31#include <aupvlist.h>
32
33#define LIBAUDIOFILE_MAJOR_VERSION 0
34#define LIBAUDIOFILE_MINOR_VERSION 2
35#define LIBAUDIOFILE_MICRO_VERSION 4
36
37#ifdef __cplusplus
38extern "C"
39{
40#endif /* __cplusplus */
41
42typedef struct _AFvirtualfile AFvirtualfile;
43
44typedef struct _AFfilesetup *AFfilesetup;
45typedef struct _AFfilehandle *AFfilehandle;
46typedef void (*AFerrfunc)(long, const char *);
47
48typedef off_t AFframecount;
49typedef off_t AFfileoffset;
50
51#define AF_NULL_FILESETUP	((struct _AFfilesetup *) 0)
52#define AF_NULL_FILEHANDLE	((struct _AFfilehandle *) 0)
53
54#define AF_ERR_BASE 3000
55
56enum
57{
58	AF_DEFAULT_TRACK = 1001
59};
60
61enum
62{
63	AF_DEFAULT_INST = 2001
64};
65
66enum
67{
68	AF_NUM_UNLIMITED = 99999
69};
70
71enum
72{
73	AF_BYTEORDER_BIGENDIAN = 501,
74	AF_BYTEORDER_LITTLEENDIAN = 502
75};
76
77enum
78{
79	AF_FILE_UNKNOWN = -1,
80	AF_FILE_RAWDATA = 0,
81	AF_FILE_AIFFC = 1,
82	AF_FILE_AIFF = 2,
83	AF_FILE_NEXTSND = 3,
84	AF_FILE_WAVE = 4,
85	AF_FILE_BICSF = 5,
86	AF_FILE_IRCAM = AF_FILE_BICSF,
87	AF_FILE_MPEG1BITSTREAM = 6,	/* not implemented */
88	AF_FILE_SOUNDDESIGNER1 = 7,	/* not implemented */
89	AF_FILE_SOUNDDESIGNER2 = 8,	/* not implemented */
90	AF_FILE_AVR = 9,
91	AF_FILE_IFF_8SVX = 10,
92	AF_FILE_SAMPLEVISION = 11,	/* not implemented */
93	AF_FILE_VOC = 12,		/* not implemented */
94	AF_FILE_NIST_SPHERE = 13,
95	AF_FILE_SOUNDFONT2 = 14		/* not implemented */
96};
97
98enum
99{
100	AF_LOOP_MODE_NOLOOP = 0,
101	AF_LOOP_MODE_FORW = 1,
102	AF_LOOP_MODE_FORWBAKW = 2
103};
104
105enum
106{
107	AF_SAMPFMT_TWOSCOMP = 401, /* linear two's complement */
108	AF_SAMPFMT_UNSIGNED = 402, /* unsigned integer */
109	AF_SAMPFMT_FLOAT = 403, /* 32-bit IEEE floating-point */
110	AF_SAMPFMT_DOUBLE = 404 /* 64-bit IEEE double-precision floating-point */
111};
112
113enum
114{
115	AF_INST_LOOP_OFF = 0,			/* no looping */
116	AF_INST_LOOP_CONTINUOUS = 1,	/* loop continuously through decay */
117	AF_INST_LOOP_SUSTAIN = 3		/* loop during sustain, then continue */
118};
119
120enum
121{
122	AF_INST_MIDI_BASENOTE = 301,
123	AF_INST_NUMCENTS_DETUNE = 302,
124	AF_INST_MIDI_LONOTE = 303,
125	AF_INST_MIDI_HINOTE = 304,
126	AF_INST_MIDI_LOVELOCITY = 305,
127	AF_INST_MIDI_HIVELOCITY = 306,
128	AF_INST_NUMDBS_GAIN = 307,
129	AF_INST_SUSLOOPID = 308,		/* loop id for AIFF sustain loop */
130	AF_INST_RELLOOPID = 309,		/* loop id for AIFF release loop */
131	AF_INST_SAMP_STARTFRAME = 310,	/* start sample for this inst */
132	AF_INST_SAMP_ENDFRAME = 311,	/* end sample for this inst */
133	AF_INST_SAMP_MODE = 312,		/* looping mode for this inst */
134	AF_INST_TRACKID = 313,
135	AF_INST_NAME = 314,				/* name of this inst */
136	AF_INST_SAMP_RATE = 315,		/* sample rate of this inst's sample */
137	AF_INST_PRESETID = 316,			/* ID of preset containing this inst */
138	AF_INST_PRESET_NAME = 317		/* name of preset containing this inst */
139};
140
141enum
142{
143	AF_MISC_UNRECOGNIZED = 0,	/* unrecognized data chunk */
144	AF_MISC_COPY = 201,	/* copyright string */
145	AF_MISC_AUTH = 202,	/* author string */
146	AF_MISC_NAME = 203,	/* name string */
147	AF_MISC_ANNO = 204,	/* annotation string */
148	AF_MISC_APPL = 205,	/* application-specific data */
149	AF_MISC_MIDI = 206,	/* MIDI exclusive data */
150	AF_MISC_PCMMAP = 207,	/* PCM mapping information (future use) */
151	AF_MISC_NeXT = 208,	/* misc binary data appended to NeXT header */
152	AF_MISC_IRCAM_PEAKAMP = 209,	/* peak amplitude information */
153	AF_MISC_IRCAM_COMMENT = 210,	/* BICSF text comment */
154	AF_MISC_COMMENT = 210,	/* general text comment */
155
156	AF_MISC_ICMT = AF_MISC_COMMENT,	/* comments chunk (WAVE format) */
157	AF_MISC_ICRD = 211,  /* creation date (WAVE format) */
158	AF_MISC_ISFT = 212  /* software name (WAVE format) */
159};
160
161enum
162{
163	/* supported compression schemes */
164	AF_COMPRESSION_UNKNOWN = -1,
165	AF_COMPRESSION_NONE = 0,
166	AF_COMPRESSION_G722 = 501,
167	AF_COMPRESSION_G711_ULAW = 502,
168	AF_COMPRESSION_G711_ALAW = 503,
169
170	/* Apple proprietary AIFF-C compression schemes (not supported) */
171	AF_COMPRESSION_APPLE_ACE2 = 504,
172	AF_COMPRESSION_APPLE_ACE8 = 505,
173	AF_COMPRESSION_APPLE_MAC3 = 506,
174	AF_COMPRESSION_APPLE_MAC6 = 507,
175
176	AF_COMPRESSION_G726 = 517,
177	AF_COMPRESSION_G728 = 518,
178	AF_COMPRESSION_DVI_AUDIO = 519,
179	AF_COMPRESSION_IMA = AF_COMPRESSION_DVI_AUDIO,
180	AF_COMPRESSION_GSM = 520,
181	AF_COMPRESSION_FS1016 = 521,
182	AF_COMPRESSION_DV = 522,
183	AF_COMPRESSION_MS_ADPCM = 523
184};
185
186/* tokens for afQuery() -- see the man page for instructions */
187/* level 1 selectors */
188enum
189{
190	AF_QUERYTYPE_INSTPARAM = 500,
191	AF_QUERYTYPE_FILEFMT = 501,
192	AF_QUERYTYPE_COMPRESSION = 502,
193	AF_QUERYTYPE_COMPRESSIONPARAM = 503,
194	AF_QUERYTYPE_MISC = 504,
195	AF_QUERYTYPE_INST = 505,
196	AF_QUERYTYPE_MARK = 506,
197	AF_QUERYTYPE_LOOP = 507
198};
199
200/* level 2 selectors */
201enum
202{
203	AF_QUERY_NAME = 600,	/* get name (1-3 words) */
204	AF_QUERY_DESC = 601,	/* get description */
205	AF_QUERY_LABEL = 602,	/* get 4- or 5-char label */
206	AF_QUERY_TYPE = 603,	/* get type token */
207	AF_QUERY_DEFAULT = 604,	/* dflt. value for param */
208	AF_QUERY_ID_COUNT = 605,	/* get number of ids avail. */
209	AF_QUERY_IDS = 606,	/* get array of id tokens */
210	AF_QUERY_IMPLEMENTED = 613,	/* boolean */
211	AF_QUERY_TYPE_COUNT = 607,	/* get number of types av. */
212	AF_QUERY_TYPES = 608,	/* get array of types */
213	AF_QUERY_NATIVE_SAMPFMT = 609,	/* for compression */
214	AF_QUERY_NATIVE_SAMPWIDTH = 610,
215	AF_QUERY_SQUISHFAC = 611,	/* 1.0 means variable */
216	AF_QUERY_MAX_NUMBER = 612,	/* max allowed in file */
217	AF_QUERY_SUPPORTED = 613	/* insts, loops, etc., supported? */
218};
219
220/* level 2 selectors which have sub-selectors */
221enum
222{
223	AF_QUERY_TRACKS = 620,
224	AF_QUERY_CHANNELS = 621,
225	AF_QUERY_SAMPLE_SIZES = 622,
226	AF_QUERY_SAMPLE_FORMATS = 623,
227	AF_QUERY_COMPRESSION_TYPES = 624
228};
229
230/* level 3 sub-selectors */
231enum
232{
233	AF_QUERY_VALUE_COUNT = 650,	/* number of values of the above */
234	AF_QUERY_VALUES = 651	/* array of those values */
235};
236
237
238/*
239	Old Audio File Library error codes. These are still returned by the
240	AFerrorhandler calls, but are not used by the new digital media library
241	error reporting routines. See the bottom of this file for the new error
242	tokens.
243*/
244
245enum
246{
247	AF_BAD_NOT_IMPLEMENTED = 0,	/* not implemented yet */
248	AF_BAD_FILEHANDLE = 1,	/* tried to use invalid filehandle */
249	AF_BAD_OPEN = 3,	/* unix open failed */
250	AF_BAD_CLOSE = 4,	/* unix close failed */
251	AF_BAD_READ = 5,	/* unix read failed */
252	AF_BAD_WRITE = 6,	/* unix write failed */
253	AF_BAD_LSEEK = 7,	/* unix lseek failed */
254	AF_BAD_NO_FILEHANDLE = 8,	/* failed to allocate a filehandle struct */
255	AF_BAD_ACCMODE = 10,	/* unrecognized audio file access mode */
256	AF_BAD_NOWRITEACC = 11,	/* file not open for writing */
257	AF_BAD_NOREADACC = 12,	/* file not open for reading */
258	AF_BAD_FILEFMT = 13,	/* unrecognized audio file format */
259	AF_BAD_RATE = 14,	/* invalid sample rate */
260	AF_BAD_CHANNELS = 15,	/* invalid number of channels*/
261	AF_BAD_SAMPCNT = 16,	/* invalid sample count */
262	AF_BAD_WIDTH = 17,	/* invalid sample width */
263	AF_BAD_SEEKMODE = 18,	/* invalid seek mode */
264	AF_BAD_NO_LOOPDATA = 19,	/* failed to allocate loop struct */
265	AF_BAD_MALLOC = 20,	/* malloc failed somewhere */
266	AF_BAD_LOOPID = 21,
267	AF_BAD_SAMPFMT = 22,	/* bad sample format */
268	AF_BAD_FILESETUP = 23,	/* bad file setup structure*/
269	AF_BAD_TRACKID = 24,	/* no track corresponding to id */
270	AF_BAD_NUMTRACKS = 25,	/* wrong number of tracks for file format */
271	AF_BAD_NO_FILESETUP = 26,	/* failed to allocate a filesetup struct*/
272	AF_BAD_LOOPMODE = 27,	/* unrecognized loop mode value */
273	AF_BAD_INSTID = 28,	/* invalid instrument id */
274	AF_BAD_NUMLOOPS = 29,	/* bad number of loops */
275	AF_BAD_NUMMARKS = 30,	/* bad number of markers */
276	AF_BAD_MARKID = 31,	/* bad marker id */
277	AF_BAD_MARKPOS = 32,	/* invalid marker position value */
278	AF_BAD_NUMINSTS = 33,	/* invalid number of instruments */
279	AF_BAD_NOAESDATA = 34,
280	AF_BAD_MISCID = 35,
281	AF_BAD_NUMMISC = 36,
282	AF_BAD_MISCSIZE = 37,
283	AF_BAD_MISCTYPE = 38,
284	AF_BAD_MISCSEEK = 39,
285	AF_BAD_STRLEN = 40,	/* invalid string length */
286	AF_BAD_RATECONV = 45,
287	AF_BAD_SYNCFILE = 46,
288	AF_BAD_CODEC_CONFIG = 47,	/* improperly configured codec */
289	AF_BAD_CODEC_STATE = 48,	/* invalid codec state: can't recover */
290	AF_BAD_CODEC_LICENSE = 49,	/* no license available for codec */
291	AF_BAD_CODEC_TYPE = 50,	/* unsupported codec type */
292	AF_BAD_COMPRESSION = AF_BAD_CODEC_CONFIG,	/* for back compat */
293	AF_BAD_COMPTYPE = AF_BAD_CODEC_TYPE,	/* for back compat */
294
295	AF_BAD_INSTPTYPE = 51,	/* invalid instrument parameter type */
296	AF_BAD_INSTPID = 52,	/* invalid instrument parameter id */
297	AF_BAD_BYTEORDER = 53,
298	AF_BAD_FILEFMT_PARAM = 54,	/* unrecognized file format parameter */
299	AF_BAD_COMP_PARAM = 55,	/* unrecognized compression parameter */
300	AF_BAD_DATAOFFSET = 56,	/* bad data offset */
301	AF_BAD_FRAMECNT = 57,	/* bad frame count */
302	AF_BAD_QUERYTYPE = 58,	/* bad query type */
303	AF_BAD_QUERY = 59,	/* bad argument to afQuery() */
304	AF_WARNING_CODEC_RATE = 60,	/* using 8k instead of codec rate 8012 */
305	AF_WARNING_RATECVT = 61,	/* warning about rate conversion used */
306
307	AF_BAD_HEADER = 62,	/* failed to parse header */
308	AF_BAD_FRAME = 63,	/* bad frame number */
309	AF_BAD_LOOPCOUNT = 64,	/* bad loop count */
310	AF_BAD_DMEDIA_CALL = 65,	/* error in dmedia subsystem call */
311
312	/* AIFF/AIFF-C specific errors when parsing file header */
313	AF_BAD_AIFF_HEADER = 108,	/* failed to parse chunk header */
314	AF_BAD_AIFF_FORM = 109,	/* failed to parse FORM chunk */
315	AF_BAD_AIFF_SSND = 110,	/* failed to parse SSND chunk */
316	AF_BAD_AIFF_CHUNKID = 111,	/* unrecognized AIFF/AIFF-C chunk id */
317	AF_BAD_AIFF_COMM = 112,	/* failed to parse COMM chunk */
318	AF_BAD_AIFF_INST = 113,	/* failed to parse INST chunk */
319	AF_BAD_AIFF_MARK = 114,	/* failed to parse MARK chunk */
320	AF_BAD_AIFF_SKIP = 115,	/* failed to skip unsupported chunk */
321	AF_BAD_AIFF_LOOPMODE = 116	/* unrecognized loop mode (forw, etc)*/
322};
323
324/* new error codes which may be retrieved via dmGetError() */
325/* The old error tokens continue to be retrievable via the AFerrorhandler */
326/* AF_ERR_BASE is #defined in dmedia/dmedia.h */
327
328enum
329{
330	AF_ERR_NOT_IMPLEMENTED = 0+AF_ERR_BASE,	/* not implemented yet */
331	AF_ERR_BAD_FILEHANDLE = 1+AF_ERR_BASE,	/* invalid filehandle */
332	AF_ERR_BAD_READ = 5+AF_ERR_BASE,	/* unix read failed */
333	AF_ERR_BAD_WRITE = 6+AF_ERR_BASE,	/* unix write failed */
334	AF_ERR_BAD_LSEEK = 7+AF_ERR_BASE,	/* unix lseek failed */
335	AF_ERR_BAD_ACCMODE = 10+AF_ERR_BASE,	/* unrecognized audio file access mode */
336	AF_ERR_NO_WRITEACC = 11+AF_ERR_BASE,	/* file not open for writing */
337	AF_ERR_NO_READACC = 12+AF_ERR_BASE,	/* file not open for reading */
338	AF_ERR_BAD_FILEFMT = 13+AF_ERR_BASE,	/* unrecognized audio file format */
339	AF_ERR_BAD_RATE = 14+AF_ERR_BASE,	/* invalid sample rate */
340	AF_ERR_BAD_CHANNELS = 15+AF_ERR_BASE,	/* invalid # channels*/
341	AF_ERR_BAD_SAMPCNT = 16+AF_ERR_BASE,	/* invalid sample count */
342	AF_ERR_BAD_WIDTH = 17+AF_ERR_BASE,	/* invalid sample width */
343	AF_ERR_BAD_SEEKMODE = 18+AF_ERR_BASE,	/* invalid seek mode */
344	AF_ERR_BAD_LOOPID = 21+AF_ERR_BASE,	/* invalid loop id */
345	AF_ERR_BAD_SAMPFMT = 22+AF_ERR_BASE,	/* bad sample format */
346	AF_ERR_BAD_FILESETUP = 23+AF_ERR_BASE,	/* bad file setup structure*/
347	AF_ERR_BAD_TRACKID = 24+AF_ERR_BASE,	/* no track corresponding to id */
348	AF_ERR_BAD_NUMTRACKS = 25+AF_ERR_BASE,	/* wrong number of tracks for file format */
349	AF_ERR_BAD_LOOPMODE = 27+AF_ERR_BASE,	/* unrecognized loop mode symbol */
350	AF_ERR_BAD_INSTID = 28+AF_ERR_BASE,	/* invalid instrument id */
351	AF_ERR_BAD_NUMLOOPS = 29+AF_ERR_BASE,	/* bad number of loops */
352	AF_ERR_BAD_NUMMARKS = 30+AF_ERR_BASE,	/* bad number of markers */
353	AF_ERR_BAD_MARKID = 31+AF_ERR_BASE,	/* bad marker id */
354	AF_ERR_BAD_MARKPOS = 32+AF_ERR_BASE,	/* invalid marker position value */
355	AF_ERR_BAD_NUMINSTS = 33+AF_ERR_BASE,	/* invalid number of instruments */
356	AF_ERR_BAD_NOAESDATA = 34+AF_ERR_BASE,
357	AF_ERR_BAD_MISCID = 35+AF_ERR_BASE,
358	AF_ERR_BAD_NUMMISC = 36+AF_ERR_BASE,
359	AF_ERR_BAD_MISCSIZE = 37+AF_ERR_BASE,
360	AF_ERR_BAD_MISCTYPE = 38+AF_ERR_BASE,
361	AF_ERR_BAD_MISCSEEK = 39+AF_ERR_BASE,
362	AF_ERR_BAD_STRLEN = 40+AF_ERR_BASE,	/* invalid string length */
363	AF_ERR_BAD_RATECONV = 45+AF_ERR_BASE,
364	AF_ERR_BAD_SYNCFILE = 46+AF_ERR_BASE,
365	AF_ERR_BAD_CODEC_CONFIG = 47+AF_ERR_BASE,	/* improperly configured codec */
366	AF_ERR_BAD_CODEC_TYPE = 50+AF_ERR_BASE,	/* unsupported codec type */
367	AF_ERR_BAD_INSTPTYPE = 51+AF_ERR_BASE,	/* invalid instrument parameter type */
368	AF_ERR_BAD_INSTPID = 52+AF_ERR_BASE,	/* invalid instrument parameter id */
369
370	AF_ERR_BAD_BYTEORDER = 53+AF_ERR_BASE,
371	AF_ERR_BAD_FILEFMT_PARAM = 54+AF_ERR_BASE,	/* unrecognized file format parameter */
372	AF_ERR_BAD_COMP_PARAM = 55+AF_ERR_BASE,	/* unrecognized compression parameter */
373	AF_ERR_BAD_DATAOFFSET = 56+AF_ERR_BASE,	/* bad data offset */
374	AF_ERR_BAD_FRAMECNT = 57+AF_ERR_BASE,	/* bad frame count */
375
376	AF_ERR_BAD_QUERYTYPE = 58+AF_ERR_BASE,	/* bad query type */
377	AF_ERR_BAD_QUERY = 59+AF_ERR_BASE,	/* bad argument to afQuery() */
378	AF_ERR_BAD_HEADER = 62+AF_ERR_BASE,	/* failed to parse header */
379	AF_ERR_BAD_FRAME = 63+AF_ERR_BASE,	/* bad frame number */
380	AF_ERR_BAD_LOOPCOUNT = 64+AF_ERR_BASE,	/* bad loop count */
381
382	/* AIFF/AIFF-C specific errors when parsing file header */
383
384	AF_ERR_BAD_AIFF_HEADER = 66+AF_ERR_BASE,	/* failed to parse chunk header */
385	AF_ERR_BAD_AIFF_FORM = 67+AF_ERR_BASE,	/* failed to parse FORM chunk */
386	AF_ERR_BAD_AIFF_SSND = 68+AF_ERR_BASE,	/* failed to parse SSND chunk */
387	AF_ERR_BAD_AIFF_CHUNKID = 69+AF_ERR_BASE,	/* unrecognized AIFF/AIFF-C chunk id */
388	AF_ERR_BAD_AIFF_COMM = 70+AF_ERR_BASE,	/* failed to parse COMM chunk */
389	AF_ERR_BAD_AIFF_INST = 71+AF_ERR_BASE,	/* failed to parse INST chunk */
390	AF_ERR_BAD_AIFF_MARK = 72+AF_ERR_BASE,	/* failed to parse MARK chunk */
391	AF_ERR_BAD_AIFF_SKIP = 73+AF_ERR_BASE,	/* failed to skip unsupported chunk */
392	AF_ERR_BAD_AIFF_LOOPMODE = 74+AF_ERR_BASE	/* unrecognized loop mode (forw, etc) */
393};
394
395
396/* global routines */
397AFerrfunc afSetErrorHandler (AFerrfunc efunc);
398
399/* query routines */
400AUpvlist afQuery (int querytype, int arg1, int arg2, int arg3, int arg4);
401long afQueryLong (int querytype, int arg1, int arg2, int arg3, int arg4);
402double afQueryDouble (int querytype, int arg1, int arg2, int arg3, int arg4);
403void *afQueryPointer (int querytype, int arg1, int arg2, int arg3, int arg4);
404
405/* basic operations on file handles and file setups */
406AFfilesetup afNewFileSetup (void);
407void afFreeFileSetup (AFfilesetup);
408int afIdentifyFD (int);
409int afIdentifyNamedFD (int, const char *filename, int *implemented);
410
411AFfilehandle afOpenFile (const char *filename, const char *mode,
412	AFfilesetup setup);
413AFfilehandle afOpenVirtualFile (AFvirtualfile *vfile, const char *mode,
414	AFfilesetup setup);
415AFfilehandle afOpenFD (int fd, const char *mode, AFfilesetup setup);
416AFfilehandle afOpenNamedFD (int fd, const char *mode, AFfilesetup setup,
417	const char *filename);
418
419void afSaveFilePosition (AFfilehandle file);
420void afRestoreFilePosition (AFfilehandle file);
421int afSyncFile (AFfilehandle file);
422int afCloseFile (AFfilehandle file);
423
424void afInitFileFormat (AFfilesetup, int format);
425int afGetFileFormat (AFfilehandle, int *version);
426
427/* track */
428void afInitTrackIDs (AFfilesetup, int *trackids, int trackCount);
429int afGetTrackIDs (AFfilehandle, int *trackids);
430
431/* track data: reading, writng, seeking, sizing frames */
432int afReadFrames (AFfilehandle, int track, void *buffer, int frameCount);
433int afWriteFrames (AFfilehandle, int track, const void *buffer, int frameCount);
434AFframecount afSeekFrame (AFfilehandle, int track, AFframecount frameoffset);
435AFframecount afTellFrame (AFfilehandle, int track);
436AFfileoffset afGetTrackBytes (AFfilehandle, int track);
437float afGetFrameSize (AFfilehandle, int track, int expand3to4);
438float afGetVirtualFrameSize (AFfilehandle, int track, int expand3to4);
439
440/* track data: AES data */
441/* afInitAESChannelData is obsolete -- use afInitAESChannelDataTo() */
442void afInitAESChannelData (AFfilesetup, int track); /* obsolete */
443void afInitAESChannelDataTo (AFfilesetup, int track, int willBeData);
444int afGetAESChannelData (AFfilehandle, int track, unsigned char buf[24]);
445void afSetAESChannelData (AFfilehandle, int track, unsigned char buf[24]);
446
447#if 0
448/* track setup format initialized via DMparams */
449/* track format retrieved via DMparams */
450DMstatus afInitFormatParams (AFfilesetup, int track, DMparams *params);
451/* virtual format set via DMparams */
452DMstatus afGetFormatParams (AFfilehandle, int track, DMparams *params);
453/* virtual format retrieved via DMparams */
454DMstatus afSetVirtualFormatParams (AFfilehandle, int track, DMparams *params);
455DMstatus afGetVirtualFormatParams (AFfilehandle, int track, DMparams *params);
456/* conversion/compression params set via DMparams */
457DMstatus afSetConversionParams (AFfilehandle, int track, DMparams *params);
458/* conversion/compression params retrieved via DMparams */
459DMstatus afGetConversionParams (AFfilehandle, int track, DMparams *params);
460#endif
461
462/* track data: byte order */
463void afInitByteOrder (AFfilesetup, int track, int byteOrder);
464int afGetByteOrder (AFfilehandle, int track);
465int afSetVirtualByteOrder (AFfilehandle, int track, int byteOrder);
466int afGetVirtualByteOrder (AFfilehandle, int track);
467
468/* track data: number of channels */
469void afInitChannels (AFfilesetup, int track, int nchannels);
470int afGetChannels (AFfilehandle, int track);
471int afSetVirtualChannels (AFfilehandle, int track, int channelCount);
472int afGetVirtualChannels (AFfilehandle, int track);
473void afSetChannelMatrix (AFfilehandle, int track, double *matrix);
474
475/* track data: sample format and sample width */
476void afInitSampleFormat (AFfilesetup, int track, int sampleFormat,
477	int sampleWidth);
478void afGetSampleFormat (AFfilehandle file, int track, int *sampfmt,
479	int *sampwidth);
480void afGetVirtualSampleFormat (AFfilehandle file, int track, int *sampfmt,
481	int *sampwidth);
482int afSetVirtualSampleFormat (AFfilehandle, int track,
483	int sampleFormat, int sampleWidth);
484void afGetVirtualSampleFormat (AFfilehandle, int track,
485	int *sampleFormat, int *sampleWidth);
486
487/* track data: sampling rate */
488void afInitRate (AFfilesetup, int track, double rate);
489double afGetRate (AFfilehandle, int track);
490
491#if 0
492int afSetVirtualRate (AFfilehandle, int track, double rate);
493double afGetVirtualRate (AFfilehandle, int track);
494#endif
495
496/* track data: compression */
497void afInitCompression (AFfilesetup, int track, int compression);
498#if 0
499void afInitCompressionParams (AFfilesetup, int track, int compression
500	AUpvlist params, int parameterCount);
501#endif
502
503int afGetCompression (AFfilehandle, int track);
504#if 0
505void afGetCompressionParams (AFfilehandle, int track, int *compression,
506	AUpvlist params, int parameterCount);
507
508int afSetVirtualCompression (AFfilesetup, int track, int compression);
509void afSetVirtualCompressionParams (AFfilehandle, int track, int compression,
510	AUpvlist params, int parameterCount);
511
512int afGetVirtualCompression (AFfilesetup, int track, int compression);
513void afGetVirtualCompressionParams (AFfilehandle, int track, int *compression,
514	AUpvlist params, int parameterCount);
515#endif
516
517/* track data: pcm mapping */
518void afInitPCMMapping (AFfilesetup filesetup, int track,
519	double slope, double intercept, double minClip, double maxClip);
520void afGetPCMMapping (AFfilehandle file, int track,
521	double *slope, double *intercept, double *minClip, double *maxClip);
522/* NOTE: afSetTrackPCMMapping() is special--it does not set the virtual  */
523/* format; it changes what the AF thinks the track format is! Be careful. */
524int afSetTrackPCMMapping (AFfilehandle file, int track,
525	double slope, double intercept, double minClip, double maxClip);
526/* NOTE: afSetVirtualPCMMapping() is different from afSetTrackPCMMapping(): */
527/* see comment for afSetTrackPCMMapping(). */
528int afSetVirtualPCMMapping (AFfilehandle file, int track,
529	double slope, double intercept, double minClip, double maxClip);
530void afGetVirtualPCMMapping (AFfilehandle file, int track,
531	double *slope, double *intercept, double *minClip, double *maxClip);
532
533/* track data: data offset within the file */
534/* initialize for raw reading only */
535void afInitDataOffset(AFfilesetup, int track, AFfileoffset offset);
536AFfileoffset afGetDataOffset (AFfilehandle, int track);
537
538/* track data: count of frames in file */
539void afInitFrameCount (AFfilesetup, int track, AFframecount frameCount);
540AFframecount afGetFrameCount (AFfilehandle file, int track);
541
542/* loop operations */
543void afInitLoopIDs (AFfilesetup, int instid, int ids[], int nids);
544int afGetLoopIDs (AFfilehandle, int instid, int loopids[]);
545void afSetLoopMode (AFfilehandle, int instid, int loop, int mode);
546int afGetLoopMode (AFfilehandle, int instid, int loopid);
547int afSetLoopCount (AFfilehandle, int instid, int loop, int count);
548int afGetLoopCount (AFfilehandle, int instid, int loopid);
549void afSetLoopStart (AFfilehandle, int instid, int loopid, int markerid);
550int afGetLoopStart (AFfilehandle, int instid, int loopid);
551void afSetLoopEnd (AFfilehandle, int instid, int loopid, int markerid);
552int afGetLoopEnd (AFfilehandle, int instid, int loopid);
553
554int afSetLoopStartFrame (AFfilehandle, int instid, int loop,
555	AFframecount startFrame);
556AFframecount afGetLoopStartFrame (AFfilehandle, int instid, int loop);
557int afSetLoopEndFrame (AFfilehandle, int instid, int loop,
558	AFframecount startFrame);
559AFframecount afGetLoopEndFrame (AFfilehandle, int instid, int loop);
560
561void afSetLoopTrack (AFfilehandle, int instid, int loopid, int trackid);
562int afGetLoopTrack (AFfilehandle, int instid, int loopid);
563
564/* marker operations */
565void afInitMarkIDs (AFfilesetup, int trackid, int *ids, int nids);
566int afGetMarkIDs (AFfilehandle file, int trackid, int markids[]);
567void afSetMarkPosition (AFfilehandle file, int trackid, int markid,
568	AFframecount markpos);
569AFframecount afGetMarkPosition (AFfilehandle file, int trackid, int markid);
570void afInitMarkName (AFfilesetup, int trackid, int marker, const char *name);
571void afInitMarkComment (AFfilesetup, int trackid, int marker,
572	const char *comment);
573char *afGetMarkName (AFfilehandle file, int trackid, int markid);
574char *afGetMarkComment (AFfilehandle file, int trackid, int markid);
575
576/* instrument operations */
577void afInitInstIDs (AFfilesetup, int *ids, int nids);
578int afGetInstIDs (AFfilehandle file, int *instids);
579void afGetInstParams (AFfilehandle file, int instid, AUpvlist pvlist,
580	int nparams);
581void afSetInstParams (AFfilehandle file, int instid, AUpvlist pvlist,
582	int nparams);
583long afGetInstParamLong (AFfilehandle file, int instid, int param);
584void afSetInstParamLong (AFfilehandle file, int instid, int param, long value);
585
586/* miscellaneous data operations */
587void afInitMiscIDs (AFfilesetup, int *ids, int nids);
588int afGetMiscIDs (AFfilehandle, int *ids);
589void afInitMiscType (AFfilesetup, int miscellaneousid, int type);
590int afGetMiscType (AFfilehandle, int miscellaneousid);
591void afInitMiscSize (AFfilesetup, int miscellaneousid, int size);
592int afGetMiscSize (AFfilehandle, int miscellaneousid);
593int afWriteMisc (AFfilehandle, int miscellaneousid, void *buf, int bytes);
594int afReadMisc (AFfilehandle, int miscellaneousid, void *buf, int bytes);
595int afSeekMisc (AFfilehandle, int miscellaneousid, int offset);
596
597#ifdef __cplusplus
598}
599#endif /* __cplusplus */
600
601#endif /* AUDIOFILE_H */
602