Mercurial > hg > xemacs-beta
annotate src/esd.c @ 5518:3cc7470ea71c
gnuclient: if TMPDIR was set and connect failed, try again with /tmp
2011-06-03 Aidan Kehoe <kehoea@parhasard.net>
* gnuslib.c (connect_to_unix_server):
Retry with /tmp as a directory in which to search for Unix sockets
if an attempt to connect with some other directory failed (which
may be because gnuclient and gnuserv don't share an environment
value for TMPDIR, or because gnuserv was compiled with USE_TMPDIR
turned off).
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Fri, 03 Jun 2011 18:40:57 +0100 |
parents | 90dcf2376909 |
children |
rev | line source |
---|---|
398 | 1 /* esd.c - play a sound over ESD |
2 | |
5477
90dcf2376909
Last minute notice fixups.
Stephen J. Turnbull <stephen@xemacs.org>
parents:
5402
diff
changeset
|
3 Copyright 1999 Robert Bihlmeyer <robbe@orcus.priv.at> |
90dcf2376909
Last minute notice fixups.
Stephen J. Turnbull <stephen@xemacs.org>
parents:
5402
diff
changeset
|
4 |
398 | 5 This file is part of XEmacs. |
6 | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
2367
diff
changeset
|
7 XEmacs is free software: you can redistribute it and/or modify it |
398 | 8 under the terms of the GNU General Public License as published by the |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
2367
diff
changeset
|
9 Free Software Foundation, either version 3 of the License, or (at your |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
2367
diff
changeset
|
10 option) any later version. |
398 | 11 |
12 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
13 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
15 for more details. | |
16 | |
17 You should have received a copy of the GNU General Public License | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
2367
diff
changeset
|
18 along with XEmacs. If not, see <http://www.gnu.org/licenses/>. */ |
398 | 19 |
20 /* Synched up with: Not in FSF. */ | |
21 | |
563 | 22 /* This file Mule-ized by Ben Wing, 5-15-01. */ |
23 | |
398 | 24 #include <config.h> |
563 | 25 #include "lisp.h" |
398 | 26 |
27 #include "miscplay.h" | |
563 | 28 #include "sound.h" |
29 | |
30 #include "sysfile.h" | |
398 | 31 |
32 #include <esd.h> | |
33 | |
34 | |
35 /* the name given to ESD - I think this should identify ourselves */ | |
36 #define ESD_NAME "xemacs" | |
37 | |
563 | 38 int esd_play_sound_file (Extbyte *file, int vol); |
609 | 39 int |
2286 | 40 esd_play_sound_file (Extbyte *file, int UNUSED (vol)) |
398 | 41 { /* #### FIXME: vol is ignored */ |
42 return esd_play_file(ESD_NAME, file, 0); | |
43 } | |
44 | |
2367 | 45 int esd_play_sound_data (Binbyte *data, size_t length, int vol); |
609 | 46 int |
2367 | 47 esd_play_sound_data (Binbyte *data, size_t length, int UNUSED (vol)) |
398 | 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 **); | |
51 fmtType ffmt; | |
52 int fmt,speed,tracks; | |
53 unsigned char *pptr,*optr,*cptr,*sptr; | |
1261 | 54 Bytecount wrtn, crtn; |
398 | 55 size_t prtn; |
56 int flags, sock; | |
57 | |
58 /* analyze_format needs at least this many bytes to work with */ | |
59 if (length < HEADERSZ) | |
60 return 0; | |
61 | |
62 ffmt = analyze_format(data,&fmt,&speed,&tracks,&parsesndfile); | |
63 | |
64 if (ffmt != fmtRaw && ffmt != fmtSunAudio && ffmt != fmtWave) { | |
564 | 65 sound_warn("Unsupported file format (neither RAW, nor Sun/DECAudio, nor WAVE)"); |
398 | 66 return 0; |
67 } | |
68 | |
69 /* convert header information into ESD flags */ | |
70 flags = ESD_STREAM|ESD_PLAY; | |
71 sndcnv = sndcnvnop; | |
72 switch (fmt) | |
73 { | |
74 case AFMT_MU_LAW: | |
75 sndcnv = sndcnvULaw_2linear; | |
76 flags |= ESD_BITS8; | |
77 break; | |
78 case AFMT_S8: | |
79 sndcnv = sndcnv2unsigned; /* ESD needs unsigned bytes */ | |
80 case AFMT_U8: | |
81 flags |= ESD_BITS8; | |
82 break; | |
83 case AFMT_S16_BE: | |
84 sndcnv = sndcnv16swap; /* ESD wants little endian */ | |
85 case AFMT_S16_LE: | |
86 flags |= ESD_BITS16; | |
87 break; | |
88 default: | |
564 | 89 { |
90 Extbyte warn_buf[255]; | |
91 sprintf (warn_buf, "byte format %d unimplemented", fmt); | |
92 sound_warn (warn_buf); | |
93 return 0; | |
94 } | |
398 | 95 } |
96 switch (tracks) | |
97 { | |
98 case 1: flags |= ESD_MONO; break; | |
99 case 2: flags |= ESD_STEREO; break; | |
100 default: | |
564 | 101 { |
102 Extbyte warn_buf[255]; | |
103 sprintf (warn_buf, "%d channels - only 1 or 2 supported", tracks); | |
104 sound_warn (warn_buf); | |
105 return 0; | |
106 } | |
398 | 107 } |
108 | |
109 sock = esd_play_stream(flags, speed, NULL, "xemacs"); | |
110 if (sock < 0) | |
111 return 0; | |
112 | |
113 reset_parsestate(); | |
114 | |
115 for (pptr = data; (prtn = parsesndfile((void **)&pptr,&length, | |
116 (void **)&optr)) > 0; ) | |
117 for (cptr = optr; (crtn = sndcnv((void **)&cptr,&prtn, | |
1261 | 118 (void **)&sptr)) > 0; ) |
119 { | |
120 if ((wrtn = write(sock,sptr,crtn)) < 0) | |
121 { | |
122 sound_perror ("write error"); | |
123 goto END_OF_PLAY; | |
124 } | |
125 if (wrtn != crtn) | |
126 { | |
127 Extbyte warn_buf[255]; | |
128 sprintf (warn_buf, "only wrote %ld of %ld bytes", wrtn, crtn); | |
129 sound_warn (warn_buf); | |
130 goto END_OF_PLAY; | |
131 } | |
398 | 132 } |
133 | |
134 if (ffmt == fmtWave) | |
135 parse_wave_complete(); | |
136 | |
137 END_OF_PLAY: | |
138 /* Now cleanup all used resources */ | |
139 | |
140 close(sock); | |
141 return 1; | |
142 } |