annotate src/miscplay.c @ 3767:6b2ef948e140

[xemacs-hg @ 2006-12-29 18:09:38 by aidan] etc/ChangeLog addition: 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * unicode/unicode-consortium/8859-7.TXT: Update the mapping to the 2003 version of ISO 8859-7. lisp/ChangeLog addition: 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * mule/cyrillic.el: * mule/cyrillic.el (iso-8859-5): * mule/cyrillic.el (cyrillic-koi8-r-encode-table): Add syntax, case support for Cyrillic; make some parentheses more Lispy. * mule/european.el: Content moved to latin.el, file deleted. * mule/general-late.el: If Unicode tables are to be loaded at dump time, do it here, not in loadup.el. * mule/greek.el: Add syntax, case support for Greek. * mule/latin.el: Move the content of european.el here. Change the case table mappings to use hexadecimal codes, to make cross reference to the standards easier. In all cases, take character syntax from similar characters in Latin-1 , rather than deciding separately what syntax they should take. Add (incomplete) support for case with Turkish. Remove description of the character sets used from the language environments' doc strings, since now that we create variant language environments on the fly, such descriptions will often be inaccurate. Set the native-coding-system language info property while setting the other coding-system properties of the language. * mule/misc-lang.el (ipa): Remove the language environment. The International Phonetic _Alphabet_ is not a language, it's inane to have a corresponding language environment in XEmacs. * mule/mule-cmds.el (create-variant-language-environment): Also modify the coding-priority when creating a new language environment; document that. * mule/mule-cmds.el (get-language-environment-from-locale): Recognise that the 'native-coding-system language-info property can be a list, interpret it correctly when it is one. 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * coding.el (coding-system-category): Use the new 'unicode-type property for finding what sort of Unicode coding system subtype a coding system is, instead of the overshadowed 'type property. * dumped-lisp.el (preloaded-file-list): mule/european.el has been removed. * loadup.el (really-early-error-handler): Unicode tables loaded at dump time are now in mule/general-late.el. * simple.el (count-lines): Add some backslashes to to parentheses in docstrings to help fontification along. * simple.el (what-cursor-position): Wrap a line to fit in 80 characters. * unicode.el: Use the 'unicode-type property, not 'type, for setting the Unicode coding-system subtype. src/ChangeLog addition: 2006-12-21 Aidan Kehoe <kehoea@parhasard.net> * file-coding.c: Update the make-coding-system docstring to reflect unicode-type * general-slots.h: New symbol, unicode-type, since 'type was being overridden when accessing a coding system's Unicode subtype. * intl-win32.c: Backslash a few parentheses, to help fontification along. * intl-win32.c (complex_vars_of_intl_win32): Use the 'unicode-type symbol, not 'type, when creating the Microsoft Unicode coding system. * unicode.c (unicode_putprop): * unicode.c (unicode_getprop): * unicode.c (unicode_print): Using 'type as the property name when working out what Unicode subtype a given coding system is was broken, since there's a general coding system property called 'type. Change the former to use 'unicode-type instead.
author aidan
date Fri, 29 Dec 2006 18:09:51 +0000
parents ecf1ebac70d8
children
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 /* Maintain global variable for keeping parser state information; this struct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 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
34 global variable prevents multiple concurrent executions of this code, but
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 this does not happen anyways... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 enum wvState
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 { wvMain,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 wvSubchunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 wvOutOfBlock,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 wvSkipChunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 wvSoundChunk,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 wvFatal,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 wvFatalNotify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 };
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 static union {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 int align;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 enum wvState state;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 size_t left;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
51 Binbyte leftover[HEADERSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 signed long chunklength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 } wave;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 struct {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 int align;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 int isdata;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 int skipping;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 size_t left;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
59 Binbyte leftover[HEADERSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 } audio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 } parsestate;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63 /* Use a global buffer as scratch-pad for possible conversions of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 sampling format */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
65 Binbyte miscplay_sndbuf[SNDBUFSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 /* Initialize global parser state information to zero */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 void reset_parsestate()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 memset(&parsestate,0,sizeof(parsestate));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 }
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 /* Verify that we could fully parse the entire soundfile; this is needed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 only for files in WAVE format */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 int parse_wave_complete()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
76 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
77 if (parsestate.wave.state != wvOutOfBlock &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 parsestate.wave.state != wvFatal) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
79 sound_warn("Unexpected end of WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 return 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 } else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 return 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 /* There is no special treatment required for parsing raw data files; we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 assume that these files contain data in 8bit unsigned format that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 has been sampled at 8kHz; there is no extra header */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 static size_t parseraw(void **data,size_t *sz,void **outbuf)
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 int rc = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 return(rc);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 /* 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
98 to play these files, they should be converted by using SOX */
2286
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 771
diff changeset
99 static size_t parsevoc(void **UNUSED (data), size_t *UNUSED (sz),
04bc9d2f42c7 [xemacs-hg @ 2004-09-20 19:18:55 by james]
james
parents: 771
diff changeset
100 void **UNUSED (outbuf))
428
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 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 /* 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
106 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
107 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
108 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
109 static int waverequire(void **data,size_t *sz,size_t rq)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 int rc = 1;
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 if (rq > HEADERSZ) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
114 sound_warn("Header size exceeded while parsing WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 parsestate.wave.state = wvFatal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 if ((rq -= parsestate.wave.left) <= 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 if (rq > *sz) {rq = *sz; rc = 0;}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 memcpy(parsestate.wave.leftover+parsestate.wave.left,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 *data,rq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 parsestate.wave.left += rq;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
124 (*(Binbyte **)data) += rq;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 *sz -= rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 /* ...and next we remove this many bytes from the buffer */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 430
diff changeset
130 static inline void waveremove(size_t rq)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 if (parsestate.wave.left <= rq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 parsestate.wave.left = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 parsestate.wave.left -= rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 memmove(parsestate.wave.leftover,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 parsestate.wave.leftover+rq,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 parsestate.wave.left); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 /* Sound files in WAVE format can contain an arbitrary amount of tagged
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 chunks; this requires quite some effort for parsing the data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 static size_t parsewave(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 for (;;)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 switch (parsestate.wave.state) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 case wvMain:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 if (!waverequire(data,sz,20))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 parsestate.wave.chunklength = parsestate.wave.leftover[16] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 256*(parsestate.wave.leftover[17] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 256*(parsestate.wave.leftover[18] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 256*parsestate.wave.leftover[19]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 waveremove(20);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 parsestate.wave.state = wvSubchunk;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 case wvSubchunk:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 if (!waverequire(data,sz,parsestate.wave.chunklength))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 parsestate.wave.align = parsestate.wave.chunklength < 14 ? 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 : parsestate.wave.leftover[12];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 if (parsestate.wave.align != 1 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 parsestate.wave.align != 2 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 parsestate.wave.align != 4) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
167 sound_warn("Illegal datawidth detected while parsing WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 parsestate.wave.state = wvFatal; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 parsestate.wave.state = wvOutOfBlock;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 waveremove(parsestate.wave.chunklength);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 case wvOutOfBlock:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 if (!waverequire(data,sz,8))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 return(0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 parsestate.wave.chunklength = parsestate.wave.leftover[4] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 256*(parsestate.wave.leftover[5] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 256*(parsestate.wave.leftover[6] +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 256*(parsestate.wave.leftover[7] & 0x7F)));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 if (memcmp(parsestate.wave.leftover,"data",4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 parsestate.wave.state = wvSkipChunk;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 parsestate.wave.state = wvSoundChunk;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 waveremove(8);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 case wvSkipChunk:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 if (parsestate.wave.chunklength > 0 && *sz > 0 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (signed long)*sz < (signed long)parsestate.wave.chunklength) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 parsestate.wave.chunklength -= *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 *sz = 0; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 if (parsestate.wave.chunklength > 0 && *sz > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 *sz -= parsestate.wave.chunklength;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
195 (*(Binbyte **)data) += parsestate.wave.chunklength; }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 parsestate.wave.state = wvOutOfBlock; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 case wvSoundChunk: {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 size_t count,rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 if (parsestate.wave.left) { /* handle leftover bytes from last
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 alignment operation */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 count = parsestate.wave.left;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 rq = HEADERSZ-count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 if (rq > (size_t) parsestate.wave.chunklength)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 rq = parsestate.wave.chunklength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 if (!waverequire(data,sz,rq)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 parsestate.wave.chunklength -= parsestate.wave.left - count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 parsestate.wave.chunklength -= rq;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 *outbuf = parsestate.wave.leftover;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 parsestate.wave.left = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 return(rq); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 if (*sz >= (size_t) parsestate.wave.chunklength) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 count = parsestate.wave.chunklength;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 rq = 0; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 count = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 count -= rq = count % parsestate.wave.align; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 *outbuf = *data;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
220 (*(Binbyte **)data) += count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 *sz -= count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 if ((parsestate.wave.chunklength -= count) < parsestate.wave.align) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 parsestate.wave.state = wvOutOfBlock;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 /* 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
225 chunk; so, let's ignore this... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 if (parsestate.wave.chunklength)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 parsestate.wave.state = wvSkipChunk; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 else if (rq)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 /* align data length to a multiple of datasize; keep additional data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 in "leftover" buffer --- this is necessary to ensure proper
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 functioning of the sndcnv... routines */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 waverequire(data,sz,rq);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 return(count); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 case wvFatalNotify:
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
235 sound_warn("Irrecoverable error while parsing WAVE file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 parsestate.wave.state = wvFatal;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 case wvFatal:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 default:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 /* 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
245 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
246 result in alignment errors for subsequent conversions --- thus we do
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 some buffering, where needed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 static size_t parsesundecaudio(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 /* 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
251 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
252 single entry */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 if (parsestate.audio.left) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 if (parsestate.audio.left + *sz > (size_t) parsestate.audio.align) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 int count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 memmove(parsestate.audio.leftover + parsestate.audio.left,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 *data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 count = parsestate.audio.align - parsestate.audio.left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 *outbuf = parsestate.audio.leftover;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 *sz -= count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
261 *data = (*(CBinbyte **)data) + count;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 parsestate.audio.left = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 return(parsestate.audio.align); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 /* 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
266 memmove(parsestate.audio.leftover + parsestate.audio.left,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 *data,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 *sz);
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
269 *data = (*(CBinbyte **)data) + *sz;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 parsestate.audio.left += *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 return(0); } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 /* 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
275 the alignment requirements and move these bytes into the leftover buffer*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 if (parsestate.audio.isdata) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 int rc = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 if ((parsestate.audio.left = rc % parsestate.audio.align) != 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 memmove(parsestate.audio.leftover,
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
281 (CBinbyte *)*outbuf + rc - parsestate.audio.left,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 parsestate.audio.left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 rc -= parsestate.audio.left; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 return(rc); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 /* 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
288 header information and determine how many bytes we need to skip until
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 the start of the sound chunk */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 if (!parsestate.audio.skipping) {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
291 Binbyte *header = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 if (*sz < 8) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 452
diff changeset
293 sound_warn("Irrecoverable error while parsing Sun/DEC audio file");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 if (header[3]) { /* Sun audio (big endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 parsestate.audio.align = ((header[15] > 2)+1)*header[23];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 parsestate.audio.skipping = header[7]+256*(header[6]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 (header[5]+256*header[4])); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 else { /* DEC audio (little endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 parsestate.audio.align = ((header[12] > 2)+1)*header[20];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 parsestate.audio.skipping = header[4]+256*(header[5]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 (header[6]+256*header[7])); }}
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 /* 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
306 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
307 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
308 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
309 few bytes into the leftover buffer and deal with it later */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 if (*sz >= (size_t) parsestate.audio.skipping) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 /* Skip just the header information and return the sound chunk */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 int rc = *sz - parsestate.audio.skipping;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
313 *outbuf = (CBinbyte *)*data + parsestate.audio.skipping;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314 if ((parsestate.audio.left = rc % parsestate.audio.align) != 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 memmove(parsestate.audio.leftover,
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
316 (CBinbyte *)*outbuf + rc - parsestate.audio.left,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 parsestate.audio.left);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 rc -= parsestate.audio.left; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 parsestate.audio.skipping = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 parsestate.audio.isdata++;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 return(rc); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 /* Skip everything */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 parsestate.audio.skipping -= *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 /* 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
330 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
331 no conversion is needed, though, we can output directly */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 size_t sndcnvnop(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 int rc = *sz;
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 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 /* Convert 8 bit unsigned stereo data to 8 bit unsigned mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 size_t sndcnv8U_2mono(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
344 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
345 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 int rc,count;
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 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
352 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 while (count--)
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
356 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
357 *dest++ = (Binbyte)(((int)*(src) +
452
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
358 (int)*(src+1)) / 2);
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
359 src += 2;
3d3049ae1304 Import from CVS: tag r21-2-41
cvs
parents: 444
diff changeset
360 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 /* Convert 8 bit signed stereo data to 8 bit signed mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 size_t sndcnv8S_2mono(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
368 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
369 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 int rc, count;
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 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
376 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
379 while (count--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
380 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
381 *dest++ = (Binbyte)(((int)*((SBinbyte *)(src)) +
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
382 (int)*((SBinbyte *)(src+1))) / 2);
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
383 src += 2;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
384 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
388
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 /* Convert 8 bit signed stereo data to 8 bit unsigned mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 size_t sndcnv2monounsigned(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
392 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
393 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 int rc,count;
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 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
397 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
398 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
399 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
400 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
401 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
402 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
403 while (count--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
404 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
405 *dest++ = (Binbyte)(((int)*((SBinbyte *)(src)) +
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
406 (int)*((SBinbyte *)(src+1))) / 2) ^ 0x80;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
407 src += 2;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
408 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
409 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
410 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
411 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 /* Convert 8 bit signed mono data to 8 bit unsigned mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 size_t sndcnv2unsigned(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
416 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
417 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 int rc,count;
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 count = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 if (count > SNDBUFSZ) { *sz -= SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
424 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 while (count--)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 *dest++ = *(src)++ ^ 0x80;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 /* 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
434 number --- I hope, I got this conversion right :-) */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
435 static inline SBinbyte int2ulaw(int i)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 /* Lookup table for fast calculation of number of bits that need shifting*/
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 static short int t_bits[128] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 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
440 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
441 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
442 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
443 REGISTER int bits,logi;
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 /* unrolling this condition (hopefully) improves execution speed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 if (i < 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 if ((i = (132-i)) > 0x7FFF) i = 0x7FFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 logi = (i >> ((bits = t_bits[i/256])+4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 return((bits << 4 | logi) ^ 0x7F); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 if ((i = 132+i) > 0x7FFF) i = 0x7FFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 logi = (i >> ((bits = t_bits[i/256])+4));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 return(~(bits << 4 | logi)); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
454 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
456 /* Convert from 8 bit ulaw mono to 8 bit linear mono */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457 size_t sndcnvULaw_2linear(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 /* conversion table stolen from Linux's ulaw.h */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
460 static Binbyte ulaw_dsp[] = {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 3, 7, 11, 15, 19, 23, 27, 31,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 35, 39, 43, 47, 51, 55, 59, 63,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 66, 68, 70, 72, 74, 76, 78, 80,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 82, 84, 86, 88, 90, 92, 94, 96,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 98, 99, 100, 101, 102, 103, 104, 105,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 106, 107, 108, 109, 110, 111, 112, 113,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 113, 114, 114, 115, 115, 116, 116, 117,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 117, 118, 118, 119, 119, 120, 120, 121,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 121, 121, 122, 122, 122, 122, 123, 123,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 123, 123, 124, 124, 124, 124, 125, 125,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 125, 125, 125, 125, 126, 126, 126, 126,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 126, 126, 126, 126, 127, 127, 127, 127,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 127, 127, 127, 127, 127, 127, 127, 127,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 253, 249, 245, 241, 237, 233, 229, 225,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 221, 217, 213, 209, 205, 201, 197, 193,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 190, 188, 186, 184, 182, 180, 178, 176,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 174, 172, 170, 168, 166, 164, 162, 160,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 158, 157, 156, 155, 154, 153, 152, 151,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 150, 149, 148, 147, 146, 145, 144, 143,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 143, 142, 142, 141, 141, 140, 140, 139,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 139, 138, 138, 137, 137, 136, 136, 135,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 135, 135, 134, 134, 134, 134, 133, 133,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 133, 133, 132, 132, 132, 132, 131, 131,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 131, 131, 131, 131, 130, 130, 130, 130,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488 130, 130, 130, 130, 129, 129, 129, 129,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 129, 129, 129, 129, 129, 129, 129, 129,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 128, 128, 128, 128, 128, 128, 128, 128,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 };
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
494 Binbyte *p=(Binbyte *)*data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 while ((*sz)--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
498 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
499 *p = ulaw_dsp[*p];
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
500 p++;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
501 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 *data = p;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
504 return p - (Binbyte *)*outbuf;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 /* Convert 8 bit ulaw stereo data to 8 bit ulaw mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 size_t sndcnvULaw_2mono(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 static short int ulaw2int[256] = {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 /* Precomputed lookup table for conversion from ulaw to 15 bit signed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 -16062,-15550,-15038,-14526,-14014,-13502,-12990,-12478,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 -11966,-11454,-10942,-10430, -9918, -9406, -8894, -8382,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 -7998, -7742, -7486, -7230, -6974, -6718, -6462, -6206,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 -5950, -5694, -5438, -5182, -4926, -4670, -4414, -4158,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 -3966, -3838, -3710, -3582, -3454, -3326, -3198, -3070,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 -2942, -2814, -2686, -2558, -2430, -2302, -2174, -2046,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 -1950, -1886, -1822, -1758, -1694, -1630, -1566, -1502,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 -1438, -1374, -1310, -1246, -1182, -1118, -1054, -990,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 -942, -910, -878, -846, -814, -782, -750, -718,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 -686, -654, -622, -590, -558, -526, -494, -462,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 -438, -422, -406, -390, -374, -358, -342, -326,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 -310, -294, -278, -262, -246, -230, -214, -198,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 -186, -178, -170, -162, -154, -146, -138, -130,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 -122, -114, -106, -98, -90, -82, -74, -66,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 -60, -56, -52, -48, -44, -40, -36, -32,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 -28, -24, -20, -16, -12, -8, -4, +0,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 +16062,+15550,+15038,+14526,+14014,+13502,+12990,+12478,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 +11966,+11454,+10942,+10430, +9918, +9406, +8894, +8382,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 +7998, +7742, +7486, +7230, +6974, +6718, +6462, +6206,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 +5950, +5694, +5438, +5182, +4926, +4670, +4414, +4158,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 +3966, +3838, +3710, +3582, +3454, +3326, +3198, +3070,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534 +2942, +2814, +2686, +2558, +2430, +2302, +2174, +2046,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 +1950, +1886, +1822, +1758, +1694, +1630, +1566, +1502,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 +1438, +1374, +1310, +1246, +1182, +1118, +1054, +990,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 +942, +910, +878, +846, +814, +782, +750, +718,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 +686, +654, +622, +590, +558, +526, +494, +462,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539 +438, +422, +406, +390, +374, +358, +342, +326,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 +310, +294, +278, +262, +246, +230, +214, +198,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 +186, +178, +170, +162, +154, +146, +138, +130,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 +122, +114, +106, +98, +90, +82, +74, +66,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 +60, +56, +52, +48, +44, +40, +36, +32,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 +28, +24, +20, +16, +12, +8, +4, +0};
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
546 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
547 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
554 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 while (count--)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
558 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
559 /* it is not possible to directly interpolate between two ulaw encoded
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
560 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
561 we convert back to ulaw format */
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
562 *dest++ = int2ulaw(ulaw2int[*src] +
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
563 ulaw2int[*(src+1)]);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
564 src += 2;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
565 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 size_t sndcnv16swap(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 size_t cnt = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 unsigned short *p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 *outbuf = *data;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 p = (unsigned short *) *outbuf;
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
577 while (cnt--)
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
578 {
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
579 *p = ((*p & 0x00ff) << 8) | (*p >> 8);
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
580 p++;
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
581 }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 *data = p;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 cnt = *sz;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 return cnt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 /* 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
589 signed mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 size_t sndcnv16_2monoLE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
592 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
593 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 signed short i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
601 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 for (count /= 2; count--; ) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 i = ((int)(src[0]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 256*(int)(src[1]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (int)(src[2]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 256*(int)(src[3])) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 src += 4;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
610 *dest++ = (Binbyte)(i & 0xFF);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
611 *dest++ = (Binbyte)((i / 256) & 0xFF); }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 /* 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
617 signed mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 size_t sndcnv16_2monoBE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
620 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
621 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 int rc,count;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 signed short i;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
629 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 for (count /= 2; count--; ) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 i = ((int)(src[1]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 256*(int)(src[0]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (int)(src[3]) +
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 256*(int)(src[2])) / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 src += 4;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
638 *dest++ = (Binbyte)((i / 256) & 0xFF);
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
639 *dest++ = (Binbyte)(i & 0xFF); }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 /* Convert 16 bit little endian signed data to 8 bit unsigned data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 size_t sndcnv2byteLE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
647 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
648 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 int rc,count;
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 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
655 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658 while (count--) {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
659 *dest++ = (Binbyte)(((SBinbyte *)src)[1] ^ (SBinbyte)0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 src += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 /* Convert 16 bit big endian signed data to 8 bit unsigned data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 size_t sndcnv2byteBE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
669 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
670 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 int rc,count;
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 count = *sz / 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 if (count > SNDBUFSZ) { *sz -= 2*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
677 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 while (count--) {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
681 *dest++ = (Binbyte)(((SBinbyte *)src)[0] ^ (SBinbyte)0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 src += 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 /* Convert 16 bit little endian signed stereo data to 8 bit unsigned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 size_t sndcnv2monobyteLE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
692 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
693 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 int rc,count;
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 count = *sz / 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 if (count > SNDBUFSZ) { *sz -= 4*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
699 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
700 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
702 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 while (count--) {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
704 *dest++ = (Binbyte)(((int)((SBinbyte *)src)[1] +
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
705 (int)((SBinbyte *)src)[3]) / 2 ^ 0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
706 src += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
707 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
708 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
710 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
711
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 /* Convert 16 bit big endian signed stereo data to 8 bit unsigned
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 mono data */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 size_t sndcnv2monobyteBE(void **data,size_t *sz,void **outbuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
715 {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
716 REGISTER Binbyte *src;
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
717 REGISTER Binbyte *dest;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 int rc,count;
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 count = *sz / 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 if (count > SNDBUFSZ) { *sz -= 4*SNDBUFSZ; count = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 else *sz = 0;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 rc = count;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
724 src = (Binbyte *) *data;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
725 *outbuf =
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
726 dest = miscplay_sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
727 while (count--) {
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
728 *dest++ = (Binbyte)(((int)((SBinbyte *)src)[0] +
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
729 (int)((SBinbyte *)src)[2]) / 2 ^ 0x80);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
730 src += 4;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 *data = src;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 return(rc);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 /* 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
737 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
738 else is assumed to be raw 8 bit unsigned data sampled at 8kHz */
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2286
diff changeset
739 fmtType analyze_format(Binbyte *format,int *fmt,int *speed,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 int *tracks,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
741 size_t (**parsesndfile)(void **,size_t *sz,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
742 void **))
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 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 if (!memcmp(format,"Creative Voice File\x1A\x1A\x00",22) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 (format[22]+256*format[23]) ==
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 ((0x1233-format[24]-256*format[25])&0xFFFF)) { /* VOC */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748 *fmt = AFMT_U8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 *tracks = 2;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 *parsesndfile = parsevoc;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 return(fmtVoc); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753 else if (!memcmp(format,"RIFF",4) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754 !memcmp(format+8,"WAVEfmt ",8)) { /* WAVE */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 if (memcmp(format+20,"\001\000\001"/* PCM mono */,4) &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 memcmp(format+20,"\001\000\002"/* PCM stereo */,4))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 return(fmtIllegal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 *fmt = (format[32]/(*tracks = format[22])) == 1 ?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 AFMT_U8 : AFMT_S16_LE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 *speed = format[24]+256*(format[25]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 (format[26]+256*format[27]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 *parsesndfile = parsewave;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 return(fmtWave); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 else if (!memcmp(format,".snd",4)) { /* Sun Audio (big endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 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
767 *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 *tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 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
773 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
774 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
775 else return(fmtIllegal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 *speed = format[19]+256*(format[18]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 (format[17]+256*format[16]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 *tracks = format[23];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 else if (!memcmp(format,".sd",4)) { /* DEC Audio (little endian) */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 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
784 *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 *tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 if (!memcmp(format+12,"\001\000\000",4)) *fmt = AFMT_MU_LAW;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 else if (!memcmp(format+12,"\002\000\000",4)) *fmt = AFMT_S8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 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
792 else return(fmtIllegal);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793 /* Keep compatibility with Linux 68k, etc. by not relying on byte-sex */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794 *speed = format[16]+256*(format[17]+256*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 (format[18]+256*format[19]));
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 *tracks = format[20];
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 *parsesndfile = parsesundecaudio;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 return(fmtSunAudio); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 *fmt = AFMT_U8;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 *speed = 8000;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 *tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 *parsesndfile = parseraw;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 return(fmtRaw); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 }