Mercurial > hg > xemacs-beta
comparison src/sunplay.c @ 185:3d6bfa290dbd r20-3b19
Import from CVS: tag r20-3b19
author | cvs |
---|---|
date | Mon, 13 Aug 2007 09:55:28 +0200 |
parents | e121b013d1f0 |
children | c5d627a313b1 |
comparison
equal
deleted
inserted
replaced
184:bcd2674570bf | 185:3d6bfa290dbd |
---|---|
59 # define warn(str) message ("audio: %s ", GETTEXT (str)) | 59 # define warn(str) message ("audio: %s ", GETTEXT (str)) |
60 #else /* !emacs */ | 60 #else /* !emacs */ |
61 # define warn(str) fprintf (stderr, "%s\n", (str)) | 61 # define warn(str) fprintf (stderr, "%s\n", (str)) |
62 #endif /* emacs */ | 62 #endif /* emacs */ |
63 | 63 |
64 static SIGTYPE (*sighup_handler) (); | 64 static SIGTYPE (*sighup_handler) (int sig); |
65 static SIGTYPE (*sigint_handler) (); | 65 static SIGTYPE (*sigint_handler) (int sig); |
66 static SIGTYPE sighandler (int sig); | 66 static SIGTYPE sighandler (int sig); |
67 | 67 |
68 static int audio_fd; | 68 static int audio_fd; |
69 | 69 |
70 #define audio_open() open ("/dev/audio", (O_WRONLY | O_NDELAY), 0) | 70 #define audio_open() open ("/dev/audio", (O_WRONLY | O_NDELAY), 0) |
83 #ifdef SUNOS4_0_3 | 83 #ifdef SUNOS4_0_3 |
84 if (header_length) *header_length = 0; | 84 if (header_length) *header_length = 0; |
85 return 0; | 85 return 0; |
86 #else | 86 #else |
87 Audio_hdr file_hdr; | 87 Audio_hdr file_hdr; |
88 | 88 |
89 reset_volume_p = 0; | 89 reset_volume_p = 0; |
90 reset_device_p = 0; | 90 reset_device_p = 0; |
91 | 91 |
92 if (data && fd) abort (); /* one or the other */ | 92 if (data && fd) abort (); /* one or the other */ |
93 | 93 |
94 if (AUDIO_SUCCESS != audio_get_play_config (audio_fd, &dev_hdr)) | 94 if (AUDIO_SUCCESS != audio_get_play_config (audio_fd, &dev_hdr)) |
95 { | 95 { |
96 perror ("Not a valid audio device"); | 96 perror ("Not a valid audio device"); |
97 return 1; | 97 return 1; |
98 } | 98 } |
99 | 99 |
100 if (AUDIO_SUCCESS != (data | 100 if (AUDIO_SUCCESS != (data |
101 ? audio_decode_filehdr (data, &file_hdr, header_length) | 101 ? audio_decode_filehdr (data, &file_hdr, header_length) |
102 : audio_read_filehdr (fd, &file_hdr, 0, 0))) | 102 : audio_read_filehdr (fd, &file_hdr, 0, 0))) |
103 { | 103 { |
104 if (data) | 104 if (data) |
105 perror ("invalid audio data"); | 105 perror ("invalid audio data"); |
106 else | 106 else |
107 perror ("invalid audio file"); | 107 perror ("invalid audio file"); |
108 return 1; | 108 return 1; |
109 } | 109 } |
110 | 110 |
111 audio_flush_play (audio_fd); | 111 audio_flush_play (audio_fd); |
112 | 112 |
113 if (0 != audio_cmp_hdr (&dev_hdr, &file_hdr)) | 113 if (0 != audio_cmp_hdr (&dev_hdr, &file_hdr)) |
114 { | 114 { |
115 Audio_hdr new_hdr; | 115 Audio_hdr new_hdr; |
164 play_sound_file (char *sound_file, int volume) | 164 play_sound_file (char *sound_file, int volume) |
165 { | 165 { |
166 int rrtn, wrtn; | 166 int rrtn, wrtn; |
167 unsigned char buf [255]; | 167 unsigned char buf [255]; |
168 int file_fd; | 168 int file_fd; |
169 | 169 |
170 audio_fd = audio_open (); | 170 audio_fd = audio_open (); |
171 | 171 |
172 if (audio_fd < 0) | 172 if (audio_fd < 0) |
173 { | 173 { |
174 perror ("open /dev/audio"); | 174 perror ("open /dev/audio"); |
176 } | 176 } |
177 | 177 |
178 /* where to find the proto for signal()... */ | 178 /* where to find the proto for signal()... */ |
179 sighup_handler = (SIGTYPE (*) (int)) signal (SIGHUP, sighandler); | 179 sighup_handler = (SIGTYPE (*) (int)) signal (SIGHUP, sighandler); |
180 sigint_handler = (SIGTYPE (*) (int)) signal (SIGINT, sighandler); | 180 sigint_handler = (SIGTYPE (*) (int)) signal (SIGINT, sighandler); |
181 | 181 |
182 file_fd = open (sound_file, O_RDONLY, 0); | 182 file_fd = open (sound_file, O_RDONLY, 0); |
183 if (file_fd < 0) | 183 if (file_fd < 0) |
184 { | 184 { |
185 perror (sound_file); | 185 perror (sound_file); |
186 goto END_OF_PLAY; | 186 goto END_OF_PLAY; |
187 } | 187 } |
188 | 188 |
189 if (init_device (volume, (unsigned char *) 0, file_fd, (unsigned int *) 0)) | 189 if (init_device (volume, (unsigned char *) 0, file_fd, (unsigned int *) 0)) |
190 goto END_OF_PLAY; | 190 goto END_OF_PLAY; |
191 | 191 |
192 while (1) | 192 while (1) |
193 { | 193 { |
194 rrtn = read (file_fd, (char *) buf, sizeof (buf)); | 194 rrtn = read (file_fd, (char *) buf, sizeof (buf)); |
195 if (rrtn < 0) | 195 if (rrtn < 0) |
196 { | 196 { |
197 perror ("read"); | 197 perror ("read"); |
198 goto END_OF_PLAY; | 198 goto END_OF_PLAY; |
199 } | 199 } |
200 if (rrtn == 0) | 200 if (rrtn == 0) |
201 break; | 201 break; |
202 | 202 |
203 while (1) | 203 while (1) |
204 { | 204 { |
205 wrtn = write (audio_fd, (char *) buf, rrtn); | 205 wrtn = write (audio_fd, (char *) buf, rrtn); |
206 if (wrtn < 0) | 206 if (wrtn < 0) |
207 { | 207 { |
220 sprintf (warn_buf, "play: rrtn = %d, wrtn = %d", rrtn, wrtn); | 220 sprintf (warn_buf, "play: rrtn = %d, wrtn = %d", rrtn, wrtn); |
221 warn (warn_buf); | 221 warn (warn_buf); |
222 goto END_OF_PLAY; | 222 goto END_OF_PLAY; |
223 } | 223 } |
224 } | 224 } |
225 | 225 |
226 END_OF_PLAY: | 226 END_OF_PLAY: |
227 | 227 |
228 if (file_fd > 0) | 228 if (file_fd > 0) |
229 close (file_fd); | 229 close (file_fd); |
230 | 230 |
269 } | 269 } |
270 | 270 |
271 /* where to find the proto for signal()... */ | 271 /* where to find the proto for signal()... */ |
272 sighup_handler = (SIGTYPE (*) (int)) signal (SIGHUP, sighandler); | 272 sighup_handler = (SIGTYPE (*) (int)) signal (SIGHUP, sighandler); |
273 sigint_handler = (SIGTYPE (*) (int)) signal (SIGINT, sighandler); | 273 sigint_handler = (SIGTYPE (*) (int)) signal (SIGINT, sighandler); |
274 | 274 |
275 if (init_device (volume, data, 0, &ilen)) | 275 if (init_device (volume, data, 0, &ilen)) |
276 goto END_OF_PLAY; | 276 goto END_OF_PLAY; |
277 | 277 |
278 data += (ilen<<2); | 278 data += (ilen<<2); |
279 length -= (ilen<<2); | 279 length -= (ilen<<2); |
280 if (length <= 1) | 280 if (length <= 1) |
281 goto END_OF_PLAY; | 281 goto END_OF_PLAY; |
282 | 282 |
283 while (1) | 283 while (1) |
284 { | 284 { |
285 wrtn = write (audio_fd, (char *) (data+start), length-start); | 285 wrtn = write (audio_fd, (char *) (data+start), length-start); |
286 if (wrtn < 0) | 286 if (wrtn < 0) |
287 { | 287 { |
301 char buf [255]; | 301 char buf [255]; |
302 sprintf (buf, "play: rrtn = %d, wrtn = %d", length, wrtn); | 302 sprintf (buf, "play: rrtn = %d, wrtn = %d", length, wrtn); |
303 warn (buf); | 303 warn (buf); |
304 goto END_OF_PLAY; | 304 goto END_OF_PLAY; |
305 } | 305 } |
306 | 306 |
307 END_OF_PLAY: | 307 END_OF_PLAY: |
308 | 308 |
309 if (audio_fd > 0) | 309 if (audio_fd > 0) |
310 { | 310 { |
311 reset_device (1); | 311 reset_device (1); |