Mercurial > mplayer.hg
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 |