Mercurial > mplayer.hg
comparison libao2/ao_alsa1x.c @ 1128:d2dd25dd11bc
Hacked it working, still needs fixings!
author | atmosfear |
---|---|
date | Thu, 14 Jun 2001 18:00:13 +0000 |
parents | a16b569f2702 |
children | 705fa4ac4fed |
comparison
equal
deleted
inserted
replaced
1127:ca1bc9edf735 | 1128:d2dd25dd11bc |
---|---|
39 static snd_pcm_hw_params_t *alsa_hwparams; | 39 static snd_pcm_hw_params_t *alsa_hwparams; |
40 static snd_pcm_sw_params_t *alsa_swparams; | 40 static snd_pcm_sw_params_t *alsa_swparams; |
41 static char *alsa_device; | 41 static char *alsa_device; |
42 #define ALSA_DEVICE_SIZE 48 | 42 #define ALSA_DEVICE_SIZE 48 |
43 | 43 |
44 static int alsa_fragsize = 8192; /* 4096 */ | |
45 static int alsa_fragcount = 8; | |
46 | |
44 /* to set/get/query special features/parameters */ | 47 /* to set/get/query special features/parameters */ |
45 static int control(int cmd, int arg) | 48 static int control(int cmd, int arg) |
46 { | 49 { |
47 switch(cmd) | 50 switch(cmd) |
48 { | 51 { |
53 break; | 56 break; |
54 } | 57 } |
55 return(CONTROL_UNKNOWN); | 58 return(CONTROL_UNKNOWN); |
56 } | 59 } |
57 | 60 |
58 #define start | 61 #undef start |
62 #define buffersize | |
63 #undef buffertime | |
64 #define set_period | |
65 #undef sw_params | |
66 #undef set_start_mode | |
67 | |
59 /* | 68 /* |
60 open & setup audio device | 69 open & setup audio device |
61 return: 1=success 0=fail | 70 return: 1=success 0=fail |
62 */ | 71 */ |
63 static int init(int rate_hz, int channels, int format, int flags) | 72 static int init(int rate_hz, int channels, int format, int flags) |
79 { | 88 { |
80 printf("alsa-init: no soundcards found: %s\n", snd_strerror(err)); | 89 printf("alsa-init: no soundcards found: %s\n", snd_strerror(err)); |
81 return(0); | 90 return(0); |
82 } | 91 } |
83 | 92 |
93 ao_samplerate = rate_hz; | |
94 ao_bps = channels; /* really this is bytes per frame so bad varname */ | |
84 ao_format = format; | 95 ao_format = format; |
85 ao_channels = channels - 1; | 96 ao_channels = channels; |
86 ao_samplerate = rate_hz; | |
87 ao_bps = ao_samplerate*(ao_channels+1); | |
88 ao_outburst = OUTBURST; | 97 ao_outburst = OUTBURST; |
89 ao_buffersize = 16384; | 98 ao_buffersize = 16384; |
90 | 99 |
91 switch (format) | 100 switch (format) |
92 { | 101 { |
124 audio_out_format_name(format)); | 133 audio_out_format_name(format)); |
125 return(0); | 134 return(0); |
126 default: | 135 default: |
127 break; | 136 break; |
128 } | 137 } |
129 | 138 |
130 if ((err = snd_pcm_info_malloc(&alsa_info)) < 0) | 139 if ((err = snd_pcm_info_malloc(&alsa_info)) < 0) |
131 { | 140 { |
132 printf("alsa-init: memory allocation error: %s\n", snd_strerror(err)); | 141 printf("alsa-init: memory allocation error: %s\n", snd_strerror(err)); |
133 return(0); | 142 return(0); |
134 } | 143 } |
187 printf("alsa-init: unable to set channels: %s\n", | 196 printf("alsa-init: unable to set channels: %s\n", |
188 snd_strerror(err)); | 197 snd_strerror(err)); |
189 return(0); | 198 return(0); |
190 } | 199 } |
191 | 200 |
192 if ((err = snd_pcm_hw_params_set_rate(alsa_handler, alsa_hwparams, | 201 if ((err = snd_pcm_hw_params_set_rate_near(alsa_handler, alsa_hwparams, |
193 ao_samplerate, 0)) < 0) | 202 ao_samplerate, 0)) < 0) |
194 { | 203 { |
195 printf("alsa-init: unable to set channels: %s\n", | 204 printf("alsa-init: unable to set samplerate: %s\n", |
196 snd_strerror(err)); | 205 snd_strerror(err)); |
197 return(0); | 206 return(0); |
198 } | 207 } |
199 | 208 |
200 { | 209 #ifdef set_period |
201 int fragment_size = 4096; | 210 { |
202 int fragment_count = 8; | 211 if ((err = snd_pcm_hw_params_set_period_size(alsa_handler, alsa_hwparams, alsa_fragsize / 4, 0)) < 0) |
203 snd_pcm_hw_params_set_period_size(alsa_handler, alsa_hwparams, fragment_size / 4, 0); | 212 { |
204 snd_pcm_hw_params_set_periods(alsa_handler, alsa_hwparams, fragment_count, 0); | 213 printf("alsa-init: unable to set periodsize: %s\n", |
205 } | 214 snd_strerror(err)); |
206 | 215 return(0); |
216 } | |
217 if ((err = snd_pcm_hw_params_set_periods(alsa_handler, alsa_hwparams, alsa_fragcount, 0)) < 0) | |
218 { | |
219 printf("alsa-init: unable to set periods: %s\n", | |
220 snd_strerror(err)); | |
221 return(0); | |
222 } | |
223 } | |
224 #endif | |
207 #ifdef buffersize | 225 #ifdef buffersize |
208 if ((err = snd_pcm_hw_params_get_buffer_size(alsa_hwparams)) < 0) | 226 if ((err = snd_pcm_hw_params_get_buffer_size(alsa_hwparams)) < 0) |
209 { | 227 { |
210 printf("alsa-init: unable to get buffer size: %s\n", | 228 printf("alsa-init: unable to get buffer size: %s\n", |
211 snd_strerror(err)); | 229 snd_strerror(err)); |
212 return(0); | 230 return(0); |
213 } else | 231 } else |
232 { | |
233 printf("alsa-init: got buffersize %i\n", err); | |
214 ao_buffersize = err; | 234 ao_buffersize = err; |
235 } | |
215 #endif | 236 #endif |
216 | 237 |
217 #ifdef buffertime | 238 #ifdef buffertime |
218 { | 239 { |
219 int alsa_buffer_time = 60; | 240 int alsa_buffer_time = 60; |
232 { | 253 { |
233 printf("alsa-init: unable to set period time: %s\n", | 254 printf("alsa-init: unable to set period time: %s\n", |
234 snd_strerror(err)); | 255 snd_strerror(err)); |
235 return(0); | 256 return(0); |
236 } | 257 } |
258 printf("alsa-init: buffer_time: %d, period_time :%d\n", | |
259 alsa_buffer_time, err); | |
237 } | 260 } |
238 #endif | 261 #endif |
239 | 262 |
240 if ((err = snd_pcm_hw_params(alsa_handler, alsa_hwparams)) < 0) | 263 if ((err = snd_pcm_hw_params(alsa_handler, alsa_hwparams)) < 0) |
241 { | 264 { |
242 printf("alsa-init: unable to set parameters: %s\n", | 265 printf("alsa-init: unable to set parameters: %s\n", |
243 snd_strerror(err)); | 266 snd_strerror(err)); |
244 return(0); | 267 return(0); |
245 } | 268 } |
246 | 269 |
270 #ifdef sw_params | |
247 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0) | 271 if ((err = snd_pcm_sw_params_current(alsa_handler, alsa_swparams)) < 0) |
248 { | 272 { |
249 printf("alsa-init: unable to get parameters: %s\n", | 273 printf("alsa-init: unable to get parameters: %s\n", |
250 snd_strerror(err)); | 274 snd_strerror(err)); |
251 return(0); | 275 return(0); |
252 } | 276 } |
253 | 277 |
278 #ifdef set_start_mode | |
254 if ((err = snd_pcm_sw_params_set_start_mode(alsa_handler, alsa_swparams, | 279 if ((err = snd_pcm_sw_params_set_start_mode(alsa_handler, alsa_swparams, |
255 SND_PCM_START_DATA)) < 0) | 280 SND_PCM_START_DATA)) < 0) |
256 { | 281 { |
257 printf("alsa-init: unable to set start mode: %s\n", | 282 printf("alsa-init: unable to set start mode: %s\n", |
258 snd_strerror(err)); | 283 snd_strerror(err)); |
259 return(0); | 284 return(0); |
260 } | 285 } |
286 #endif | |
261 | 287 |
262 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0) | 288 if ((err = snd_pcm_sw_params(alsa_handler, alsa_swparams)) < 0) |
263 { | 289 { |
264 printf("alsa-init: unable to set parameters: %s\n", | 290 printf("alsa-init: unable to set parameters: %s\n", |
265 snd_strerror(err)); | 291 snd_strerror(err)); |
266 return(0); | 292 return(0); |
267 } | 293 } |
268 | 294 |
269 snd_pcm_sw_params_default(alsa_handler, alsa_swparams); | 295 // snd_pcm_sw_params_default(alsa_handler, alsa_swparams); |
270 | 296 #endif |
271 if ((err = snd_pcm_prepare(alsa_handler)) < 0) | 297 if ((err = snd_pcm_prepare(alsa_handler)) < 0) |
272 { | 298 { |
273 printf("alsa-init: pcm prepare error: %s\n", snd_strerror(err)); | 299 printf("alsa-init: pcm prepare error: %s\n", snd_strerror(err)); |
274 return(0); | 300 return(0); |
275 } | 301 } |
285 printf("alsa-init: pcm start error: %s\n", snd_strerror(err)); | 311 printf("alsa-init: pcm start error: %s\n", snd_strerror(err)); |
286 return(0); | 312 return(0); |
287 } | 313 } |
288 } | 314 } |
289 #endif | 315 #endif |
290 printf("AUDIO: %d Hz/%d channels/%d bps/%d bytes buffer/%s\n", | 316 printf("AUDIO: %d Hz/%d channels/%d bpf/%d bytes buffer/%s\n", |
291 ao_samplerate, ao_channels+1, ao_bps, ao_buffersize, | 317 ao_samplerate, ao_channels, ao_bps, ao_buffersize, |
292 snd_pcm_format_description(alsa_format)); | 318 snd_pcm_format_description(alsa_format)); |
293 return(1); | 319 return(1); |
294 } | 320 } |
295 | 321 |
296 /* close audio device */ | 322 /* close audio device */ |
393 */ | 419 */ |
394 static int play(void* data, int len, int flags) | 420 static int play(void* data, int len, int flags) |
395 { | 421 { |
396 int got_len; | 422 int got_len; |
397 | 423 |
398 if ((got_len = snd_pcm_writei(alsa_handler, data, len/4)) != len/4) | 424 if ((got_len = snd_pcm_writei(alsa_handler, data, (len/ao_bps))) != (len/ao_bps)) |
399 { | 425 { |
400 if (got_len == -EPIPE) /* underrun? */ | 426 if (got_len == -EPIPE) /* underrun? */ |
401 { | 427 { |
402 printf("alsa-play: alsa underrun, resetting stream\n"); | 428 printf("alsa-play: alsa underrun, resetting stream\n"); |
403 if ((len = snd_pcm_prepare(alsa_handler)) < 0) | 429 if ((got_len = snd_pcm_prepare(alsa_handler)) < 0) |
404 { | 430 { |
405 printf("alsa-play: playback prepare error: %s\n", snd_strerror(len)); | 431 printf("alsa-play: playback prepare error: %s\n", snd_strerror(got_len)); |
406 return(0); | 432 return(0); |
407 } | 433 } |
408 if ((len = snd_pcm_writei(alsa_handler, data, len)) != len) | 434 if ((got_len = snd_pcm_writei(alsa_handler, data, (len/ao_bps))) != (len/ao_bps)) |
409 { | 435 { |
410 printf("alsa-play: write error after reset: %s - giving up\n", | 436 printf("alsa-play: write error after reset: %s - giving up\n", |
411 snd_strerror(len)); | 437 snd_strerror(got_len)); |
412 return(0); | 438 return(0); |
413 } | 439 } |
414 return(len); /* 2nd write was ok */ | 440 return(len); /* 2nd write was ok */ |
415 } | 441 } |
416 printf("alsa-play: output error: %s\n", snd_strerror(len)); | |
417 } | 442 } |
418 return(len); | 443 return(len); |
419 } | 444 } |
420 | 445 |
421 /* how many byes are free in the buffer */ | 446 /* how many byes are free in the buffer */ |
481 } | 506 } |
482 | 507 |
483 snd_pcm_status_free(status); | 508 snd_pcm_status_free(status); |
484 return(ret); | 509 return(ret); |
485 } | 510 } |
511 |