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);