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