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 --- |