comparison libao2/ao_alsa9.c @ 3095:981a9e5118ce

interface to libao2 changed ao_plugin added
author anders
date Sat, 24 Nov 2001 05:21:22 +0000
parents a59f952fad34
children 6d965759dd01
comparison
equal deleted inserted replaced
3094:4150aff2ac17 3095:981a9e5118ce
30 "under developement" 30 "under developement"
31 }; 31 };
32 32
33 LIBAO_EXTERN(alsa9) 33 LIBAO_EXTERN(alsa9)
34 34
35 /* global variables:
36 ao_samplerate
37 ao_channels
38 ao_format
39 ao_bps
40 ao_outburst
41 ao_buffersize
42 */
43 35
44 static snd_pcm_t *alsa_handler; 36 static snd_pcm_t *alsa_handler;
45 static snd_pcm_format_t alsa_format; 37 static snd_pcm_format_t alsa_format;
46 static snd_pcm_hw_params_t *alsa_hwparams; 38 static snd_pcm_hw_params_t *alsa_hwparams;
47 static snd_pcm_sw_params_t *alsa_swparams; 39 static snd_pcm_sw_params_t *alsa_swparams;
65 { 57 {
66 int ret; 58 int ret;
67 59
68 strncpy(alsa_device, (char *)arg, ALSA_DEVICE_SIZE); 60 strncpy(alsa_device, (char *)arg, ALSA_DEVICE_SIZE);
69 uninit(); 61 uninit();
70 ret = init(ao_samplerate, ao_channels, ao_format, 0); 62 ret = init(ao_data.samplerate, ao_data.channels, ao_data.format, 0);
71 if (ret == 0) 63 if (ret == 0)
72 return(CONTROL_ERROR); 64 return(CONTROL_ERROR);
73 else 65 else
74 return(CONTROL_OK); 66 return(CONTROL_OK);
75 } 67 }
110 { 102 {
111 printf("alsa-init: no soundcards found: %s\n", snd_strerror(err)); 103 printf("alsa-init: no soundcards found: %s\n", snd_strerror(err));
112 return(0); 104 return(0);
113 } 105 }
114 106
115 ao_samplerate = rate_hz; 107 ao_data.samplerate = rate_hz;
116 ao_bps = channels; /* really this is bytes per frame so bad varname */ 108 ao_data.bps = channels; /* really this is bytes per frame so bad varname */
117 ao_format = format; 109 ao_data.format = format;
118 ao_channels = channels; 110 ao_data.channels = channels;
119 ao_outburst = OUTBURST; 111 ao_data.outburst = OUTBURST;
120 ao_buffersize = 16384; 112 ao_data.buffersize = 16384;
121 113
122 switch (format) 114 switch (format)
123 { 115 {
124 case AFMT_S8: 116 case AFMT_S8:
125 alsa_format = SND_PCM_FORMAT_S8; 117 alsa_format = SND_PCM_FORMAT_S8;
146 138
147 switch(alsa_format) 139 switch(alsa_format)
148 { 140 {
149 case SND_PCM_FORMAT_S16_LE: 141 case SND_PCM_FORMAT_S16_LE:
150 case SND_PCM_FORMAT_U16_LE: 142 case SND_PCM_FORMAT_U16_LE:
151 ao_bps *= 2; 143 ao_data.bps *= 2;
152 break; 144 break;
153 case -1: 145 case -1:
154 printf("alsa-init: invalid format (%s) requested - output disabled\n", 146 printf("alsa-init: invalid format (%s) requested - output disabled\n",
155 audio_out_format_name(format)); 147 audio_out_format_name(format));
156 return(0); 148 return(0);
162 { 154 {
163 printf("alsa-init: memory allocation error: %s\n", snd_strerror(err)); 155 printf("alsa-init: memory allocation error: %s\n", snd_strerror(err));
164 return(0); 156 return(0);
165 } 157 }
166 158
167 if (ao_subdevice != NULL) 159 if (ao_data.subdevice != NULL)
168 alsa_device = ao_subdevice; 160 alsa_device = ao_data.subdevice;
169 161
170 if (alsa_device == NULL) 162 if (alsa_device == NULL)
171 { 163 {
172 if ((alsa_device = malloc(ALSA_DEVICE_SIZE)) == NULL) 164 if ((alsa_device = malloc(ALSA_DEVICE_SIZE)) == NULL)
173 { 165 {
217 snd_strerror(err)); 209 snd_strerror(err));
218 return(0); 210 return(0);
219 } 211 }
220 212
221 if ((err = snd_pcm_hw_params_set_channels(alsa_handler, alsa_hwparams, 213 if ((err = snd_pcm_hw_params_set_channels(alsa_handler, alsa_hwparams,
222 ao_channels)) < 0) 214 ao_data.channels)) < 0)
223 { 215 {
224 printf("alsa-init: unable to set channels: %s\n", 216 printf("alsa-init: unable to set channels: %s\n",
225 snd_strerror(err)); 217 snd_strerror(err));
226 return(0); 218 return(0);
227 } 219 }
228 220
229 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams, ao_samplerate, 0)) < 0) 221 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams, ao_data.samplerate, 0)) < 0)
230 /* was originally only snd_pcm_hw_params_set_rate jp*/ 222 /* was originally only snd_pcm_hw_params_set_rate jp*/
231 { 223 {
232 printf("alsa-init: unable to set samplerate-2: %s\n", 224 printf("alsa-init: unable to set samplerate-2: %s\n",
233 snd_strerror(err)); 225 snd_strerror(err));
234 //snd_pcm_hw_params_dump(alsa_hwparams, errlog); jp 226 //snd_pcm_hw_params_dump(alsa_hwparams, errlog); jp
257 printf("alsa-init: unable to get buffer size: %s\n", 249 printf("alsa-init: unable to get buffer size: %s\n",
258 snd_strerror(err)); 250 snd_strerror(err));
259 return(0); 251 return(0);
260 } else 252 } else
261 { 253 {
262 ao_buffersize = err; 254 ao_data.buffersize = err;
263 if (verbose) 255 if (verbose)
264 printf("alsa-init: got buffersize %i\n", ao_buffersize); 256 printf("alsa-init: got buffersize %i\n", ao_data.buffersize);
265 } 257 }
266 #endif 258 #endif
267 259
268 #ifdef buffertime 260 #ifdef buffertime
269 { 261 {
276 return(0); 268 return(0);
277 } else 269 } else
278 alsa_buffer_time = err; 270 alsa_buffer_time = err;
279 271
280 if ((err = snd_pcm_hw_params_set_period_time_near(alsa_handler, alsa_hwparams, alsa_buffer_time/4, 0)) < 0) 272 if ((err = snd_pcm_hw_params_set_period_time_near(alsa_handler, alsa_hwparams, alsa_buffer_time/4, 0)) < 0)
281 /* original: alsa_buffer_time/ao_bps */ 273 /* original: alsa_buffer_time/ao_data.bps */
282 { 274 {
283 printf("alsa-init: unable to set period time: %s\n", 275 printf("alsa-init: unable to set period time: %s\n",
284 snd_strerror(err)); 276 snd_strerror(err));
285 return(0); 277 return(0);
286 } 278 }
297 } 289 }
298 290
299 #ifdef sw_params 291 #ifdef sw_params
300 { 292 {
301 chunk_size = snd_pcm_hw_params_get_period_size(alsa_hwparams, 0); 293 chunk_size = snd_pcm_hw_params_get_period_size(alsa_hwparams, 0);
302 start_threshold = (double) ao_samplerate * start_delay / 1000000; 294 start_threshold = (double) ao_data.samplerate * start_delay / 1000000;
303 xfer_align = snd_pcm_sw_params_get_xfer_align(alsa_swparams); 295 xfer_align = snd_pcm_sw_params_get_xfer_align(alsa_swparams);
304 296
305 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0) 297 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0)
306 { 298 {
307 printf("alsa-init: unable to get parameters: %s\n", 299 printf("alsa-init: unable to get parameters: %s\n",
367 return(0); 359 return(0);
368 } 360 }
369 } 361 }
370 #endif 362 #endif
371 printf("AUDIO: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n", 363 printf("AUDIO: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n",
372 ao_samplerate, ao_channels, ao_bps, ao_buffersize, 364 ao_data.samplerate, ao_data.channels, ao_data.bps, ao_data.buffersize,
373 snd_pcm_format_description(alsa_format)); 365 snd_pcm_format_description(alsa_format));
374 return(1); 366 return(1);
375 } 367 }
376 368
377 /* close audio device */ 369 /* close audio device */
486 { 478 {
487 int got_len; 479 int got_len;
488 480
489 got_len = snd_pcm_writei(alsa_handler, data, len / 4); 481 got_len = snd_pcm_writei(alsa_handler, data, len / 4);
490 482
491 //if ((got_len = snd_pcm_writei(alsa_handler, data, (len/ao_bps))) != (len/ao_bps)) { 483 //if ((got_len = snd_pcm_writei(alsa_handler, data, (len/ao_data.bps))) != (len/ao_data.bps)) {
492 //SHOULD BE FIXED 484 //SHOULD BE FIXED
493 if (got_len == -EPIPE) /* underrun? */ 485 if (got_len == -EPIPE) /* underrun? */
494 { 486 {
495 printf("alsa-play: alsa underrun, resetting stream\n"); 487 printf("alsa-play: alsa underrun, resetting stream\n");
496 if ((got_len = snd_pcm_prepare(alsa_handler)) < 0) 488 if ((got_len = snd_pcm_prepare(alsa_handler)) < 0)
497 { 489 {
498 printf("alsa-play: playback prepare error: %s\n", snd_strerror(got_len)); 490 printf("alsa-play: playback prepare error: %s\n", snd_strerror(got_len));
499 return(0); 491 return(0);
500 } 492 }
501 if ((got_len = snd_pcm_writei(alsa_handler, data, (len/ao_bps))) != (len/ao_bps)) 493 if ((got_len = snd_pcm_writei(alsa_handler, data, (len/ao_data.bps))) != (len/ao_data.bps))
502 { 494 {
503 printf("alsa-play: write error after reset: %s - giving up\n", 495 printf("alsa-play: write error after reset: %s - giving up\n",
504 snd_strerror(got_len)); 496 snd_strerror(got_len));
505 return(0); 497 return(0);
506 } 498 }
531 switch(snd_pcm_status_get_state(status)) 523 switch(snd_pcm_status_get_state(status))
532 { 524 {
533 case SND_PCM_STATE_OPEN: 525 case SND_PCM_STATE_OPEN:
534 case SND_PCM_STATE_PREPARED: 526 case SND_PCM_STATE_PREPARED:
535 case SND_PCM_STATE_RUNNING: 527 case SND_PCM_STATE_RUNNING:
536 ret = snd_pcm_status_get_avail(status) * ao_bps; 528 ret = snd_pcm_status_get_avail(status) * ao_data.bps;
537 break; 529 break;
538 default: 530 default:
539 ret = 0; 531 ret = 0;
540 } 532 }
541 533
544 if (ret < 0) 536 if (ret < 0)
545 ret = 0; 537 ret = 0;
546 return(ret); 538 return(ret);
547 } 539 }
548 540
549 /* how many unplayed bytes are in the buffer */ 541 /* delay in seconds between first and last sample in buffer */
550 static int get_delay() 542 static float get_delay()
551 { 543 {
552 snd_pcm_status_t *status; 544 snd_pcm_status_t *status;
553 int ret; 545 float ret;
554 546
555 if ((ret = snd_pcm_status_malloc(&status)) < 0) 547 if ((ret = snd_pcm_status_malloc(&status)) < 0)
556 { 548 {
557 printf("alsa-delay: memory allocation error: %s\n", snd_strerror(ret)); 549 printf("alsa-delay: memory allocation error: %s\n", snd_strerror(ret));
558 return(0); 550 return(0);
567 switch(snd_pcm_status_get_state(status)) 559 switch(snd_pcm_status_get_state(status))
568 { 560 {
569 case SND_PCM_STATE_OPEN: 561 case SND_PCM_STATE_OPEN:
570 case SND_PCM_STATE_PREPARED: 562 case SND_PCM_STATE_PREPARED:
571 case SND_PCM_STATE_RUNNING: 563 case SND_PCM_STATE_RUNNING:
572 ret = snd_pcm_status_get_delay(status) * ao_bps; 564 ret = (float)snd_pcm_status_get_delay(status)/(float)ao_data.samplerate;
573 break; 565 break;
574 default: 566 default:
575 ret = 0; 567 ret = 0;
576 } 568 }
577 569