audio.c (21ee7686d7b63c3e58a7ccab33315a8c543c7171) | audio.c (85bc58520c0e43660cbbe51b9eb5022a0baafe9f) |
---|---|
1/* 2 * QEMU Audio subsystem 3 * 4 * Copyright (c) 2003-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 --- 99 unchanged lines hidden (view full) --- 108} conf = { 109 .fixed_out = { /* DAC fixed settings */ 110 .enabled = 1, 111 .nb_voices = 1, 112 .greedy = 1, 113 .settings = { 114 .freq = 44100, 115 .nchannels = 2, | 1/* 2 * QEMU Audio subsystem 3 * 4 * Copyright (c) 2003-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 --- 99 unchanged lines hidden (view full) --- 108} conf = { 109 .fixed_out = { /* DAC fixed settings */ 110 .enabled = 1, 111 .nb_voices = 1, 112 .greedy = 1, 113 .settings = { 114 .freq = 44100, 115 .nchannels = 2, |
116 .fmt = AUD_FMT_S16, | 116 .fmt = AUDIO_FORMAT_S16, |
117 .endianness = AUDIO_HOST_ENDIANNESS, 118 } 119 }, 120 121 .fixed_in = { /* ADC fixed settings */ 122 .enabled = 1, 123 .nb_voices = 1, 124 .greedy = 1, 125 .settings = { 126 .freq = 44100, 127 .nchannels = 2, | 117 .endianness = AUDIO_HOST_ENDIANNESS, 118 } 119 }, 120 121 .fixed_in = { /* ADC fixed settings */ 122 .enabled = 1, 123 .nb_voices = 1, 124 .greedy = 1, 125 .settings = { 126 .freq = 44100, 127 .nchannels = 2, |
128 .fmt = AUD_FMT_S16, | 128 .fmt = AUDIO_FORMAT_S16, |
129 .endianness = AUDIO_HOST_ENDIANNESS, 130 } 131 }, 132 133 .period = { .hertz = 100 }, 134 .try_poll_in = 1, 135 .try_poll_out = 1, 136}; --- 115 unchanged lines hidden (view full) --- 252 253 for (i = 0; i < len; ++i) { 254 u[i] = qemu_toupper(u[i]); 255 } 256 257 return r; 258} 259 | 129 .endianness = AUDIO_HOST_ENDIANNESS, 130 } 131 }, 132 133 .period = { .hertz = 100 }, 134 .try_poll_in = 1, 135 .try_poll_out = 1, 136}; --- 115 unchanged lines hidden (view full) --- 252 253 for (i = 0; i < len; ++i) { 254 u[i] = qemu_toupper(u[i]); 255 } 256 257 return r; 258} 259 |
260static const char *audio_audfmt_to_string (audfmt_e fmt) | 260static const char *audio_audfmt_to_string (AudioFormat fmt) |
261{ 262 switch (fmt) { | 261{ 262 switch (fmt) { |
263 case AUD_FMT_U8: | 263 case AUDIO_FORMAT_U8: |
264 return "U8"; 265 | 264 return "U8"; 265 |
266 case AUD_FMT_U16: | 266 case AUDIO_FORMAT_U16: |
267 return "U16"; 268 | 267 return "U16"; 268 |
269 case AUD_FMT_S8: | 269 case AUDIO_FORMAT_S8: |
270 return "S8"; 271 | 270 return "S8"; 271 |
272 case AUD_FMT_S16: | 272 case AUDIO_FORMAT_S16: |
273 return "S16"; 274 | 273 return "S16"; 274 |
275 case AUD_FMT_U32: | 275 case AUDIO_FORMAT_U32: |
276 return "U32"; 277 | 276 return "U32"; 277 |
278 case AUD_FMT_S32: | 278 case AUDIO_FORMAT_S32: |
279 return "S32"; | 279 return "S32"; |
280 281 default: 282 abort(); |
|
280 } 281 282 dolog ("Bogus audfmt %d returning S16\n", fmt); 283 return "S16"; 284} 285 | 283 } 284 285 dolog ("Bogus audfmt %d returning S16\n", fmt); 286 return "S16"; 287} 288 |
286static audfmt_e audio_string_to_audfmt (const char *s, audfmt_e defval, | 289static AudioFormat audio_string_to_audfmt (const char *s, AudioFormat defval, |
287 int *defaultp) 288{ 289 if (!strcasecmp (s, "u8")) { 290 *defaultp = 0; | 290 int *defaultp) 291{ 292 if (!strcasecmp (s, "u8")) { 293 *defaultp = 0; |
291 return AUD_FMT_U8; | 294 return AUDIO_FORMAT_U8; |
292 } 293 else if (!strcasecmp (s, "u16")) { 294 *defaultp = 0; | 295 } 296 else if (!strcasecmp (s, "u16")) { 297 *defaultp = 0; |
295 return AUD_FMT_U16; | 298 return AUDIO_FORMAT_U16; |
296 } 297 else if (!strcasecmp (s, "u32")) { 298 *defaultp = 0; | 299 } 300 else if (!strcasecmp (s, "u32")) { 301 *defaultp = 0; |
299 return AUD_FMT_U32; | 302 return AUDIO_FORMAT_U32; |
300 } 301 else if (!strcasecmp (s, "s8")) { 302 *defaultp = 0; | 303 } 304 else if (!strcasecmp (s, "s8")) { 305 *defaultp = 0; |
303 return AUD_FMT_S8; | 306 return AUDIO_FORMAT_S8; |
304 } 305 else if (!strcasecmp (s, "s16")) { 306 *defaultp = 0; | 307 } 308 else if (!strcasecmp (s, "s16")) { 309 *defaultp = 0; |
307 return AUD_FMT_S16; | 310 return AUDIO_FORMAT_S16; |
308 } 309 else if (!strcasecmp (s, "s32")) { 310 *defaultp = 0; | 311 } 312 else if (!strcasecmp (s, "s32")) { 313 *defaultp = 0; |
311 return AUD_FMT_S32; | 314 return AUDIO_FORMAT_S32; |
312 } 313 else { 314 dolog ("Bogus audio format `%s' using %s\n", 315 s, audio_audfmt_to_string (defval)); 316 *defaultp = 1; 317 return defval; 318 } 319} 320 | 315 } 316 else { 317 dolog ("Bogus audio format `%s' using %s\n", 318 s, audio_audfmt_to_string (defval)); 319 *defaultp = 1; 320 return defval; 321 } 322} 323 |
321static audfmt_e audio_get_conf_fmt (const char *envname, 322 audfmt_e defval, | 324static AudioFormat audio_get_conf_fmt (const char *envname, 325 AudioFormat defval, |
323 int *defaultp) 324{ 325 const char *var = getenv (envname); 326 if (!var) { 327 *defaultp = 1; 328 return defval; 329 } 330 return audio_string_to_audfmt (var, defval, defaultp); --- 85 unchanged lines hidden (view full) --- 416 { 417 int *intp = opt->valp; 418 printf ("integer, %s = %d\n", state, *intp); 419 } 420 break; 421 422 case AUD_OPT_FMT: 423 { | 326 int *defaultp) 327{ 328 const char *var = getenv (envname); 329 if (!var) { 330 *defaultp = 1; 331 return defval; 332 } 333 return audio_string_to_audfmt (var, defval, defaultp); --- 85 unchanged lines hidden (view full) --- 419 { 420 int *intp = opt->valp; 421 printf ("integer, %s = %d\n", state, *intp); 422 } 423 break; 424 425 case AUD_OPT_FMT: 426 { |
424 audfmt_e *fmtp = opt->valp; | 427 AudioFormat *fmtp = opt->valp; |
425 printf ( 426 "format, %s = %s, (one of: U8 S8 U16 S16 U32 S32)\n", 427 state, 428 audio_audfmt_to_string (*fmtp) 429 ); 430 } 431 break; 432 --- 54 unchanged lines hidden (view full) --- 487 { 488 int *intp = opt->valp; 489 *intp = audio_get_conf_int (optname, *intp, &def); 490 } 491 break; 492 493 case AUD_OPT_FMT: 494 { | 428 printf ( 429 "format, %s = %s, (one of: U8 S8 U16 S16 U32 S32)\n", 430 state, 431 audio_audfmt_to_string (*fmtp) 432 ); 433 } 434 break; 435 --- 54 unchanged lines hidden (view full) --- 490 { 491 int *intp = opt->valp; 492 *intp = audio_get_conf_int (optname, *intp, &def); 493 } 494 break; 495 496 case AUD_OPT_FMT: 497 { |
495 audfmt_e *fmtp = opt->valp; | 498 AudioFormat *fmtp = opt->valp; |
496 *fmtp = audio_get_conf_fmt (optname, *fmtp, &def); 497 } 498 break; 499 500 case AUD_OPT_STR: 501 { 502 const char **strp = opt->valp; 503 *strp = audio_get_conf_str (optname, *strp, &def); --- 15 unchanged lines hidden (view full) --- 519 g_free(prefix_upper); 520} 521 522static void audio_print_settings (struct audsettings *as) 523{ 524 dolog ("frequency=%d nchannels=%d fmt=", as->freq, as->nchannels); 525 526 switch (as->fmt) { | 499 *fmtp = audio_get_conf_fmt (optname, *fmtp, &def); 500 } 501 break; 502 503 case AUD_OPT_STR: 504 { 505 const char **strp = opt->valp; 506 *strp = audio_get_conf_str (optname, *strp, &def); --- 15 unchanged lines hidden (view full) --- 522 g_free(prefix_upper); 523} 524 525static void audio_print_settings (struct audsettings *as) 526{ 527 dolog ("frequency=%d nchannels=%d fmt=", as->freq, as->nchannels); 528 529 switch (as->fmt) { |
527 case AUD_FMT_S8: | 530 case AUDIO_FORMAT_S8: |
528 AUD_log (NULL, "S8"); 529 break; | 531 AUD_log (NULL, "S8"); 532 break; |
530 case AUD_FMT_U8: | 533 case AUDIO_FORMAT_U8: |
531 AUD_log (NULL, "U8"); 532 break; | 534 AUD_log (NULL, "U8"); 535 break; |
533 case AUD_FMT_S16: | 536 case AUDIO_FORMAT_S16: |
534 AUD_log (NULL, "S16"); 535 break; | 537 AUD_log (NULL, "S16"); 538 break; |
536 case AUD_FMT_U16: | 539 case AUDIO_FORMAT_U16: |
537 AUD_log (NULL, "U16"); 538 break; | 540 AUD_log (NULL, "U16"); 541 break; |
539 case AUD_FMT_S32: | 542 case AUDIO_FORMAT_S32: |
540 AUD_log (NULL, "S32"); 541 break; | 543 AUD_log (NULL, "S32"); 544 break; |
542 case AUD_FMT_U32: | 545 case AUDIO_FORMAT_U32: |
543 AUD_log (NULL, "U32"); 544 break; 545 default: 546 AUD_log (NULL, "invalid(%d)", as->fmt); 547 break; 548 } 549 550 AUD_log (NULL, " endianness="); --- 14 unchanged lines hidden (view full) --- 565static int audio_validate_settings (struct audsettings *as) 566{ 567 int invalid; 568 569 invalid = as->nchannels != 1 && as->nchannels != 2; 570 invalid |= as->endianness != 0 && as->endianness != 1; 571 572 switch (as->fmt) { | 546 AUD_log (NULL, "U32"); 547 break; 548 default: 549 AUD_log (NULL, "invalid(%d)", as->fmt); 550 break; 551 } 552 553 AUD_log (NULL, " endianness="); --- 14 unchanged lines hidden (view full) --- 568static int audio_validate_settings (struct audsettings *as) 569{ 570 int invalid; 571 572 invalid = as->nchannels != 1 && as->nchannels != 2; 573 invalid |= as->endianness != 0 && as->endianness != 1; 574 575 switch (as->fmt) { |
573 case AUD_FMT_S8: 574 case AUD_FMT_U8: 575 case AUD_FMT_S16: 576 case AUD_FMT_U16: 577 case AUD_FMT_S32: 578 case AUD_FMT_U32: | 576 case AUDIO_FORMAT_S8: 577 case AUDIO_FORMAT_U8: 578 case AUDIO_FORMAT_S16: 579 case AUDIO_FORMAT_U16: 580 case AUDIO_FORMAT_S32: 581 case AUDIO_FORMAT_U32: |
579 break; 580 default: 581 invalid = 1; 582 break; 583 } 584 585 invalid |= as->freq <= 0; 586 return invalid ? -1 : 0; 587} 588 589static int audio_pcm_info_eq (struct audio_pcm_info *info, struct audsettings *as) 590{ 591 int bits = 8, sign = 0; 592 593 switch (as->fmt) { | 582 break; 583 default: 584 invalid = 1; 585 break; 586 } 587 588 invalid |= as->freq <= 0; 589 return invalid ? -1 : 0; 590} 591 592static int audio_pcm_info_eq (struct audio_pcm_info *info, struct audsettings *as) 593{ 594 int bits = 8, sign = 0; 595 596 switch (as->fmt) { |
594 case AUD_FMT_S8: | 597 case AUDIO_FORMAT_S8: |
595 sign = 1; 596 /* fall through */ | 598 sign = 1; 599 /* fall through */ |
597 case AUD_FMT_U8: | 600 case AUDIO_FORMAT_U8: |
598 break; 599 | 601 break; 602 |
600 case AUD_FMT_S16: | 603 case AUDIO_FORMAT_S16: |
601 sign = 1; 602 /* fall through */ | 604 sign = 1; 605 /* fall through */ |
603 case AUD_FMT_U16: | 606 case AUDIO_FORMAT_U16: |
604 bits = 16; 605 break; 606 | 607 bits = 16; 608 break; 609 |
607 case AUD_FMT_S32: | 610 case AUDIO_FORMAT_S32: |
608 sign = 1; 609 /* fall through */ | 611 sign = 1; 612 /* fall through */ |
610 case AUD_FMT_U32: | 613 case AUDIO_FORMAT_U32: |
611 bits = 32; 612 break; | 614 bits = 32; 615 break; |
616 617 default: 618 abort(); |
|
613 } 614 return info->freq == as->freq 615 && info->nchannels == as->nchannels 616 && info->sign == sign 617 && info->bits == bits 618 && info->swap_endianness == (as->endianness != AUDIO_HOST_ENDIANNESS); 619} 620 621void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as) 622{ 623 int bits = 8, sign = 0, shift = 0; 624 625 switch (as->fmt) { | 619 } 620 return info->freq == as->freq 621 && info->nchannels == as->nchannels 622 && info->sign == sign 623 && info->bits == bits 624 && info->swap_endianness == (as->endianness != AUDIO_HOST_ENDIANNESS); 625} 626 627void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as) 628{ 629 int bits = 8, sign = 0, shift = 0; 630 631 switch (as->fmt) { |
626 case AUD_FMT_S8: | 632 case AUDIO_FORMAT_S8: |
627 sign = 1; | 633 sign = 1; |
628 case AUD_FMT_U8: | 634 case AUDIO_FORMAT_U8: |
629 break; 630 | 635 break; 636 |
631 case AUD_FMT_S16: | 637 case AUDIO_FORMAT_S16: |
632 sign = 1; | 638 sign = 1; |
633 case AUD_FMT_U16: | 639 case AUDIO_FORMAT_U16: |
634 bits = 16; 635 shift = 1; 636 break; 637 | 640 bits = 16; 641 shift = 1; 642 break; 643 |
638 case AUD_FMT_S32: | 644 case AUDIO_FORMAT_S32: |
639 sign = 1; | 645 sign = 1; |
640 case AUD_FMT_U32: | 646 case AUDIO_FORMAT_U32: |
641 bits = 32; 642 shift = 2; 643 break; | 647 bits = 32; 648 shift = 2; 649 break; |
650 651 default: 652 abort(); |
|
644 } 645 646 info->freq = as->freq; 647 info->bits = bits; 648 info->sign = sign; 649 info->nchannels = as->nchannels; 650 info->shift = (as->nchannels == 2) + shift; 651 info->align = (1 << info->shift) - 1; --- 1420 unchanged lines hidden --- | 653 } 654 655 info->freq = as->freq; 656 info->bits = bits; 657 info->sign = sign; 658 info->nchannels = as->nchannels; 659 info->shift = (as->nchannels == 2) + shift; 660 info->align = (1 << info->shift) - 1; --- 1420 unchanged lines hidden --- |