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