1/*
2 * Copyright (C) 1997-2005 Kare Sjolander <kare@speech.kth.se>
3 *
4 * This file is part of the Snack Sound Toolkit.
5 * The latest version can be found at http://www.speech.kth.se/snack/
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 2 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22#ifndef _SNACK_SOUND
23#define _SNACK_SOUND
24
25#ifdef __cplusplus
26extern "C" {
27#endif
28
29#ifdef _MSC_VER
30  /* Defines for VC++, not used for unix or mingw */
31  typedef __int32 int32_t;
32  typedef unsigned __int32 uint32_t;
33#else
34#  ifdef HAVE_STDINT_H
35#    include <stdint.h>
36#  else
37#    include <sys/types.h>
38#  endif
39#endif
40
41#if defined(MAC) || defined(MAC_OSX_TCL)
42#  include <string.h>
43#endif
44#if defined(MAC)
45extern int strcasecmp (const char *str1, const char *str2);
46extern int strncasecmp(const char *str1, const char *str2, size_t nchars);
47#  define EXPORT(a,b) a b
48#elif  defined(_MSC_VER)
49#  include "windows.h"
50#  include "mmsystem.h"
51#  define strncasecmp strnicmp
52#  define strcasecmp  stricmp
53#  define EXPORT(a,b) __declspec(dllexport) a b
54#else
55#  define EXPORT(a,b) a b
56#endif
57
58typedef void (updateProc)(ClientData clientData, int flag);
59
60typedef struct jkCallback {
61  updateProc *proc;
62  ClientData clientData;
63  struct jkCallback *next;
64  int id;
65} jkCallback;
66
67typedef enum {
68  SNACK_NATIVE,
69  SNACK_BIGENDIAN,
70  SNACK_LITTLEENDIAN
71} SnackEndianness;
72
73typedef struct SnackLinkedFileInfo {
74  Tcl_Channel linkCh;
75  float *buffer;
76  int filePos;
77  int validSamples;
78  int eof;
79  struct Sound *sound;
80} SnackLinkedFileInfo;
81
82typedef struct Sound {
83  int    samprate;
84  int    encoding;
85  int    sampsize;
86  int    nchannels;
87  int    length;
88  int    maxlength;
89  float  maxsamp;
90  float  minsamp;
91  float  abmax;
92  float  **blocks;
93  int    maxblks;
94  int    nblks;
95  int    exact;
96  int    precision;
97  int    writeStatus;
98  int    readStatus;
99  short  *tmpbuf;
100  int    swap;
101  int    storeType;
102  int    headSize;
103  int    skipBytes;
104  int    buffersize;
105  Tcl_Interp     *interp;
106  Tcl_Obj        *cmdPtr;
107  char           *fcname;
108  struct jkCallback *firstCB;
109  char *fileType;
110  int blockingPlay;
111  int debug;
112  int destroy;
113  int guessEncoding;
114  Tcl_Channel rwchan;
115  int inByteOrder;
116  int firstNRead;
117  int guessRate;
118  int forceFormat;
119  int itemRefCnt;
120  int validStart;
121  SnackLinkedFileInfo linkInfo;
122  char *devStr;
123  Tcl_HashTable *soundTable;
124  char *filterName;
125  char *extHead;
126  char *extHead2;
127  int extHeadType;
128  int extHead2Type;
129  int loadOffset;
130  Tcl_Obj *changeCmdPtr;
131  unsigned int userFlag; /* User flags, for new file formats, etc */
132  char *userData;        /* User data pointer */
133
134} Sound;
135
136#define IDLE    0
137#define READ    1
138#define WRITE   2
139#define PAUSED  3
140
141#ifndef _MSC_VER
142#define min(a,b) ((a)<(b)?(a):(b))
143#define max(a,b) ((a)>(b)?(a):(b))
144#endif
145
146#define SNACK_NEW_SOUND	 1
147#define SNACK_MORE_SOUND 2
148#define SNACK_DESTROY_SOUND 3
149
150#define SNACK_SINGLE_PREC 1
151#define SNACK_DOUBLE_PREC 2
152
153extern int Snack_SoundCmd(ClientData cdata, Tcl_Interp *interp,
154			  int objc, Tcl_Obj *CONST objv[]);
155
156extern void Snack_SoundDeleteCmd(ClientData cdata);
157
158extern int Snack_AudioCmd(ClientData cdata, Tcl_Interp *interp,
159			  int objc, Tcl_Obj *CONST objv[]);
160
161extern void Snack_AudioDeleteCmd(ClientData cdata);
162
163extern int Snack_MixerCmd(ClientData cdata, Tcl_Interp *interp, int objc,
164			  Tcl_Obj *CONST objv[]);
165
166extern void Snack_MixerDeleteCmd(ClientData clientData);
167
168#define MAXNBLKS 200
169#define FEXP 17
170#define CEXP (FEXP+2)
171#define DEXP (FEXP-1)
172#define FBLKSIZE (1<<FEXP)
173#define DBLKSIZE (1<<DEXP)
174#define CBLKSIZE (1<<CEXP)
175
176#define FSAMPLE(s, i) (s)->blocks[(i)>>FEXP][((i)&(FBLKSIZE-1))]
177#define DSAMPLE(s, i) ((double **)(s)->blocks)[(i)>>DEXP][((i)&(DBLKSIZE-1))]
178
179#define Snack_SetSample(s, c, i, val) \
180                 if ((s)->precision == SNACK_DOUBLE_PREC) { \
181                   DSAMPLE((s),(i)*(s)->nchannels+(c)) = (double) (val); \
182       	         } else { \
183		   FSAMPLE((s),(i)*(s)->nchannels+(c)) = (float) (val); \
184	         }
185
186#define Snack_GetSample(s, c, i) ( \
187 ((s)->precision == SNACK_DOUBLE_PREC) ? \
188     DSAMPLE((s), (i)*(s)->nchannels+(c)): \
189     FSAMPLE(s, (i)*(s)->nchannels+(c)))
190
191#define Snack_SetLength(s, len)        (s)->length = (len)
192#define Snack_GetLength(s)             (s)->length
193#define Snack_SetSampleRate(s, rate)   (s)->samprate = (rate)
194#define Snack_GetSampleRate(s)         (s)->samprate
195#define Snack_SetFrequency(s, rate)    (s)->samprate = (rate)
196#define Snack_GetFrequency(s)          (s)->samprate
197#define Snack_SetSampleEncoding(s, en) (s)->encoding = (en)
198#define Snack_GetSampleEncoding(s)     (s)->encoding
199#define Snack_SetSampleFormat(s, en)   (s)->encoding = (en)
200#define Snack_GetSampleFormat(s)       (s)->encoding
201#define Snack_SetNumChannels(s, nchan) (s)->nchannels = (nchan)
202#define Snack_GetNumChannels(s)        (s)->nchannels
203#define Snack_GetBytesPerSample(s)     (s)->sampsize
204#define Snack_SetBytesPerSample(s, n)  (s)->sampsize = (n)
205#define Snack_GetDebugFlag(s)          (s)->debug
206#define Snack_SetHeaderSize(s, size)   (s)->headSize = (size)
207#define Snack_GetSoundFilename(s)      (s)->fcname
208#define Snack_GetSoundWriteStatus(s)   (s)->writeStatus
209#define Snack_GetSoundReadStatus(s)    (s)->readStatus
210#define Snack_GetSoundPrecision(s)     (s)->precision
211
212#define SOUND_IN_MEMORY 0
213#define SOUND_IN_CHANNEL  1
214#define SOUND_IN_FILE     2
215/* NFIRSTSAMPLES*/
216#define CHANNEL_HEADER_BUFFER 20000
217
218typedef int (soundCmd)(Sound *s, Tcl_Interp *interp, int objc,
219		     Tcl_Obj *CONST objv[]);
220typedef int (audioCmd)(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
221typedef int (mixerCmd)(Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]);
222typedef void *Snack_CmdProc;
223typedef void (soundDelCmd)(Sound *s);
224typedef void (audioDelCmd)();
225typedef void (mixerDelCmd)();
226typedef void *Snack_DelCmdProc;
227
228#define SNACK_SOUND_CMD	1
229#define SNACK_AUDIO_CMD	2
230#define SNACK_MIXER_CMD	3
231
232#define HEADBUF 4096
233
234extern char *LoadSound(Sound *s, Tcl_Interp *interp, Tcl_Obj *obj,
235		       int startpos, int endpos);
236
237extern int GetChannels(Tcl_Interp *interp, Tcl_Obj *obj, int *nchannels);
238
239extern int GetEncoding(Tcl_Interp *interp, Tcl_Obj *obj,
240		       int *encoding, int *sampsize);
241
242extern float Snack_SwapFloat(float f);
243
244extern double Snack_SwapDouble(double d);
245
246extern void ByteSwapSound(Sound *s);
247
248extern void SwapIfBE(Sound *s);
249
250extern void SwapIfLE(Sound *s);
251
252extern int GetHeader(Sound *s, Tcl_Interp *interp, Tcl_Obj *obj);
253
254extern int PutHeader(Sound *s, Tcl_Interp *interp, int objc,
255		     Tcl_Obj *CONST objv[], int length);
256
257extern int WriteLELong(Tcl_Channel ch, int32_t l);
258
259extern int WriteBELong(Tcl_Channel ch, int32_t l);
260
261extern int SetFcname(Sound *s, Tcl_Interp *interp, Tcl_Obj *obj);
262
263extern char *NameGuessFileType(char *s);
264
265extern void SnackDefineFileFormats(Tcl_Interp *interp);
266
267extern int GetFileFormat(Tcl_Interp *interp, Tcl_Obj *obj, char **filetype);
268
269extern void SnackCopySamples(Sound *dest, int to, Sound *src, int from,
270			     int len);
271
272typedef char *(guessFileTypeProc)(char *buf, int len);
273
274typedef int  (getHeaderProc)(Sound *s, Tcl_Interp *interp, Tcl_Channel ch,
275			     Tcl_Obj *obj, char *buf);
276
277typedef char *(extensionFileTypeProc)(char *buf);
278
279typedef int  (putHeaderProc)(Sound *s, Tcl_Interp *interp, Tcl_Channel ch,
280			     Tcl_Obj *obj, int objc,
281			     Tcl_Obj *CONST objv[], int length);
282
283typedef int  (openProc)(Sound *s, Tcl_Interp *interp,Tcl_Channel *ch,
284			char *mode);
285
286typedef int  (closeProc)(Sound *s, Tcl_Interp *interp, Tcl_Channel *ch);
287
288typedef int  (readSamplesProc)(Sound *s, Tcl_Interp *interp, Tcl_Channel ch,
289			       char *inBuffer, float *outBuffer, int length);
290
291typedef int  (writeSamplesProc)(Sound *s, Tcl_Channel ch, Tcl_Obj *obj,
292				int start, int length);
293
294typedef int  (seekProc)(Sound *s, Tcl_Interp *interp, Tcl_Channel ch,
295			int position);
296
297typedef void (freeHeaderProc)(Sound *s);
298
299typedef int  (configureProc)(Sound *s, Tcl_Interp *interp, int objc,
300			     Tcl_Obj *CONST objv[]);
301
302/* Deprecated: SnackFileFormat */
303
304typedef struct SnackFileFormat {
305  char *formatName;
306  guessFileTypeProc      *guessProc;
307  getHeaderProc          *getHeaderProc;
308  extensionFileTypeProc  *extProc;
309  putHeaderProc          *putHeaderProc;
310  openProc               *openProc;
311  closeProc              *closeProc;
312  readSamplesProc        *readProc;
313  writeSamplesProc       *writeProc;
314  seekProc               *seekProc;
315  freeHeaderProc         *freeHeaderProc;
316  struct SnackFileFormat *nextPtr;
317} SnackFileFormat;
318
319typedef struct Snack_FileFormat {
320  char                    *name;
321  guessFileTypeProc       *guessProc;
322  getHeaderProc           *getHeaderProc;
323  extensionFileTypeProc   *extProc;
324  putHeaderProc           *putHeaderProc;
325  openProc                *openProc;
326  closeProc               *closeProc;
327  readSamplesProc         *readProc;
328  writeSamplesProc        *writeProc;
329  seekProc                *seekProc;
330  freeHeaderProc          *freeHeaderProc;
331  configureProc           *configureProc;
332  struct Snack_FileFormat *nextPtr;
333} Snack_FileFormat;
334
335extern int GuessEncoding(Sound *s, unsigned char *buf, int len);
336
337extern char *GuessFileType(char *buf, int len, int eof);
338
339extern int lengthCmd(Sound *s, Tcl_Interp *interp, int objc,
340		     Tcl_Obj *CONST objv[]);
341extern int insertCmd(Sound *s, Tcl_Interp *interp, int objc,
342		     Tcl_Obj *CONST objv[]);
343extern int cropCmd(Sound *s, Tcl_Interp *interp, int objc,
344		   Tcl_Obj *CONST objv[]);
345extern int copyCmd(Sound *s, Tcl_Interp *interp, int objc,
346		   Tcl_Obj *CONST objv[]);
347extern int appendCmd(Sound *s, Tcl_Interp *interp, int objc,
348		     Tcl_Obj *CONST objv[]);
349extern int concatenateCmd(Sound *s, Tcl_Interp *interp, int objc,
350			  Tcl_Obj *CONST objv[]);
351extern int cutCmd(Sound *s, Tcl_Interp *interp, int objc,
352		  Tcl_Obj *CONST objv[]);
353extern int convertCmd(Sound *s, Tcl_Interp *interp, int objc,
354		      Tcl_Obj *CONST objv[]);
355extern int dBPowerSpectrumCmd(Sound *s, Tcl_Interp *interp, int objc,
356			      Tcl_Obj *CONST objv[]);
357extern int powerSpectrumCmd(Sound *s, Tcl_Interp *interp, int objc,
358			    Tcl_Obj *CONST objv[]);
359extern int speaturesCmd(Sound *s, Tcl_Interp *interp, int objc,
360			Tcl_Obj *CONST objv[]);
361extern int alCmd(Sound *s, Tcl_Interp *interp, int objc,
362		 Tcl_Obj *CONST objv[]);
363extern int vpCmd(Sound *s, Tcl_Interp *interp, int objc,
364		 Tcl_Obj *CONST objv[]);
365extern int joinCmd(Sound *s, Tcl_Interp *interp, int objc,
366		   Tcl_Obj *CONST objv[]);
367extern int fitCmd(Sound *s, Tcl_Interp *interp, int objc,
368		  Tcl_Obj *CONST objv[]);
369extern int inaCmd(Sound *s, Tcl_Interp *interp, int objc,
370		  Tcl_Obj *CONST objv[]);
371extern int lastIndexCmd(Sound *s, Tcl_Interp *interp, int objc,
372			Tcl_Obj *CONST objv[]);
373extern int stretchCmd(Sound *s, Tcl_Interp *interp, int objc,
374		      Tcl_Obj *CONST objv[]);
375extern int ocCmd(Sound *s, Tcl_Interp *interp, int objc,
376		 Tcl_Obj *CONST objv[]);
377extern int arCmd(Sound *s, Tcl_Interp *interp, int objc,
378		 Tcl_Obj *CONST objv[]);
379extern int mixCmd(Sound *s, Tcl_Interp *interp, int objc,
380		  Tcl_Obj *CONST objv[]);
381extern int sampleCmd(Sound *s, Tcl_Interp *interp, int objc,
382		     Tcl_Obj *CONST objv[]);
383extern int flipBitsCmd(Sound *s, Tcl_Interp *interp, int objc,
384		       Tcl_Obj *CONST objv[]);
385extern int byteswapCmd(Sound *s, Tcl_Interp *interp, int objc,
386		       Tcl_Obj *CONST objv[]);
387extern int readCmd(Sound *s, Tcl_Interp *interp, int objc,
388		   Tcl_Obj *CONST objv[]);
389extern int writeCmd(Sound *s, Tcl_Interp *interp, int objc,
390		    Tcl_Obj *CONST objv[]);
391extern int dataCmd(Sound *s, Tcl_Interp *interp, int objc,
392		   Tcl_Obj *CONST objv[]);
393extern int playCmd(Sound *s, Tcl_Interp *interp, int objc,
394		   Tcl_Obj *CONST objv[]);
395extern int recordCmd(Sound *s, Tcl_Interp *interp, int objc,
396		     Tcl_Obj *CONST objv[]);
397extern int pauseCmd(Sound *s, Tcl_Interp *interp, int objc,
398		    Tcl_Obj *CONST objv[]);
399extern int stopCmd(Sound *s, Tcl_Interp *interp, int objc,
400		   Tcl_Obj *CONST objv[]);
401extern int current_positionCmd(Sound *s, Tcl_Interp *interp, int objc,
402			       Tcl_Obj *CONST objv[]);
403extern int swapCmd(Sound *s, Tcl_Interp *interp, int objc,
404		   Tcl_Obj *CONST objv[]);
405
406#define QUE_STRING "QUE"
407#define RAW_STRING "RAW"
408#define WAV_STRING "WAV"
409#define AIFF_STRING "AIFF"
410#define SMP_STRING "SMP"
411#define AU_STRING "AU"
412#define SD_STRING "SD"
413#define MP3_STRING "MP3"
414#define CSL_STRING "CSL"
415
416extern char *GuessMP3File(char *buf, int len);
417
418extern int GetMP3Header(Sound *s, Tcl_Interp *interp, Tcl_Channel ch,
419			Tcl_Obj *obj, char *buf);
420
421extern int ReadMP3Samples(Sound *s, Tcl_Interp *interp, Tcl_Channel ch,
422			  char *ibuf, float *obuf, int len);
423
424extern int SeekMP3File(Sound *s, Tcl_Interp *interp, Tcl_Channel ch, int pos);
425
426extern char *ExtMP3File(char *s);
427
428extern int OpenMP3File(Sound *s, Tcl_Interp *interp, Tcl_Channel *ch,
429		       char *mode);
430
431extern int CloseMP3File(Sound *s, Tcl_Interp *interp, Tcl_Channel *ch);
432
433extern void FreeMP3Header(Sound *s);
434
435extern int ConfigMP3Header(Sound *s, Tcl_Interp *interp, int objc,
436			   Tcl_Obj *CONST objv[]);
437
438typedef enum {
439  SNACK_WIN_HAMMING,
440  SNACK_WIN_HANNING,
441  SNACK_WIN_BARTLETT,
442  SNACK_WIN_BLACKMAN,
443  SNACK_WIN_RECT
444} SnackWindowType;
445
446extern int GetWindowType(Tcl_Interp *interp, char *str, SnackWindowType *type);
447
448extern int GetChannel(Tcl_Interp *interp, char *str, int nchannels,
449		      int *channel);
450
451extern float LpcAnalysis(float *data, int N, float *f, int order);
452
453extern void PreEmphase(float *sig, float presample, int len, float preemph);
454
455extern double SnackCurrentTime();
456
457extern CONST84 char *Snack_InitStubs (Tcl_Interp *interp, char *version,
458				      int exact);
459
460extern int pitchCmd(Sound *s, Tcl_Interp *interp, int objc,
461		    Tcl_Obj *CONST objv[]);
462
463extern int powerCmd(Sound *s, Tcl_Interp *interp, int objc,
464		    Tcl_Obj *CONST objv[]);
465
466extern int reverseCmd(Sound *s, Tcl_Interp *interp, int objc,
467		      Tcl_Obj *CONST objv[]);
468
469extern int formantCmd(Sound *s, Tcl_Interp *interp, int objc,
470		      Tcl_Obj *CONST objv[]);
471
472#define ITEMBUFFERSIZE 100000
473
474extern float GetSample(SnackLinkedFileInfo *infoPtr, int index);
475
476extern int OpenLinkedFile(Sound *s, SnackLinkedFileInfo *infoPtr);
477
478extern void CloseLinkedFile(SnackLinkedFileInfo *infoPtr);
479
480extern void Snack_ExitProc(ClientData clientData);
481
482typedef enum {
483  SNACK_QS_QUEUED = 0,
484  SNACK_QS_PAUSED,
485  SNACK_QS_DRAIN,
486  SNACK_QS_DONE
487} queuedSoundStatus;
488
489typedef struct jkQueuedSound {
490  Sound *sound;
491  int startPos;
492  int endPos;
493  long nWritten;
494  long startTime;
495  Tcl_Obj *cmdPtr;
496  queuedSoundStatus status;
497  int duration;
498  char *name;
499  char *filterName;
500  int id;
501  struct jkQueuedSound *next;
502  struct jkQueuedSound *prev;
503} jkQueuedSound;
504
505extern int shapeCmd(Sound *s, Tcl_Interp *interp, int objc,
506		    Tcl_Obj *CONST objv[]);
507
508extern int dataSamplesCmd(Sound *s, Tcl_Interp *interp, int objc,
509			  Tcl_Obj *CONST objv[]);
510
511extern int strcasecmp(const char *s1, const char *s2);
512extern int strncasecmp(const char *s1, const char *s2, size_t n);
513
514extern int Snack_FilterCmd(ClientData cdata, Tcl_Interp *interp, int objc,
515			   Tcl_Obj *CONST objv[]);
516
517extern void Snack_FilterDeleteCmd(ClientData clientData);
518
519typedef struct SnackFilter     *Snack_Filter;
520typedef struct SnackStreamInfo *Snack_StreamInfo;
521
522typedef Snack_Filter (createProc)(Tcl_Interp *interp, int objc,
523				    Tcl_Obj *CONST objv[]);
524
525typedef int (configProc)(Snack_Filter f, Tcl_Interp *interp, int objc,
526			 Tcl_Obj *CONST objv[]);
527
528typedef int (startProc)(Snack_Filter f, Snack_StreamInfo si);
529
530typedef int (flowProc)(Snack_Filter f, Snack_StreamInfo si,
531		       float *inBuffer, float *outBuffer,
532		       int *inFrames, int *outFrames);
533
534typedef void (freeProc)(Snack_Filter f);
535
536typedef struct SnackStreamInfo {
537  Sound *is1;
538  Sound *is2;
539  Sound *os1;
540  Sound *os2;
541  int streamWidth;
542  int outWidth;
543  int rate;
544} SnackStreamInfo;
545
546typedef struct SnackFilter {
547  configProc *configProc;
548  startProc  *startProc;
549  flowProc   *flowProc;
550  freeProc   *freeProc;
551  Tcl_Interp *interp;
552  Snack_Filter prev;
553  Snack_Filter next;
554  Snack_StreamInfo si;
555  double dataRatio;
556  int reserved[4];
557} SnackFilter;
558
559typedef struct Snack_FilterType {
560  char               *name;
561  createProc         *createProc;
562  configProc         *configProc;
563  startProc          *startProc;
564  flowProc           *flowProc;
565  freeProc           *freeProc;
566  struct Snack_FilterType *nextPtr;
567} Snack_FilterType;
568
569void SnackCreateFilterTypes(Tcl_Interp *interp);
570
571extern int Snack_HSetCmd(ClientData cdata, Tcl_Interp *interp, int objc,
572			   Tcl_Obj *CONST objv[]);
573
574extern void Snack_HSetDeleteCmd(ClientData clientData);
575
576extern int Snack_arCmd(ClientData cdata, Tcl_Interp *interp, int objc,
577			   Tcl_Obj *CONST objv[]);
578
579extern void Snack_arDeleteCmd(ClientData clientData);
580
581extern int isynCmd(ClientData cdata, Tcl_Interp *interp, int objc,
582		   Tcl_Obj *CONST objv[]);
583
584extern int osynCmd(ClientData cdata, Tcl_Interp *interp, int objc,
585		   Tcl_Obj *CONST objv[]);
586
587extern int WriteSound(writeSamplesProc *writeProc, Sound *s,
588		      Tcl_Interp *interp, Tcl_Channel ch, Tcl_Obj *obj,
589		      int startpos, int len);
590
591extern void Snack_RemoveOptions(int objc, Tcl_Obj *CONST objv[],
592				CONST84 char **subOptionStrings, int *newobjc,
593				Tcl_Obj **newobjv);
594
595#ifndef MAC
596#  define PBSIZE 100000
597#  define NMAX 65536
598#else
599#  define PBSIZE 64000
600#  define NMAX 8192
601#endif
602#define NMIN 8
603
604extern void SnackPauseAudio();
605
606#if TCL_MAJOR_VERSION == 8 && TCL_MINOR_VERSION < 4
607#define TCL_SEEK Tcl_Seek
608#define TCL_TELL Tcl_Tell
609#else
610#define TCL_SEEK Tcl_SeekOld
611#define TCL_TELL Tcl_TellOld
612#endif
613
614#define SNACK_DB 4.34294481903251830000000 /*  = 10 / ln(10)  */
615#define SNACK_INTLOGARGMIN 1.0
616#define SNACK_CORRN (float) 138.308998699
617#define SNACK_CORR0 (float) 132.288396199
618
619/*
620 * Include the public function declarations that are accessible via
621 * the stubs table.
622 */
623
624#include "snackDecls.h"
625  /*
626extern void Snack_StopSound(Sound *s, Tcl_Interp *interp);
627extern Sound *Snack_GetSound(Tcl_Interp *interp, char *name);
628extern int Snack_AddCallback(Sound *s, updateProc *proc, ClientData cd);
629extern void Snack_WriteLog(char *str);
630extern void Snack_WriteLogInt(char *str, int num);
631extern void Snack_RemoveCallback(Sound *s, int id);
632extern int Snack_ResizeSoundStorage(Sound *s, int len);
633extern void Snack_UpdateExtremes(Sound *s, int start, int end, int flag);
634extern int SnackOpenFile(openProc *openProc, Sound *s, Tcl_Interp *interp,
635			 Tcl_Channel *ch, char *mode);
636extern int SnackCloseFile(closeProc *closeProc, Sound *s, Tcl_Interp *interp,
637			  Tcl_Channel *ch);
638extern void Snack_ExecCallbacks(Sound *s, int flag);
639extern short Snack_SwapShort(short s);
640extern int32_t Snack_SwapLong(int32_t l);
641extern int Snack_ProgressCallback(Tcl_Obj *cmdPtr, Tcl_Interp *interp,
642				  char *type, double fraction);
643extern void Snack_DeleteSound(Sound *s);
644extern Sound *Snack_NewSound(int rate, int encoding, int nchannels);
645extern short Snack_Mulaw2Lin(unsigned char u_val);
646extern unsigned char Snack_Lin2Mulaw(short pcm_val);
647extern short Snack_Alaw2Lin(unsigned char a_val);
648extern unsigned char Snack_Lin2Alaw(short pcm_val);
649extern void Snack_PutSoundData(Sound *s, int pos, void *buf, int nSamples);
650extern void Snack_GetSoundData(Sound *s, int pos, void *buf, int nSamples);
651extern void Snack_InitWindow(float *win, int winlen, int fftlen, int type);
652extern int  Snack_InitFFT(int n);
653extern void Snack_DBPowerSpectrum(float *x);
654extern void Snack_PowerSpectrum(float *x);
655extern void Snack_CreateFilterType(Snack_FilterType *typePtr);
656extern int SaveSound(Sound *s, Tcl_Interp *interp, char *filename,
657		     Tcl_Obj *obj, int objc, Tcl_Obj *CONST objv[],
658		     int startpos, int len, char *type);
659  */
660#ifdef __cplusplus
661}
662#endif
663
664#endif /* _SNACK_SOUND */
665