annotate src/linuxplay.c @ 2951:b694dfd2f40e

[xemacs-hg @ 2005-09-26 08:13:00 by ben] Compile Windows with gmp, ldap, postgresql, db, etc. README: Major rewrite. Document how to compile various optional libs. config.inc.samp: Update to recent versions of optional libs. Add support for gmp, db, postgresql, ldap. Turn on optimization when not debug. minitar.c: Include config.h. xemacs.mak: Figure out VC++ version and use it to set debug and browser flags appropriately. Add support for building gmp, db, postgresql, ldap. Rewrite handling of optional stuff so it is all added to single variables OPT_* rather than to various FOO_* variables. Pass -I$(SRC) to minitar.c so it compiles. Pass module sources, not objects, to make-docfile. Delete more stuff in `make clean'.
author ben
date Mon, 26 Sep 2005 08:13:00 +0000
parents ecf1ebac70d8
children d240e1ef5356
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 /* linuxplay.c - play a sound file on the speaker
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 is version 1.3 of linuxplay.c, with platform-independent functions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5 ** moved to a different file by 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 ** Changelog:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
19 ** 1.0 -- first release; supports SunAudio, Wave and RAW file formats
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20 ** detects (and rejects) VOC file format
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
21 ** tested with PC-Speaker driver only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
22 ** 1.1 -- fixed bug with playback of stereo Wave files
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23 ** fixed VOC file detection
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ** fixed mono/8bit conversion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25 ** cleaned up mixer programming (c.f. VoxWare-SDK)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ** tested with PC-Speaker driver and with PAS16 soundcard
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ** 1.2 -- first (incompatible) attempt at fixing reliable signal handling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ** 1.3 -- changed signal handling to use reliable signals; this is done
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29 ** by including "syssignal.h"; it fixes nasty program crashes
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ** when using native sound in TTY mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31 ** added support for DEC audio file format (this is basically the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ** same as Sun audio, but uses little endian format, instead).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33 ** strip the header from Sun audio and DEC audio files in order to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ** prevent noise at beginning of samples (thanks to Thomas Pundt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 ** <pundtt@math.uni-muenster.de> for pointing out this bug and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ** providing information on the file format).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ** added a few more conversion routines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 ** made the code even more tolerant to the limits imposed by some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 ** soundcards and try to accept soundfiles even if they are not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 ** fully conformant to the standard.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 ** 1.4 -- increased header size to 256; I hope there is no sample software
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 ** that requires this much.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 ** added code for converting from signed to unsigned format as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 ** some soundcards cannot handle signed 8bit data.
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 /* Synched up with: Not in FSF. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
49 /* This file Mule-ized by Ben Wing, 5-15-01. */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
50
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 /* XEmacs beta testers say: undef this by default. */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 #undef NOVOLUMECTRLFORMULAW /* Changing the volume for uLaw-encoded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 samples sounds very poor; possibly,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 this is true only for the PC-Snd
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 driver, so undefine this symbol at your
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 discretion */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 #include <config.h>
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
59 #include "lisp.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 #include "miscplay.h"
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
62 #include "sound.h"
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
64 #include "syssignal.h"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
65 #include "sysfile.h"
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
66 #include "systty.h" /* for sys/ioctl.h */
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
67 #include SOUNDCARD_H_FILE /* Path computed by configure */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
69 static SIGTYPE (*sighup_handler) (int);
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
70 static SIGTYPE (*sigint_handler) (int);
428
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 static int mix_fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
73 static int audio_vol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 static int audio_fd;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2271
diff changeset
75 static Ascbyte *audio_dev = "/dev/dsp";
428
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 /* Intercept SIGINT and SIGHUP in order to close the audio and mixer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
78 devices before terminating sound output; this requires reliable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79 signals as provided by "syssignal.h" */
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
80 static SIGTYPE
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
81 sighandler (int sig)
428
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 (mix_fd > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84 if (audio_vol >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 ioctl(mix_fd,SOUND_MIXER_WRITE_PCM,&audio_vol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 audio_vol = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 if (mix_fd != audio_fd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 close(mix_fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 mix_fd = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 if (audio_fd > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 ioctl(audio_fd,SNDCTL_DSP_RESET,NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 close(audio_fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 audio_fd = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 if (sig == SIGHUP && sighup_handler) sighup_handler(sig);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 else if (sig == SIGINT && sigint_handler) sigint_handler(sig);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 else exit(1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 /* Initialize the soundcard and mixer device with the parameters that we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 found in the header of the sound file. If the soundcard is not capable of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 natively supporting the required parameters, then try to set up conversion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 routines.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 The difficulty with setting up the sound card is that the parameters are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 not fully orthogonal; changing one of them might affect some of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 others, too. Thus we do quite a lot of double checking; actually most of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 this is not needed right now, but it will come in handy, if the kernel's
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108 sounddriver ever changes or if third-party sounddrivers are used. */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
109 static int
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
110 audio_init(int mixx_fd, int auddio_fd, int fmt, int speed,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
111 int tracks, int *volume,
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
112 size_t (**sndcnv) (void **, size_t *sz, void **))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 int i,the_speed,the_stereo,the_fmt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116 *sndcnv = sndcnvnop;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 if (ioctl(auddio_fd,SNDCTL_DSP_SYNC,NULL) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
119 sound_perror("SNDCTL_DSP_SYNC");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 /* Initialize sound hardware with preferred parameters */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 /* If the sound hardware cannot support 16 bit format or requires a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 different byte sex then try to drop to 8 bit format */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 the_fmt = fmt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 if(ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
129 sound_perror("SNDCTL_DSP_SETFMT");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 return(0);
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 if (fmt != the_fmt) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 if (fmt == AFMT_S16_LE || fmt == AFMT_S16_BE) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 *sndcnv = fmt == AFMT_S16_BE ? sndcnv2byteBE : sndcnv2byteLE;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 if (((i=fmt=AFMT_U8),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 fmt != i || ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 fmt != the_fmt) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
139 sound_perror("SNDCTL_DSP_SETFMT");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 return(0); } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 else if (fmt == AFMT_MU_LAW && the_fmt == AFMT_U8 ) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 /* the kernel will convert for us */ }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 else {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
144 sound_perror("SNDCTL_DSP_SETFMT");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 return(0); } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 else if (fmt == AFMT_S8) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 *sndcnv = sndcnv2unsigned;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 if (((i=fmt=AFMT_U8),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 fmt != i || ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 fmt != the_fmt) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
151 sound_perror("SNDCTRL_DSP_SETFMT");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 return(0); } }
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 /* The PCSP driver does not support reading of the sampling rate via the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 SOUND_PCM_READ_RATE ioctl; determine "the_speed" here */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 the_speed = speed; ioctl(audio_fd,SNDCTL_DSP_SPEED,&the_speed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 /* The PCSP driver does not support reading of the mono/stereo flag, thus
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 we assume, that failure to change this mode means we are in mono mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 if (((i = (the_stereo = tracks)-1),ioctl(audio_fd,SNDCTL_DSP_STEREO,&i)) < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 the_stereo = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 /* Try to request stereo playback (if needed); if this cannot be supported
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 by the hardware, then install conversion routines for mono playback */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 /* This ioctl will fail if we use the PCSP driver; thus the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 "the_stereo" is still unchanged */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 ioctl(audio_fd,SOUND_PCM_READ_CHANNELS,&the_stereo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 if (tracks != the_stereo) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 if (tracks == 2) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 tracks = 1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 *sndcnv = *sndcnv == sndcnv2byteLE ? sndcnv2monobyteLE :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 *sndcnv == sndcnv2byteBE ? sndcnv2monobyteBE :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 *sndcnv == sndcnv2unsigned ? sndcnv2monounsigned :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 the_fmt == AFMT_S16_LE ? sndcnv16_2monoLE :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 the_fmt == AFMT_S16_BE ? sndcnv16_2monoBE :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176 the_fmt == AFMT_S8 ? sndcnv8S_2mono :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 the_fmt == AFMT_U8 ? sndcnv8U_2mono :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 the_fmt == AFMT_MU_LAW ? sndcnvULaw_2mono : NULL;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 if (*sndcnv == NULL) { /* this should not happen */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
180 sound_perror("SNDCTL_DSP_STEREO");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 /* Switch to mono mode */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 if (((i = 0),ioctl(audio_fd,SNDCTL_DSP_STEREO,&i)) < 0 || i) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
184 sound_perror("SNDCTL_DSP_STEREO");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 /* Now double check that everything is set as expected */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 if (((i = AFMT_QUERY),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (i != the_fmt &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (((i=the_fmt),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 i != the_fmt ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 ((i = AFMT_QUERY),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 i != the_fmt)) ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (ioctl(audio_fd,SOUND_PCM_READ_CHANNELS,&i) >= 0 &&
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 i != 1)) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 /* There was no way that we could set the soundcard to a meaningful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 mode */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
197 sound_perror("SNDCTL_DSP_SETFMT and SNDCTL_DSP_STEREO");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 return(0); } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 else {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 /* Somebody set the soundcard to stereo even though we requested
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 mono; this should not happen... */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 if (((i = the_stereo = tracks),ioctl(audio_fd,SNDCTL_DSP_STEREO,&i))<0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 i != the_stereo-1) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
204 sound_perror("SNDCTL_DSP_STEREO");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 if (((i = AFMT_QUERY),ioctl(audio_fd,SNDCTL_DSP_SETFMT,&i)) < 0 ||
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 i != the_fmt) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
208 sound_perror("SNDCTL_DSP_SETFMT");
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 return(0); } } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 /* Fail if deviations from desired sampling frequency are too big */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 /* This ioctl will fail if we use the PCSP driver; thus the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 "the_speed" is still unchanged */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 ioctl(audio_fd,SOUND_PCM_READ_RATE,&the_speed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 if (speed*14 < the_speed*10 || speed*6 > the_speed*10) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
217 Extbyte buffer[256];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 sprintf(buffer,"SNDCTL_DSP_SPEED (req: %d, rtn: %d)",speed,the_speed);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
219 sound_perror(buffer);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 return(0); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 /* Use the mixer device for setting the playback volume */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 if (mixx_fd > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 int vol = *volume & 0xFF;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 if (ioctl(mixx_fd,SOUND_MIXER_READ_PCM,volume) < 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 *volume = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 if (vol < 0) vol = 0; else if (vol > 100) vol = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 #ifdef NOVOLUMECTRLFORMULAW
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 if (fmt == AFMT_MU_LAW)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 vol = 100;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 vol |= 256*vol;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 /* Do not signal an error, if volume control is unavailable! */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 ioctl(mixx_fd,SOUND_MIXER_WRITE_PCM,&vol); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 #if defined(LINUXPLAYSTANDALONE) && 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 /* Debugging output is displayed only when compiled as stand-alone version */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 {int the_volume;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 the_fmt = AFMT_QUERY;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 ioctl(audio_fd,SNDCTL_DSP_SETFMT,&the_fmt);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 ioctl(auddio_fd,SOUND_PCM_READ_CHANNELS,&the_stereo);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 ioctl(auddio_fd,SOUND_PCM_READ_RATE,&the_speed);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ioctl(mixx_fd,SOUND_MIXER_READ_PCM,&the_volume);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244 fprintf(stderr,"%s, %s, %dHz, L:%d/R:%d\n",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245 the_fmt == AFMT_MU_LAW ? "AFMT_MU_LAW" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 the_fmt == AFMT_A_LAW ? "AFMT_A_LAW" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 the_fmt == AFMT_IMA_ADPCM ? "AFMT_IMA_ADPCM" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 the_fmt == AFMT_U8 ? "AFMT_U8" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 the_fmt == AFMT_S16_LE ? "AFMT_S16_LE" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 the_fmt == AFMT_S16_BE ? "AFMT_S16_BE" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 the_fmt == AFMT_S8 ? "AFMT_S8" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 the_fmt == AFMT_U16_LE ? "AFMT_U16_LE" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 the_fmt == AFMT_U16_BE ? "AFMT_U16_BE" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 the_fmt == AFMT_MPEG ? "AFMT_MPEG" :
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 "AFMT_???",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 the_stereo == 2 ? "stereo" : "mono",
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 the_speed,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 the_volume / 256, the_volume % 256); }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 #endif
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 return(1);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 /* XEmacs requires code both for playback of pre-loaded data and for playback
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
265 from a soundfile; we use one function for both cases.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
266
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
267 Returns 1 on succes. 0 otherwise.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
268 */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
269 static int
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2271
diff changeset
270 linux_play_data_or_file(int fd, Binbyte *data,
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
271 int length, int volume)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 size_t (*parsesndfile)(void **dayta,size_t *sz,void **outbuf);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 size_t (*sndcnv)(void **dayta,size_t *sz,void **);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 fmtType ffmt;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 int fmt,speed,tracks;
2271
0dfff19d20da [xemacs-hg @ 2004-09-14 20:26:40 by james]
james
parents: 771
diff changeset
277 void *pptr, *optr, *cptr, *sptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 int wrtn,rrtn,crtn,prtn;
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2271
diff changeset
279 Binbyte sndbuf[SNDBUFSZ];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 /* We need to read at least the header information before we can start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 doing anything */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 if (!data || length < HEADERSZ) {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
284 if (fd < 0) return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 else {
647
b39c14581166 [xemacs-hg @ 2001-08-13 04:45:47 by ben]
ben
parents: 613
diff changeset
286 length = read (fd,sndbuf,SNDBUFSZ);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 if (length < HEADERSZ)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
288 return 0;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 data = sndbuf;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 length = SNDBUFSZ; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 ffmt = analyze_format(data,&fmt,&speed,&tracks,&parsesndfile);
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 if (ffmt != fmtRaw && ffmt != fmtSunAudio && ffmt != fmtWave) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
296 sound_warn("Unsupported file format (neither RAW, nor Sun/DECAudio, nor WAVE)");
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
297 return 0; }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 /* The VoxWare-SDK discourages opening /dev/audio; opening /dev/dsp and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 properly initializing it via ioctl() is preferred */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 if ((audio_fd=open(audio_dev, O_WRONLY | O_NONBLOCK, 0)) < 0) {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
302 /* JV. Much too verbose. In addition this can crash. See NOTE: in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
303 Fplay_sound
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
304 sound_perror(audio_dev); */
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 if (mix_fd > 0 && mix_fd != audio_fd) { close(mix_fd); mix_fd = -1; }
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
306 return 0; }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 /* The VoxWare-SDK discourages direct manipulation of the mixer device as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 this could lead to problems, when multiple sound cards are installed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 mix_fd = audio_fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 609
diff changeset
312 sighup_handler = EMACS_SIGNAL (SIGHUP, sighandler);
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 609
diff changeset
313 sigint_handler = EMACS_SIGNAL (SIGINT, sighandler);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
314
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 if (!audio_init(mix_fd,audio_fd,fmt,speed,tracks,&volume,&sndcnv))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316 goto END_OF_PLAY;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 audio_vol = volume;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 reset_parsestate();
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 /* Mainloop: read a block of data, parse its contents, perform all
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 the necessary conversions and output it to the sound
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323 device; repeat until all data has been processed */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 rrtn = length;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 do {
2271
0dfff19d20da [xemacs-hg @ 2004-09-14 20:26:40 by james]
james
parents: 771
diff changeset
326 for (pptr = data; (prtn = parsesndfile(&pptr,(size_t *)&rrtn,&optr)) > 0; )
0dfff19d20da [xemacs-hg @ 2004-09-14 20:26:40 by james]
james
parents: 771
diff changeset
327 for (cptr = optr; (crtn = sndcnv(&cptr,(size_t *) &prtn,&sptr)) > 0; ) {
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 for (;;) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 if ((wrtn = write(audio_fd,sptr,crtn)) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
330 sound_perror("write"); goto END_OF_PLAY; }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 else if (wrtn) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 else if (ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
333 sound_perror("SNDCTL_DSP_SYNC"); goto END_OF_PLAY; } }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 if (wrtn != crtn) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
335 Extbyte buf[255];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 sprintf(buf,"play: crtn = %d, wrtn = %d",crtn,wrtn);
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
337 sound_warn(buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 goto END_OF_PLAY; } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
339 if (fd >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 if ((rrtn = read(fd,sndbuf,SNDBUFSZ)) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
341 sound_perror("read"); goto END_OF_PLAY; } }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
343 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 } while (rrtn > 0);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 if (ffmt == fmtWave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
347 parse_wave_complete();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
348
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 END_OF_PLAY:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 /* Now cleanup all used resources */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 ioctl(audio_fd,SNDCTL_DSP_RESET,NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 609
diff changeset
356 EMACS_SIGNAL (SIGHUP,sighup_handler);
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 609
diff changeset
357 EMACS_SIGNAL (SIGINT,sigint_handler);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 if (mix_fd > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 if (audio_vol >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 ioctl(mix_fd,SOUND_MIXER_WRITE_PCM,&audio_vol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 audio_vol = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 if (mix_fd != audio_fd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 close(mix_fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 mix_fd = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 close(audio_fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368 audio_fd = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
370 return 1;
428
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 /* Call "linux_play_data_or_file" with the appropriate parameters for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374 playing a soundfile */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
375 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
376 play_sound_file (Extbyte *sound_file, int volume)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
378 int fd;
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 if ((fd=open(sound_file,O_RDONLY,0)) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
381 sound_perror(sound_file);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 return; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
383 linux_play_data_or_file(fd,NULL,0,volume);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 close(fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 return;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 }
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 /* Call "linux_play_data_or_file" with the appropriate parameters for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
389 playing pre-loaded data */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
390 int
2367
ecf1ebac70d8 [xemacs-hg @ 2004-11-04 23:05:23 by ben]
ben
parents: 2271
diff changeset
391 play_sound_data (Binbyte *data, int length, int volume)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
392 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
393 return linux_play_data_or_file(-1,data,length,volume);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 }