1 /* esd.c - play a sound over ESD
3 This file is part of XEmacs.
5 XEmacs is free software; you can redistribute it and/or modify it
6 under the terms of the GNU General Public License as published by the
7 Free Software Foundation; either version 2, or (at your option) any
10 XEmacs is distributed in the hope that it will be useful, but WITHOUT
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 You should have received a copy of the GNU General Public License
16 along with XEmacs; see the file COPYING. If not, write to
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
18 Boston, MA 02111-1307, USA. */
20 /* Synched up with: Not in FSF. */
37 /* the name given to ESD - I think this should identify ourselves */
38 #define ESD_NAME "xemacs"
40 int esd_play_sound_file(char *file, int vol);
41 int esd_play_sound_file(char *file, int vol)
42 { /* #### FIXME: vol is ignored */
43 return esd_play_file(ESD_NAME, file, 0);
46 int esd_play_sound_data(unsigned char *data, size_t length, int vol);
47 int esd_play_sound_data(unsigned char *data, size_t length, int vol)
48 { /* #### FIXME: vol is ignored */
49 size_t (*parsesndfile)(void **dayta,size_t *sz,void **outbuf);
50 size_t (*sndcnv)(void **dayta,size_t *sz,void **);
53 unsigned char *pptr,*optr,*cptr,*sptr;
59 /* analyze_format needs at least this many bytes to work with */
60 if (length < HEADERSZ)
63 ffmt = analyze_format(data,&fmt,&speed,&tracks,&parsesndfile);
65 if (ffmt != fmtRaw && ffmt != fmtSunAudio && ffmt != fmtWave) {
66 message(GETTEXT("audio: Unsupported file format (neither RAW, nor Sun/DECAudio, nor WAVE)"));
70 /* convert header information into ESD flags */
71 flags = ESD_STREAM|ESD_PLAY;
76 sndcnv = sndcnvULaw_2linear;
80 sndcnv = sndcnv2unsigned; /* ESD needs unsigned bytes */
85 sndcnv = sndcnv16swap; /* ESD wants little endian */
90 message(GETTEXT("audio: byte format %d unimplemented"), fmt);
95 case 1: flags |= ESD_MONO; break;
96 case 2: flags |= ESD_STEREO; break;
98 message(GETTEXT("audio: %d channels - only 1 or 2 supported"), tracks);
102 sock = esd_play_stream(flags, speed, NULL, "xemacs");
108 for (pptr = data; (prtn = parsesndfile((void **)&pptr,&length,
109 (void **)&optr)) > 0; )
110 for (cptr = optr; (crtn = sndcnv((void **)&cptr,&prtn,
111 (void **)&sptr)) > 0; ) {
112 if ((wrtn = write(sock,sptr,crtn)) < 0) {
113 message(GETTEXT("audio: write error (%s)"), strerror(errno));
117 message(GETTEXT("audio: only wrote %d of %d bytes"), wrtn, crtn);
123 parse_wave_complete();
126 /* Now cleanup all used resources */