annotate src/miscplay.c @ 2227:8e7b4a0c1a81

[xemacs-hg @ 2004-08-21 17:05:49 by michaels] 2004-08-15 Jan Rychter <jwr@xemacs.org> * window-xemacs.el (really-set-window-configuration): deal gracefully with the case when the buffer previously saved in the configuration (and that we want to switch to) has been killed. Switch to the next buffer on the buffer-list in that case.
author michaels
date Sat, 21 Aug 2004 17:05:51 +0000
parents 943eaba38521
children 04bc9d2f42c7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 /* miscplay.c - general routines related to playing sounds
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2 **
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ** Copyright (C) 1995,96 by Markus Gutschke (gutschk@math.uni-muenster.de)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
4 ** This was sawed out from version 1.3 of linuxplay.c by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ** Robert Bihlmeyer <robbe@orcus.priv.at>.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 **
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ** Parts of this code were inspired by sunplay.c, which is copyright 1989 by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ** Jef Poskanzer and 1991,92 by Jamie Zawinski; c.f. sunplay.c for further
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ** information.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 **
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11 ** Permission to use, copy, modify, and distribute this software and its
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ** documentation for any purpose and without fee is hereby granted, provided
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13 ** that the above copyright notice appear in all copies and that both that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
14 ** copyright notice and this permission notice appear in supporting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
15 ** documentation. This software is provided "as is" without express or
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
16 ** implied warranty.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
17 */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
19 /* Synched up with: Not in FSF. */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
20
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
21 /* This file Mule-ized by Ben Wing, 5-15-01. */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
22
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 #include <config.h>
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
24 #include "lisp.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 #include "miscplay.h"
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
27 #include "sound.h"
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
28
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 #include "syssignal.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 #include "sysfile.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 #ifdef __GNUC__
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 #define UNUSED(x) ((void)(x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 #else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 #define UNUSED(x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 /* Maintain global variable for keeping parser state information; this struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 is set to zero before the first invocation of the parser. The use of a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 global variable prevents multiple concurrent executions of this code, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 this does not happen anyways... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 enum wvState
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 { wvMain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 wvSubchunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 wvOutOfBlock,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 wvSkipChunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 wvSoundChunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 wvFatal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 wvFatalNotify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 static union {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 int align;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 enum wvState state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 size_t left;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
57 UChar_Binary leftover[HEADERSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 signed long chunklength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 } wave;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 int align;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 int isdata;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 int skipping;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 size_t left;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
65 UChar_Binary leftover[HEADERSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66 } audio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 } parsestate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 /* Use a global buffer as scratch-pad for possible conversions of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 sampling format */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
71 UChar_Binary miscplay_sndbuf[SNDBUFSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 /* Initialize global parser state information to zero */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 void reset_parsestate()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 memset(&parsestate,0,sizeof(parsestate));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 /* Verify that we could fully parse the entire soundfile; this is needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 only for files in WAVE format */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 int parse_wave_complete()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 if (parsestate.wave.state != wvOutOfBlock &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 parsestate.wave.state != wvFatal) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
85 sound_warn("Unexpected end of WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 } else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 /* There is no special treatment required for parsing raw data files; we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 assume that these files contain data in 8bit unsigned format that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 has been sampled at 8kHz; there is no extra header */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 static size_t parseraw(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 int rc = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 /* Currently we cannot cope with files in VOC format; if you really need
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 to play these files, they should be converted by using SOX */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 static size_t parsevoc(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 UNUSED(data);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 UNUSED(sz);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 UNUSED(outbuf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 /* We need to perform some look-ahead in order to parse files in WAVE format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 this might require re-partioning of the data segments if headers cross the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 boundaries between two read operations. This is done in a two-step way:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 first we request a certain amount of bytes... */
570
db376c5066a7 [xemacs-hg @ 2001-05-25 02:45:57 by martinb]
martinb
parents: 564
diff changeset
117 static int waverequire(void **data,size_t *sz,size_t rq)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 int rc = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 if (rq > HEADERSZ) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
122 sound_warn("Header size exceeded while parsing WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 parsestate.wave.state = wvFatal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 if ((rq -= parsestate.wave.left) <= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 if (rq > *sz) {rq = *sz; rc = 0;}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 memcpy(parsestate.wave.leftover+parsestate.wave.left,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 *data,rq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 parsestate.wave.left += rq;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
132 (*(UChar_Binary **)data) += rq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 *sz -= rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 /* ...and next we remove this many bytes from the buffer */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
138 static inline void waveremove(size_t rq)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 if (parsestate.wave.left <= rq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 parsestate.wave.left = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 parsestate.wave.left -= rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 memmove(parsestate.wave.leftover,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 parsestate.wave.leftover+rq,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 parsestate.wave.left); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 /* Sound files in WAVE format can contain an arbitrary amount of tagged
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 chunks; this requires quite some effort for parsing the data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 static size_t parsewave(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 switch (parsestate.wave.state) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 case wvMain:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 if (!waverequire(data,sz,20))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 parsestate.wave.chunklength = parsestate.wave.leftover[16] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 256*(parsestate.wave.leftover[17] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 256*(parsestate.wave.leftover[18] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 256*parsestate.wave.leftover[19]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 waveremove(20);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 parsestate.wave.state = wvSubchunk;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 case wvSubchunk:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 if (!waverequire(data,sz,parsestate.wave.chunklength))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 parsestate.wave.align = parsestate.wave.chunklength < 14 ? 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 : parsestate.wave.leftover[12];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 if (parsestate.wave.align != 1 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 parsestate.wave.align != 2 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 parsestate.wave.align != 4) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
175 sound_warn("Illegal datawidth detected while parsing WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 parsestate.wave.state = wvFatal; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 parsestate.wave.state = wvOutOfBlock;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 waveremove(parsestate.wave.chunklength);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 case wvOutOfBlock:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 if (!waverequire(data,sz,8))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 parsestate.wave.chunklength = parsestate.wave.leftover[4] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 256*(parsestate.wave.leftover[5] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 256*(parsestate.wave.leftover[6] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 256*(parsestate.wave.leftover[7] & 0x7F)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 if (memcmp(parsestate.wave.leftover,"data",4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 parsestate.wave.state = wvSkipChunk;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 parsestate.wave.state = wvSoundChunk;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 waveremove(8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 case wvSkipChunk:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 if (parsestate.wave.chunklength > 0 && *sz > 0 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (signed long)*sz < (signed long)parsestate.wave.chunklength) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 parsestate.wave.chunklength -= *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 *sz = 0; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 if (parsestate.wave.chunklength > 0 && *sz > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 *sz -= parsestate.wave.chunklength;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
203 (*(UChar_Binary **)data) += parsestate.wave.chunklength; }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 parsestate.wave.state = wvOutOfBlock; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 case wvSoundChunk: {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 size_t count,rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 if (parsestate.wave.left) { /* handle leftover bytes from last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 alignment operation */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 count = parsestate.wave.left;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 rq = HEADERSZ-count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 if (rq > (size_t) parsestate.wave.chunklength)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 rq = parsestate.wave.chunklength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 if (!waverequire(data,sz,rq)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 parsestate.wave.chunklength -= parsestate.wave.left - count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 parsestate.wave.chunklength -= rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 *outbuf = parsestate.wave.leftover;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 parsestate.wave.left = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 return(rq); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 if (*sz >= (size_t) parsestate.wave.chunklength) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 count = parsestate.wave.chunklength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 rq = 0; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 count = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 count -= rq = count % parsestate.wave.align; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 *outbuf = *data;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
228 (*(UChar_Binary **)data) += count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 *sz -= count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 if ((parsestate.wave.chunklength -= count) < parsestate.wave.align) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 parsestate.wave.state = wvOutOfBlock;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 /* Some broken software (e.g. SOX) attaches junk to the end of a sound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 chunk; so, let's ignore this... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 if (parsestate.wave.chunklength)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 parsestate.wave.state = wvSkipChunk; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 else if (rq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 /* align data length to a multiple of datasize; keep additional data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 in "leftover" buffer --- this is necessary to ensure proper
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 functioning of the sndcnv... routines */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 waverequire(data,sz,rq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 return(count); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 case wvFatalNotify:
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
243 sound_warn("Irrecoverable error while parsing WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 parsestate.wave.state = wvFatal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 case wvFatal:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 /* Strip the header from files in Sun/DEC audio format; this requires some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 extra processing as the header can be an arbitrary size and it might
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 result in alignment errors for subsequent conversions --- thus we do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 some buffering, where needed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 static size_t parsesundecaudio(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 /* There is data left over from the last invocation of this function; join
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 it with the new data and return a sound chunk that is as big as a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 single entry */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 if (parsestate.audio.left) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 if (parsestate.audio.left + *sz > (size_t) parsestate.audio.align) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 int count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 memmove(parsestate.audio.leftover + parsestate.audio.left,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 *data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 count = parsestate.audio.align - parsestate.audio.left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 *outbuf = parsestate.audio.leftover;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 *sz -= count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
269 *data = (*(Char_Binary **)data) + count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 parsestate.audio.left = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 return(parsestate.audio.align); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 /* We need even more data in order to get one complete single entry! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 memmove(parsestate.audio.leftover + parsestate.audio.left,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 *data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 *sz);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
277 *data = (*(Char_Binary **)data) + *sz;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 parsestate.audio.left += *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 return(0); } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 /* This is the main sound chunk, strip of any extra data that does not fit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 the alignment requirements and move these bytes into the leftover buffer*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 if (parsestate.audio.isdata) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 int rc = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 if ((parsestate.audio.left = rc % parsestate.audio.align) != 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 memmove(parsestate.audio.leftover,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
289 (Char_Binary *)*outbuf + rc - parsestate.audio.left,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 parsestate.audio.left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 rc -= parsestate.audio.left; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 return(rc); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 /* This is the first invocation of this function; we need to parse the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 header information and determine how many bytes we need to skip until
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 the start of the sound chunk */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 if (!parsestate.audio.skipping) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
299 UChar_Binary *header = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 if (*sz < 8) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
301 sound_warn("Irrecoverable error while parsing Sun/DEC audio file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 if (header[3]) { /* Sun audio (big endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 parsestate.audio.align = ((header[15] > 2)+1)*header[23];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 parsestate.audio.skipping = header[7]+256*(header[6]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 (header[5]+256*header[4])); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 else { /* DEC audio (little endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 parsestate.audio.align = ((header[12] > 2)+1)*header[20];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 parsestate.audio.skipping = header[4]+256*(header[5]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (header[6]+256*header[7])); }}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 /* We are skipping extra data that has been attached to header; most usually
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 this will be just a comment, such as the original filename and/or the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 creation date. Make sure that we do not return less than one single sound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 sample entry to the caller; if this happens, rather decide to move those
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 few bytes into the leftover buffer and deal with it later */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 if (*sz >= (size_t) parsestate.audio.skipping) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 /* Skip just the header information and return the sound chunk */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 int rc = *sz - parsestate.audio.skipping;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
321 *outbuf = (Char_Binary *)*data + parsestate.audio.skipping;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 if ((parsestate.audio.left = rc % parsestate.audio.align) != 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 memmove(parsestate.audio.leftover,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
324 (Char_Binary *)*outbuf + rc - parsestate.audio.left,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 parsestate.audio.left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 rc -= parsestate.audio.left; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 parsestate.audio.skipping = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 parsestate.audio.isdata++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 return(rc); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 /* Skip everything */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 parsestate.audio.skipping -= *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 /* If the soundcard could not be set to natively support the data format, we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 try to do some limited on-the-fly conversion to a different format; if
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 no conversion is needed, though, we can output directly */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 size_t sndcnvnop(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 int rc = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 /* Convert 8 bit unsigned stereo data to 8 bit unsigned mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 size_t sndcnv8U_2mono(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
352 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
353 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
360 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 while (count--)
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
364 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
365 *dest++ = (UChar_Binary)(((int)*(src) +
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
366 (int)*(src+1)) / 2);
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
367 src += 2;
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
368 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
372
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 /* Convert 8 bit signed stereo data to 8 bit signed mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 size_t sndcnv8S_2mono(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
376 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
377 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 int rc, count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
380 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
384 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 while (count--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
388 {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
389 *dest++ = (UChar_Binary)(((int)*((SChar_Binary *)(src)) +
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
390 (int)*((SChar_Binary *)(src+1))) / 2);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
391 src += 2;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
392 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
393 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
395 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 /* Convert 8 bit signed stereo data to 8 bit unsigned mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 size_t sndcnv2monounsigned(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
400 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
401 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
404 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
405 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
406 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
407 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
408 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 while (count--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
412 {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
413 *dest++ = (UChar_Binary)(((int)*((SChar_Binary *)(src)) +
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
414 (int)*((SChar_Binary *)(src+1))) / 2) ^ 0x80;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
415 src += 2;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
416 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 /* Convert 8 bit signed mono data to 8 bit unsigned mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 size_t sndcnv2unsigned(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
424 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
425 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 count = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 if (count > SNDBUFSZ) { *sz -= SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
432 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 while (count--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 *dest++ = *(src)++ ^ 0x80;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 /* Convert a number in the range -32768..32767 to an 8 bit ulaw encoded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 number --- I hope, I got this conversion right :-) */
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
443 static inline SChar_Binary int2ulaw(int i)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 /* Lookup table for fast calculation of number of bits that need shifting*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 static short int t_bits[128] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 0,1,2,2,3,3,3,3,4,4,4,4,4,4,4,4,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 REGISTER int bits,logi;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 /* unrolling this condition (hopefully) improves execution speed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 if (i < 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 if ((i = (132-i)) > 0x7FFF) i = 0x7FFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 logi = (i >> ((bits = t_bits[i/256])+4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 return((bits << 4 | logi) ^ 0x7F); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 if ((i = 132+i) > 0x7FFF) i = 0x7FFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 logi = (i >> ((bits = t_bits[i/256])+4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 return(~(bits << 4 | logi)); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 /* Convert from 8 bit ulaw mono to 8 bit linear mono */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 size_t sndcnvULaw_2linear(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 /* conversion table stolen from Linux's ulaw.h */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
468 static UChar_Binary ulaw_dsp[] = {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 3, 7, 11, 15, 19, 23, 27, 31,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 35, 39, 43, 47, 51, 55, 59, 63,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 66, 68, 70, 72, 74, 76, 78, 80,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 82, 84, 86, 88, 90, 92, 94, 96,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 98, 99, 100, 101, 102, 103, 104, 105,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 106, 107, 108, 109, 110, 111, 112, 113,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 113, 114, 114, 115, 115, 116, 116, 117,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 117, 118, 118, 119, 119, 120, 120, 121,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 121, 121, 122, 122, 122, 122, 123, 123,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 123, 123, 124, 124, 124, 124, 125, 125,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 125, 125, 125, 125, 126, 126, 126, 126,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 126, 126, 126, 126, 127, 127, 127, 127,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 127, 127, 127, 127, 127, 127, 127, 127,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 253, 249, 245, 241, 237, 233, 229, 225,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 221, 217, 213, 209, 205, 201, 197, 193,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 190, 188, 186, 184, 182, 180, 178, 176,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 174, 172, 170, 168, 166, 164, 162, 160,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 158, 157, 156, 155, 154, 153, 152, 151,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 150, 149, 148, 147, 146, 145, 144, 143,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 143, 142, 142, 141, 141, 140, 140, 139,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 139, 138, 138, 137, 137, 136, 136, 135,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 135, 135, 134, 134, 134, 134, 133, 133,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 133, 133, 132, 132, 132, 132, 131, 131,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 131, 131, 131, 131, 130, 130, 130, 130,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 130, 130, 130, 130, 129, 129, 129, 129,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 129, 129, 129, 129, 129, 129, 129, 129,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 };
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
502 UChar_Binary *p=(UChar_Binary *)*data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 while ((*sz)--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
506 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
507 *p = ulaw_dsp[*p];
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
508 p++;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
509 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 *data = p;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
512 return p - (UChar_Binary *)*outbuf;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 /* Convert 8 bit ulaw stereo data to 8 bit ulaw mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 size_t sndcnvULaw_2mono(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 static short int ulaw2int[256] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 /* Precomputed lookup table for conversion from ulaw to 15 bit signed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 -16062,-15550,-15038,-14526,-14014,-13502,-12990,-12478,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 -11966,-11454,-10942,-10430, -9918, -9406, -8894, -8382,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 -7998, -7742, -7486, -7230, -6974, -6718, -6462, -6206,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 -5950, -5694, -5438, -5182, -4926, -4670, -4414, -4158,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 -3966, -3838, -3710, -3582, -3454, -3326, -3198, -3070,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 -2942, -2814, -2686, -2558, -2430, -2302, -2174, -2046,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 -1950, -1886, -1822, -1758, -1694, -1630, -1566, -1502,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 -1438, -1374, -1310, -1246, -1182, -1118, -1054, -990,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 -942, -910, -878, -846, -814, -782, -750, -718,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 -686, -654, -622, -590, -558, -526, -494, -462,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 -438, -422, -406, -390, -374, -358, -342, -326,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 -310, -294, -278, -262, -246, -230, -214, -198,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 -186, -178, -170, -162, -154, -146, -138, -130,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 -122, -114, -106, -98, -90, -82, -74, -66,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 -60, -56, -52, -48, -44, -40, -36, -32,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 -28, -24, -20, -16, -12, -8, -4, +0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 +16062,+15550,+15038,+14526,+14014,+13502,+12990,+12478,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 +11966,+11454,+10942,+10430, +9918, +9406, +8894, +8382,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 +7998, +7742, +7486, +7230, +6974, +6718, +6462, +6206,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 +5950, +5694, +5438, +5182, +4926, +4670, +4414, +4158,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 +3966, +3838, +3710, +3582, +3454, +3326, +3198, +3070,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 +2942, +2814, +2686, +2558, +2430, +2302, +2174, +2046,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 +1950, +1886, +1822, +1758, +1694, +1630, +1566, +1502,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 +1438, +1374, +1310, +1246, +1182, +1118, +1054, +990,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 +942, +910, +878, +846, +814, +782, +750, +718,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 +686, +654, +622, +590, +558, +526, +494, +462,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 +438, +422, +406, +390, +374, +358, +342, +326,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 +310, +294, +278, +262, +246, +230, +214, +198,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 +186, +178, +170, +162, +154, +146, +138, +130,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 +122, +114, +106, +98, +90, +82, +74, +66,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 +60, +56, +52, +48, +44, +40, +36, +32,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 +28, +24, +20, +16, +12, +8, +4, +0};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
554 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
555 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
562 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 while (count--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
566 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
567 /* it is not possible to directly interpolate between two ulaw encoded
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
568 data bytes, thus we need to convert to linear format first and later
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
569 we convert back to ulaw format */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
570 *dest++ = int2ulaw(ulaw2int[*src] +
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
571 ulaw2int[*(src+1)]);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
572 src += 2;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
573 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 size_t sndcnv16swap(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 size_t cnt = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 unsigned short *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 p = (unsigned short *) *outbuf;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
585 while (cnt--)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
586 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
587 *p = ((*p & 0x00ff) << 8) | (*p >> 8);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
588 p++;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
589 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 *data = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 cnt = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 return cnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596 /* Convert 16 bit little endian signed stereo data to 16 bit little endian
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 signed mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 size_t sndcnv16_2monoLE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
600 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
601 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 signed short i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
609 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 for (count /= 2; count--; ) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 i = ((int)(src[0]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 256*(int)(src[1]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (int)(src[2]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 256*(int)(src[3])) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 src += 4;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
618 *dest++ = (UChar_Binary)(i & 0xFF);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
619 *dest++ = (UChar_Binary)((i / 256) & 0xFF); }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 /* Convert 16 bit big endian signed stereo data to 16 bit big endian
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 signed mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 size_t sndcnv16_2monoBE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
628 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
629 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 signed short i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
637 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 for (count /= 2; count--; ) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 i = ((int)(src[1]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 256*(int)(src[0]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 (int)(src[3]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 256*(int)(src[2])) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 src += 4;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
646 *dest++ = (UChar_Binary)((i / 256) & 0xFF);
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
647 *dest++ = (UChar_Binary)(i & 0xFF); }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 /* Convert 16 bit little endian signed data to 8 bit unsigned data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 size_t sndcnv2byteLE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
655 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
656 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
663 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 while (count--) {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
667 *dest++ = (UChar_Binary)(((SChar_Binary *)src)[1] ^ (SChar_Binary)0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 src += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 /* Convert 16 bit big endian signed data to 8 bit unsigned data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 size_t sndcnv2byteBE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
677 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
678 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
685 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 while (count--) {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
689 *dest++ = (UChar_Binary)(((SChar_Binary *)src)[0] ^ (SChar_Binary)0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 src += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696 /* Convert 16 bit little endian signed stereo data to 8 bit unsigned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 size_t sndcnv2monobyteLE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
700 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
701 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
704 count = *sz / 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
705 if (count > SNDBUFSZ) { *sz -= 4*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
708 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711 while (count--) {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
712 *dest++ = (UChar_Binary)(((int)((SChar_Binary *)src)[1] +
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
713 (int)((SChar_Binary *)src)[3]) / 2 ^ 0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 src += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 /* Convert 16 bit big endian signed stereo data to 8 bit unsigned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 size_t sndcnv2monobyteBE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
724 REGISTER UChar_Binary *src;
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
725 REGISTER UChar_Binary *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 count = *sz / 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 if (count > SNDBUFSZ) { *sz -= 4*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 rc = count;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
732 src = (UChar_Binary *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 while (count--) {
593
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
736 *dest++ = (UChar_Binary)(((int)((SChar_Binary *)src)[0] +
5fd7ba8b56e7 [xemacs-hg @ 2001-05-31 12:45:27 by ben]
ben
parents: 570
diff changeset
737 (int)((SChar_Binary *)src)[2]) / 2 ^ 0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 src += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
743
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 /* Look at the header of the sound file and try to determine the format;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 we can recognize files in VOC, WAVE, and, Sun/DEC-audio format--- everything
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 else is assumed to be raw 8 bit unsigned data sampled at 8kHz */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
747 fmtType analyze_format(UChar_Binary *format,int *fmt,int *speed,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 int *tracks,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 size_t (**parsesndfile)(void **,size_t *sz,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 void **))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 if (!memcmp(format,"Creative Voice File\x1A\x1A\x00",22) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 (format[22]+256*format[23]) ==
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 ((0x1233-format[24]-256*format[25])&0xFFFF)) { /* VOC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 *fmt = AFMT_U8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 *tracks = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 *parsesndfile = parsevoc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 return(fmtVoc); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 else if (!memcmp(format,"RIFF",4) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 !memcmp(format+8,"WAVEfmt ",8)) { /* WAVE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 if (memcmp(format+20,"\001\000\001"/* PCM mono */,4) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 memcmp(format+20,"\001\000\002"/* PCM stereo */,4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 return(fmtIllegal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 *fmt = (format[32]/(*tracks = format[22])) == 1 ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 AFMT_U8 : AFMT_S16_LE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 *speed = format[24]+256*(format[25]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 (format[26]+256*format[27]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 *parsesndfile = parsewave;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 return(fmtWave); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 else if (!memcmp(format,".snd",4)) { /* Sun Audio (big endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 if (format[7]+256*(format[6]+256*(format[5]+256*format[4])) < 24) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 *tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 if (!memcmp(format+12,"\000\000\000\001",4)) *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 else if (!memcmp(format+12,"\000\000\000\002",4)) *fmt = AFMT_S8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 else if (!memcmp(format+12,"\000\000\000\003",4)) *fmt = AFMT_S16_BE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 else return(fmtIllegal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 *speed = format[19]+256*(format[18]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (format[17]+256*format[16]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 *tracks = format[23];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 else if (!memcmp(format,".sd",4)) { /* DEC Audio (little endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 if (format[4]+256*(format[5]+256*(format[6]+256*format[7])) < 24) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 *tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 if (!memcmp(format+12,"\001\000\000",4)) *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 else if (!memcmp(format+12,"\002\000\000",4)) *fmt = AFMT_S8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 else if (!memcmp(format+12,"\003\000\000",4)) *fmt = AFMT_S16_LE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 else return(fmtIllegal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 *speed = format[16]+256*(format[17]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 (format[18]+256*format[19]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 *tracks = format[20];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
807 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
808 *fmt = AFMT_U8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 *tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 *parsesndfile = parseraw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 return(fmtRaw); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 }