annotate src/linuxplay.c @ 771:943eaba38521

[xemacs-hg @ 2002-03-13 08:51:24 by ben] The big ben-mule-21-5 check-in! Various files were added and deleted. See CHANGES-ben-mule. There are still some test suite failures. No crashes, though. Many of the failures have to do with problems in the test suite itself rather than in the actual code. I'll be addressing these in the next day or so -- none of the test suite failures are at all critical. Meanwhile I'll be trying to address the biggest issues -- i.e. build or run failures, which will almost certainly happen on various platforms. All comments should be sent to ben@xemacs.org -- use a Cc: if necessary when sending to mailing lists. There will be pre- and post- tags, something like pre-ben-mule-21-5-merge-in, and post-ben-mule-21-5-merge-in.
author ben
date Wed, 13 Mar 2002 08:54:06 +0000
parents b39c14581166
children 0dfff19d20da
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;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
75 static Char_ASCII *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
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
270 linux_play_data_or_file(int fd, UChar_Binary *data,
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;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
277 UChar_Binary *pptr,*optr,*cptr,*sptr;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 int wrtn,rrtn,crtn,prtn;
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
279 UChar_Binary 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 {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 for (pptr = data; (prtn = parsesndfile((void **)&pptr,(size_t *)&rrtn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (void **)&optr)) > 0; )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328 for (cptr = optr; (crtn = sndcnv((void **)&cptr,(size_t *) &prtn,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (void **)&sptr)) > 0; ) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 for (;;) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 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
332 sound_perror("write"); goto END_OF_PLAY; }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 else if (wrtn) break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 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
335 sound_perror("SNDCTL_DSP_SYNC"); goto END_OF_PLAY; } }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
336 if (wrtn != crtn) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
337 Extbyte buf[255];
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
338 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
339 sound_warn(buf);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
340 goto END_OF_PLAY; } }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
341 if (fd >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
342 if ((rrtn = read(fd,sndbuf,SNDBUFSZ)) < 0) {
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
343 sound_perror("read"); goto END_OF_PLAY; } }
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
344 else
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
345 break;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
346 } while (rrtn > 0);
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 if (ffmt == fmtWave)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 parse_wave_complete();
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
350
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 END_OF_PLAY:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 /* Now cleanup all used resources */
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 ioctl(audio_fd,SNDCTL_DSP_SYNC,NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 ioctl(audio_fd,SNDCTL_DSP_RESET,NULL);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357
613
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 609
diff changeset
358 EMACS_SIGNAL (SIGHUP,sighup_handler);
023b83f4e54b [xemacs-hg @ 2001-06-10 10:42:16 by ben]
ben
parents: 609
diff changeset
359 EMACS_SIGNAL (SIGINT,sigint_handler);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 if (mix_fd > 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 if (audio_vol >= 0) {
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 ioctl(mix_fd,SOUND_MIXER_WRITE_PCM,&audio_vol);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 audio_vol = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 if (mix_fd != audio_fd)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 close(mix_fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 mix_fd = -1; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
368
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
369 close(audio_fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370 audio_fd = -1;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
371
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
372 return 1;
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
373 }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
374
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
375 /* Call "linux_play_data_or_file" with the appropriate parameters for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
376 playing a soundfile */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
377 void
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
378 play_sound_file (Extbyte *sound_file, int volume)
428
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 int fd;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
381
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382 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
383 sound_perror(sound_file);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
384 return; }
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
385 linux_play_data_or_file(fd,NULL,0,volume);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
386 close(fd);
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
387 return;
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390 /* Call "linux_play_data_or_file" with the appropriate parameters for
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
391 playing pre-loaded data */
563
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
392 int
183866b06e0b [xemacs-hg @ 2001-05-24 07:50:48 by ben]
ben
parents: 442
diff changeset
393 play_sound_data (UChar_Binary *data, int length, int volume)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
394 {
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
395 return linux_play_data_or_file(-1,data,length,volume);
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396 }