alsaaudio.c (0f98c9945899c5dfacd5a410ff04178eda605a16) alsaaudio.c (85bc58520c0e43660cbbe51b9eb5022a0baafe9f)
1/*
2 * QEMU ALSA audio driver
3 *
4 * Copyright (c) 2005 Vassili Karpov (malc)
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 73 unchanged lines hidden (view full) ---

82 int size_in_usec;
83 int override_mask;
84 unsigned int buffer_size;
85 unsigned int period_size;
86};
87
88struct alsa_params_obt {
89 int freq;
1/*
2 * QEMU ALSA audio driver
3 *
4 * Copyright (c) 2005 Vassili Karpov (malc)
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to deal
8 * in the Software without restriction, including without limitation the rights

--- 73 unchanged lines hidden (view full) ---

82 int size_in_usec;
83 int override_mask;
84 unsigned int buffer_size;
85 unsigned int period_size;
86};
87
88struct alsa_params_obt {
89 int freq;
90 audfmt_e fmt;
90 AudioFormat fmt;
91 int endianness;
92 int nchannels;
93 snd_pcm_uframes_t samples;
94};
95
96static void GCC_FMT_ATTR (2, 3) alsa_logerr (int err, const char *fmt, ...)
97{
98 va_list ap;

--- 190 unchanged lines hidden (view full) ---

289 return alsa_poll_helper (alsa->handle, &alsa->pollhlp, POLLIN);
290}
291
292static int alsa_write (SWVoiceOut *sw, void *buf, int len)
293{
294 return audio_pcm_sw_write (sw, buf, len);
295}
296
91 int endianness;
92 int nchannels;
93 snd_pcm_uframes_t samples;
94};
95
96static void GCC_FMT_ATTR (2, 3) alsa_logerr (int err, const char *fmt, ...)
97{
98 va_list ap;

--- 190 unchanged lines hidden (view full) ---

289 return alsa_poll_helper (alsa->handle, &alsa->pollhlp, POLLIN);
290}
291
292static int alsa_write (SWVoiceOut *sw, void *buf, int len)
293{
294 return audio_pcm_sw_write (sw, buf, len);
295}
296
297static snd_pcm_format_t aud_to_alsafmt (audfmt_e fmt, int endianness)
297static snd_pcm_format_t aud_to_alsafmt (AudioFormat fmt, int endianness)
298{
299 switch (fmt) {
298{
299 switch (fmt) {
300 case AUD_FMT_S8:
300 case AUDIO_FORMAT_S8:
301 return SND_PCM_FORMAT_S8;
302
301 return SND_PCM_FORMAT_S8;
302
303 case AUD_FMT_U8:
303 case AUDIO_FORMAT_U8:
304 return SND_PCM_FORMAT_U8;
305
304 return SND_PCM_FORMAT_U8;
305
306 case AUD_FMT_S16:
306 case AUDIO_FORMAT_S16:
307 if (endianness) {
308 return SND_PCM_FORMAT_S16_BE;
309 }
310 else {
311 return SND_PCM_FORMAT_S16_LE;
312 }
313
307 if (endianness) {
308 return SND_PCM_FORMAT_S16_BE;
309 }
310 else {
311 return SND_PCM_FORMAT_S16_LE;
312 }
313
314 case AUD_FMT_U16:
314 case AUDIO_FORMAT_U16:
315 if (endianness) {
316 return SND_PCM_FORMAT_U16_BE;
317 }
318 else {
319 return SND_PCM_FORMAT_U16_LE;
320 }
321
315 if (endianness) {
316 return SND_PCM_FORMAT_U16_BE;
317 }
318 else {
319 return SND_PCM_FORMAT_U16_LE;
320 }
321
322 case AUD_FMT_S32:
322 case AUDIO_FORMAT_S32:
323 if (endianness) {
324 return SND_PCM_FORMAT_S32_BE;
325 }
326 else {
327 return SND_PCM_FORMAT_S32_LE;
328 }
329
323 if (endianness) {
324 return SND_PCM_FORMAT_S32_BE;
325 }
326 else {
327 return SND_PCM_FORMAT_S32_LE;
328 }
329
330 case AUD_FMT_U32:
330 case AUDIO_FORMAT_U32:
331 if (endianness) {
332 return SND_PCM_FORMAT_U32_BE;
333 }
334 else {
335 return SND_PCM_FORMAT_U32_LE;
336 }
337
338 default:
339 dolog ("Internal logic error: Bad audio format %d\n", fmt);
340#ifdef DEBUG_AUDIO
341 abort ();
342#endif
343 return SND_PCM_FORMAT_U8;
344 }
345}
346
331 if (endianness) {
332 return SND_PCM_FORMAT_U32_BE;
333 }
334 else {
335 return SND_PCM_FORMAT_U32_LE;
336 }
337
338 default:
339 dolog ("Internal logic error: Bad audio format %d\n", fmt);
340#ifdef DEBUG_AUDIO
341 abort ();
342#endif
343 return SND_PCM_FORMAT_U8;
344 }
345}
346
347static int alsa_to_audfmt (snd_pcm_format_t alsafmt, audfmt_e *fmt,
347static int alsa_to_audfmt (snd_pcm_format_t alsafmt, AudioFormat *fmt,
348 int *endianness)
349{
350 switch (alsafmt) {
351 case SND_PCM_FORMAT_S8:
352 *endianness = 0;
348 int *endianness)
349{
350 switch (alsafmt) {
351 case SND_PCM_FORMAT_S8:
352 *endianness = 0;
353 *fmt = AUD_FMT_S8;
353 *fmt = AUDIO_FORMAT_S8;
354 break;
355
356 case SND_PCM_FORMAT_U8:
357 *endianness = 0;
354 break;
355
356 case SND_PCM_FORMAT_U8:
357 *endianness = 0;
358 *fmt = AUD_FMT_U8;
358 *fmt = AUDIO_FORMAT_U8;
359 break;
360
361 case SND_PCM_FORMAT_S16_LE:
362 *endianness = 0;
359 break;
360
361 case SND_PCM_FORMAT_S16_LE:
362 *endianness = 0;
363 *fmt = AUD_FMT_S16;
363 *fmt = AUDIO_FORMAT_S16;
364 break;
365
366 case SND_PCM_FORMAT_U16_LE:
367 *endianness = 0;
364 break;
365
366 case SND_PCM_FORMAT_U16_LE:
367 *endianness = 0;
368 *fmt = AUD_FMT_U16;
368 *fmt = AUDIO_FORMAT_U16;
369 break;
370
371 case SND_PCM_FORMAT_S16_BE:
372 *endianness = 1;
369 break;
370
371 case SND_PCM_FORMAT_S16_BE:
372 *endianness = 1;
373 *fmt = AUD_FMT_S16;
373 *fmt = AUDIO_FORMAT_S16;
374 break;
375
376 case SND_PCM_FORMAT_U16_BE:
377 *endianness = 1;
374 break;
375
376 case SND_PCM_FORMAT_U16_BE:
377 *endianness = 1;
378 *fmt = AUD_FMT_U16;
378 *fmt = AUDIO_FORMAT_U16;
379 break;
380
381 case SND_PCM_FORMAT_S32_LE:
382 *endianness = 0;
379 break;
380
381 case SND_PCM_FORMAT_S32_LE:
382 *endianness = 0;
383 *fmt = AUD_FMT_S32;
383 *fmt = AUDIO_FORMAT_S32;
384 break;
385
386 case SND_PCM_FORMAT_U32_LE:
387 *endianness = 0;
384 break;
385
386 case SND_PCM_FORMAT_U32_LE:
387 *endianness = 0;
388 *fmt = AUD_FMT_U32;
388 *fmt = AUDIO_FORMAT_U32;
389 break;
390
391 case SND_PCM_FORMAT_S32_BE:
392 *endianness = 1;
389 break;
390
391 case SND_PCM_FORMAT_S32_BE:
392 *endianness = 1;
393 *fmt = AUD_FMT_S32;
393 *fmt = AUDIO_FORMAT_S32;
394 break;
395
396 case SND_PCM_FORMAT_U32_BE:
397 *endianness = 1;
394 break;
395
396 case SND_PCM_FORMAT_U32_BE:
397 *endianness = 1;
398 *fmt = AUD_FMT_U32;
398 *fmt = AUDIO_FORMAT_U32;
399 break;
400
401 default:
402 dolog ("Unrecognized audio format %d\n", alsafmt);
403 return -1;
404 }
405
406 return 0;

--- 226 unchanged lines hidden (view full) ---

633
634 if (!in && conf->threshold) {
635 snd_pcm_uframes_t threshold;
636 int bytes_per_sec;
637
638 bytes_per_sec = freq << (nchannels == 2);
639
640 switch (obt->fmt) {
399 break;
400
401 default:
402 dolog ("Unrecognized audio format %d\n", alsafmt);
403 return -1;
404 }
405
406 return 0;

--- 226 unchanged lines hidden (view full) ---

633
634 if (!in && conf->threshold) {
635 snd_pcm_uframes_t threshold;
636 int bytes_per_sec;
637
638 bytes_per_sec = freq << (nchannels == 2);
639
640 switch (obt->fmt) {
641 case AUD_FMT_S8:
642 case AUD_FMT_U8:
641 case AUDIO_FORMAT_S8:
642 case AUDIO_FORMAT_U8:
643 break;
644
643 break;
644
645 case AUD_FMT_S16:
646 case AUD_FMT_U16:
645 case AUDIO_FORMAT_S16:
646 case AUDIO_FORMAT_U16:
647 bytes_per_sec <<= 1;
648 break;
649
647 bytes_per_sec <<= 1;
648 break;
649
650 case AUD_FMT_S32:
651 case AUD_FMT_U32:
650 case AUDIO_FORMAT_S32:
651 case AUDIO_FORMAT_U32:
652 bytes_per_sec <<= 2;
653 break;
652 bytes_per_sec <<= 2;
653 break;
654
655 default:
656 abort();
654 }
655
656 threshold = (conf->threshold * bytes_per_sec) / 1000;
657 alsa_set_threshold (handle, threshold);
658 }
659
660 obt->nchannels = nchannels;
661 obt->freq = freq;

--- 571 unchanged lines hidden ---
657 }
658
659 threshold = (conf->threshold * bytes_per_sec) / 1000;
660 alsa_set_threshold (handle, threshold);
661 }
662
663 obt->nchannels = nchannels;
664 obt->freq = freq;

--- 571 unchanged lines hidden ---