Home | History | Annotate | Download | only in audio
      1 /*
      2  * QEMU Audio subsystem
      3  *
      4  * Copyright (c) 2007-2008 The Android Open Source Project
      5  * Copyright (c) 2003-2005 Vassili Karpov (malc)
      6  *
      7  * Permission is hereby granted, free of charge, to any person obtaining a copy
      8  * of this software and associated documentation files (the "Software"), to deal
      9  * in the Software without restriction, including without limitation the rights
     10  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
     11  * copies of the Software, and to permit persons to whom the Software is
     12  * furnished to do so, subject to the following conditions:
     13  *
     14  * The above copyright notice and this permission notice shall be included in
     15  * all copies or substantial portions of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
     22  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
     23  * THE SOFTWARE.
     24  */
     25 #include "hw/hw.h"
     26 #include "audio.h"
     27 #include "monitor.h"
     28 #include "qemu-timer.h"
     29 #include "sysemu.h"
     30 
     31 #define AUDIO_CAP "audio"
     32 #include "audio_int.h"
     33 #include "android/utils/system.h"
     34 #include "qemu_debug.h"
     35 #include "android/android.h"
     36 
     37 /* #define DEBUG_PLIVE */
     38 /* #define DEBUG_LIVE */
     39 /* #define DEBUG_OUT */
     40 /* #define DEBUG_CAPTURE */
     41 
     42 #define SW_NAME(sw) (sw)->name ? (sw)->name : "unknown"
     43 
     44 static struct audio_driver *drvtab[] = {
     45 #ifdef CONFIG_ESD
     46     &esd_audio_driver,
     47 #endif
     48 #ifdef CONFIG_ALSA
     49     &alsa_audio_driver,
     50 #endif
     51 #ifdef CONFIG_COREAUDIO
     52     &coreaudio_audio_driver,
     53 #endif
     54 #ifdef CONFIG_DSOUND
     55     &dsound_audio_driver,
     56 #endif
     57 #ifdef CONFIG_FMOD
     58     &fmod_audio_driver,
     59 #endif
     60 #ifdef CONFIG_WINAUDIO
     61     &win_audio_driver,
     62 #endif
     63 #ifdef CONFIG_SDL
     64     &sdl_audio_driver,
     65 #endif
     66 #ifdef CONFIG_OSS
     67     &oss_audio_driver,
     68 #endif
     69     &no_audio_driver,
     70 #if 0  /* disabled WAV audio for now - until we find a user-friendly way to use it */
     71     &wav_audio_driver
     72 #endif
     73 };
     74 
     75 
     76 int
     77 audio_get_backend_count( int  is_input )
     78 {
     79     int  nn, count = 0;
     80 
     81     for (nn = 0; nn < sizeof(drvtab)/sizeof(drvtab[0]); nn++)
     82     {
     83         if (is_input) {
     84             if ( drvtab[nn]->max_voices_in > 0 )
     85                 count += 1;
     86         } else {
     87             if ( drvtab[nn]->max_voices_out > 0 )
     88                 count += 1;
     89         }
     90     }
     91     return  count;
     92 }
     93 
     94 const char*
     95 audio_get_backend_name( int   is_input, int  index, const char*  *pinfo )
     96 {
     97     int  nn;
     98 
     99     index += 1;
    100     for (nn = 0; nn < sizeof(drvtab)/sizeof(drvtab[0]); nn++)
    101     {
    102         if (is_input) {
    103             if ( drvtab[nn]->max_voices_in > 0 ) {
    104                 if ( --index == 0 ) {
    105                     *pinfo = drvtab[nn]->descr;
    106                     return drvtab[nn]->name;
    107                 }
    108             }
    109         } else {
    110             if ( drvtab[nn]->max_voices_out > 0 ) {
    111                 if ( --index == 0 ) {
    112                     *pinfo = drvtab[nn]->descr;
    113                     return drvtab[nn]->name;
    114                 }
    115             }
    116         }
    117     }
    118     *pinfo = NULL;
    119     return  NULL;
    120 }
    121 
    122 
    123 int
    124 audio_check_backend_name( int  is_input, const char*  name )
    125 {
    126     int  nn;
    127 
    128     for (nn = 0; nn < sizeof(drvtab)/sizeof(drvtab[0]); nn++)
    129     {
    130         if ( !strcmp(drvtab[nn]->name, name) ) {
    131             if (is_input) {
    132                 if (drvtab[nn]->max_voices_in > 0)
    133                     return 1;
    134             } else {
    135                 if (drvtab[nn]->max_voices_out > 0)
    136                     return 1;
    137             }
    138             break;
    139         }
    140     }
    141     return 0;
    142 }
    143 
    144 
    145 struct fixed_settings {
    146     int enabled;
    147     int nb_voices;
    148     int greedy;
    149     struct audsettings settings;
    150 };
    151 
    152 static struct {
    153     struct fixed_settings fixed_out;
    154     struct fixed_settings fixed_in;
    155     union {
    156         int hertz;
    157         int64_t ticks;
    158     } period;
    159     int plive;
    160     int log_to_monitor;
    161 } conf = {
    162     {                           /* DAC fixed settings */
    163         1,                      /* enabled */
    164         1,                      /* nb_voices */
    165         1,                      /* greedy */
    166         {
    167             44100,              /* freq */
    168             2,                  /* nchannels */
    169             AUD_FMT_S16,        /* fmt */
    170             AUDIO_HOST_ENDIANNESS
    171         }
    172     },
    173 
    174     {                           /* ADC fixed settings */
    175         1,                      /* enabled */
    176         1,                      /* nb_voices */
    177         1,                      /* greedy */
    178         {
    179             44100,              /* freq */
    180             2,                  /* nchannels */
    181             AUD_FMT_S16,        /* fmt */
    182             AUDIO_HOST_ENDIANNESS
    183         }
    184     },
    185 
    186     { 250 },                    /* period */
    187     0,                          /* plive */
    188     0                           /* log_to_monitor */
    189 };
    190 
    191 static AudioState glob_audio_state;
    192 
    193 struct mixeng_volume nominal_volume = {
    194     0,
    195 #ifdef FLOAT_MIXENG
    196     1.0,
    197     1.0
    198 #else
    199     1ULL << 32,
    200     1ULL << 32
    201 #endif
    202 };
    203 
    204 /* http://www.df.lth.se/~john_e/gems/gem002d.html */
    205 /* http://www.multi-platforms.com/Tips/PopCount.htm */
    206 uint32_t popcount (uint32_t u)
    207 {
    208     u = ((u&0x55555555) + ((u>>1)&0x55555555));
    209     u = ((u&0x33333333) + ((u>>2)&0x33333333));
    210     u = ((u&0x0f0f0f0f) + ((u>>4)&0x0f0f0f0f));
    211     u = ((u&0x00ff00ff) + ((u>>8)&0x00ff00ff));
    212     u = ( u&0x0000ffff) + (u>>16);
    213     return u;
    214 }
    215 
    216 inline uint32_t lsbindex (uint32_t u)
    217 {
    218     return popcount ((u&-u)-1);
    219 }
    220 
    221 #ifdef AUDIO_IS_FLAWLESS_AND_NO_CHECKS_ARE_REQURIED
    222 #error No its not
    223 #else
    224 int audio_bug (const char *funcname, int cond)
    225 {
    226     if (cond) {
    227         static int shown;
    228 
    229         AUD_log (NULL, "A bug was just triggered in %s\n", funcname);
    230         if (!shown) {
    231             shown = 1;
    232             AUD_log (NULL, "Save all your work and restart without audio\n");
    233             AUD_log (NULL, "Please send bug report to malc (at) pulsesoft.com\n");
    234             AUD_log (NULL, "I am sorry\n");
    235         }
    236         AUD_log (NULL, "Context:\n");
    237 
    238 #if defined AUDIO_BREAKPOINT_ON_BUG
    239 #  if defined HOST_I386
    240 #    if defined __GNUC__
    241         __asm__ ("int3");
    242 #    elif defined _MSC_VER
    243         _asm _emit 0xcc;
    244 #    else
    245         abort ();
    246 #    endif
    247 #  else
    248         abort ();
    249 #  endif
    250 #endif
    251     }
    252 
    253     return cond;
    254 }
    255 #endif
    256 
    257 static inline int audio_bits_to_index (int bits)
    258 {
    259     switch (bits) {
    260     case 8:
    261         return 0;
    262 
    263     case 16:
    264         return 1;
    265 
    266     case 32:
    267         return 2;
    268 
    269     default:
    270         audio_bug ("bits_to_index", 1);
    271         AUD_log (NULL, "invalid bits %d\n", bits);
    272         return 0;
    273     }
    274 }
    275 
    276 void *audio_calloc (const char *funcname, int nmemb, size_t size)
    277 {
    278     int cond;
    279     size_t len;
    280 
    281     len = nmemb * size;
    282     cond = !nmemb || !size;
    283     cond |= nmemb < 0;
    284     cond |= len < size;
    285 
    286     if (audio_bug ("audio_calloc", cond)) {
    287         AUD_log (NULL, "%s passed invalid arguments to audio_calloc\n",
    288                  funcname);
    289         AUD_log (NULL, "nmemb=%d size=%zu (len=%zu)\n", nmemb, size, len);
    290         return NULL;
    291     }
    292 
    293     return qemu_mallocz (len);
    294 }
    295 
    296 static char *audio_alloc_prefix (const char *s)
    297 {
    298     const char qemu_prefix[] = "QEMU_";
    299     size_t len, i;
    300     char *r, *u;
    301 
    302     if (!s) {
    303         return NULL;
    304     }
    305 
    306     len = strlen (s);
    307     r = qemu_malloc (len + sizeof (qemu_prefix));
    308 
    309     u = r + sizeof (qemu_prefix) - 1;
    310 
    311     pstrcpy (r, len + sizeof (qemu_prefix), qemu_prefix);
    312     pstrcat (r, len + sizeof (qemu_prefix), s);
    313 
    314     for (i = 0; i < len; ++i) {
    315         u[i] = qemu_toupper(u[i]);
    316     }
    317 
    318     return r;
    319 }
    320 
    321 static const char *audio_audfmt_to_string (audfmt_e fmt)
    322 {
    323     switch (fmt) {
    324     case AUD_FMT_U8:
    325         return "U8";
    326 
    327     case AUD_FMT_U16:
    328         return "U16";
    329 
    330     case AUD_FMT_S8:
    331         return "S8";
    332 
    333     case AUD_FMT_S16:
    334         return "S16";
    335 
    336     case AUD_FMT_U32:
    337         return "U32";
    338 
    339     case AUD_FMT_S32:
    340         return "S32";
    341     }
    342 
    343     dolog ("Bogus audfmt %d returning S16\n", fmt);
    344     return "S16";
    345 }
    346 
    347 static audfmt_e audio_string_to_audfmt (const char *s, audfmt_e defval,
    348                                         int *defaultp)
    349 {
    350     if (!strcasecmp (s, "u8")) {
    351         *defaultp = 0;
    352         return AUD_FMT_U8;
    353     }
    354     else if (!strcasecmp (s, "u16")) {
    355         *defaultp = 0;
    356         return AUD_FMT_U16;
    357     }
    358     else if (!strcasecmp (s, "u32")) {
    359         *defaultp = 0;
    360         return AUD_FMT_U32;
    361     }
    362     else if (!strcasecmp (s, "s8")) {
    363         *defaultp = 0;
    364         return AUD_FMT_S8;
    365     }
    366     else if (!strcasecmp (s, "s16")) {
    367         *defaultp = 0;
    368         return AUD_FMT_S16;
    369     }
    370     else if (!strcasecmp (s, "s32")) {
    371         *defaultp = 0;
    372         return AUD_FMT_S32;
    373     }
    374     else {
    375         dolog ("Bogus audio format `%s' using %s\n",
    376                s, audio_audfmt_to_string (defval));
    377         *defaultp = 1;
    378         return defval;
    379     }
    380 }
    381 
    382 static audfmt_e audio_get_conf_fmt (const char *envname,
    383                                     audfmt_e defval,
    384                                     int *defaultp)
    385 {
    386     const char *var = getenv (envname);
    387     if (!var) {
    388         *defaultp = 1;
    389         return defval;
    390     }
    391     return audio_string_to_audfmt (var, defval, defaultp);
    392 }
    393 
    394 static int audio_get_conf_int (const char *key, int defval, int *defaultp)
    395 {
    396     int val;
    397     char *strval;
    398 
    399     strval = getenv (key);
    400     if (strval) {
    401         *defaultp = 0;
    402         val = atoi (strval);
    403         return val;
    404     }
    405     else {
    406         *defaultp = 1;
    407         return defval;
    408     }
    409 }
    410 
    411 static const char *audio_get_conf_str (const char *key,
    412                                        const char *defval,
    413                                        int *defaultp)
    414 {
    415     const char *val = getenv (key);
    416     if (!val) {
    417         *defaultp = 1;
    418         return defval;
    419     }
    420     else {
    421         *defaultp = 0;
    422         return val;
    423     }
    424 }
    425 
    426 /* defined in android_sdl.c */
    427 extern void  dprintn(const char*  fmt, ...);
    428 extern void  dprintnv(const char*  fmt, va_list  args);
    429 
    430 void AUD_vlog (const char *cap, const char *fmt, va_list ap)
    431 {
    432     if (conf.log_to_monitor) {
    433         if (cap) {
    434             monitor_printf(cur_mon, "%s: ", cap);
    435         }
    436 
    437         monitor_vprintf(cur_mon, fmt, ap);
    438     }
    439     else {
    440         if (!VERBOSE_CHECK(audio))
    441             return;
    442 
    443         if (cap) {
    444             dprintn("%s: ", cap);
    445         }
    446 
    447         dprintnv(fmt, ap);
    448     }
    449 }
    450 
    451 void AUD_log (const char *cap, const char *fmt, ...)
    452 {
    453     va_list ap;
    454 
    455     va_start (ap, fmt);
    456     AUD_vlog (cap, fmt, ap);
    457     va_end (ap);
    458 }
    459 
    460 static void audio_print_options (const char *prefix,
    461                                  struct audio_option *opt)
    462 {
    463     char *uprefix;
    464 
    465     if (!prefix) {
    466         dolog ("No prefix specified\n");
    467         return;
    468     }
    469 
    470     if (!opt) {
    471         dolog ("No options\n");
    472         return;
    473     }
    474 
    475     uprefix = audio_alloc_prefix (prefix);
    476 
    477     for (; opt->name; opt++) {
    478         const char *state = "default";
    479         printf ("  %s_%s: ", uprefix, opt->name);
    480 
    481         if (opt->overriddenp && *opt->overriddenp) {
    482             state = "current";
    483         }
    484 
    485         switch (opt->tag) {
    486         case AUD_OPT_BOOL:
    487             {
    488                 int *intp = opt->valp;
    489                 printf ("boolean, %s = %d\n", state, *intp ? 1 : 0);
    490             }
    491             break;
    492 
    493         case AUD_OPT_INT:
    494             {
    495                 int *intp = opt->valp;
    496                 printf ("integer, %s = %d\n", state, *intp);
    497             }
    498             break;
    499 
    500         case AUD_OPT_FMT:
    501             {
    502                 audfmt_e *fmtp = opt->valp;
    503                 printf (
    504                     "format, %s = %s, (one of: U8 S8 U16 S16 U32 S32)\n",
    505                     state,
    506                     audio_audfmt_to_string (*fmtp)
    507                     );
    508             }
    509             break;
    510 
    511         case AUD_OPT_STR:
    512             {
    513                 const char **strp = opt->valp;
    514                 printf ("string, %s = %s\n",
    515                         state,
    516                         *strp ? *strp : "(not set)");
    517             }
    518             break;
    519 
    520         default:
    521             printf ("???\n");
    522             dolog ("Bad value tag for option %s_%s %d\n",
    523                    uprefix, opt->name, opt->tag);
    524             break;
    525         }
    526         printf ("    %s\n", opt->descr);
    527     }
    528 
    529     qemu_free (uprefix);
    530 }
    531 
    532 static void audio_process_options (const char *prefix,
    533                                    struct audio_option *opt)
    534 {
    535     char *optname;
    536     const char qemu_prefix[] = "QEMU_";
    537     size_t preflen, optlen;
    538 
    539     if (audio_bug (AUDIO_FUNC, !prefix)) {
    540         dolog ("prefix = NULL\n");
    541         return;
    542     }
    543 
    544     if (audio_bug (AUDIO_FUNC, !opt)) {
    545         dolog ("opt = NULL\n");
    546         return;
    547     }
    548 
    549     preflen = strlen (prefix);
    550 
    551     for (; opt->name; opt++) {
    552         size_t len, i;
    553         int def;
    554 
    555         if (!opt->valp) {
    556             dolog ("Option value pointer for `%s' is not set\n",
    557                    opt->name);
    558             continue;
    559         }
    560 
    561         len = strlen (opt->name);
    562         /* len of opt->name + len of prefix + size of qemu_prefix
    563          * (includes trailing zero) + zero + underscore (on behalf of
    564          * sizeof) */
    565         optlen = len + preflen + sizeof (qemu_prefix) + 1;
    566         optname = qemu_malloc (optlen);
    567 
    568         pstrcpy (optname, optlen, qemu_prefix);
    569 
    570         /* copy while upper-casing, including trailing zero */
    571         for (i = 0; i <= preflen; ++i) {
    572             optname[i + sizeof (qemu_prefix) - 1] = qemu_toupper(prefix[i]);
    573         }
    574         pstrcat (optname, optlen, "_");
    575         pstrcat (optname, optlen, opt->name);
    576 
    577         def = 1;
    578         switch (opt->tag) {
    579         case AUD_OPT_BOOL:
    580         case AUD_OPT_INT:
    581             {
    582                 int *intp = opt->valp;
    583                 *intp = audio_get_conf_int (optname, *intp, &def);
    584             }
    585             break;
    586 
    587         case AUD_OPT_FMT:
    588             {
    589                 audfmt_e *fmtp = opt->valp;
    590                 *fmtp = audio_get_conf_fmt (optname, *fmtp, &def);
    591             }
    592             break;
    593 
    594         case AUD_OPT_STR:
    595             {
    596                 const char **strp = opt->valp;
    597                 *strp = audio_get_conf_str (optname, *strp, &def);
    598             }
    599             break;
    600 
    601         default:
    602             dolog ("Bad value tag for option `%s' - %d\n",
    603                    optname, opt->tag);
    604             break;
    605         }
    606 
    607         if (!opt->overriddenp) {
    608             opt->overriddenp = &opt->overridden;
    609         }
    610         *opt->overriddenp = !def;
    611         qemu_free (optname);
    612     }
    613 }
    614 
    615 static void audio_print_settings (struct audsettings *as)
    616 {
    617     dolog ("frequency=%d nchannels=%d fmt=", as->freq, as->nchannels);
    618 
    619     switch (as->fmt) {
    620     case AUD_FMT_S8:
    621         AUD_log (NULL, "S8");
    622         break;
    623     case AUD_FMT_U8:
    624         AUD_log (NULL, "U8");
    625         break;
    626     case AUD_FMT_S16:
    627         AUD_log (NULL, "S16");
    628         break;
    629     case AUD_FMT_U16:
    630         AUD_log (NULL, "U16");
    631         break;
    632     case AUD_FMT_S32:
    633         AUD_log (NULL, "S32");
    634         break;
    635     case AUD_FMT_U32:
    636         AUD_log (NULL, "U32");
    637         break;
    638     default:
    639         AUD_log (NULL, "invalid(%d)", as->fmt);
    640         break;
    641     }
    642 
    643     AUD_log (NULL, " endianness=");
    644     switch (as->endianness) {
    645     case 0:
    646         AUD_log (NULL, "little");
    647         break;
    648     case 1:
    649         AUD_log (NULL, "big");
    650         break;
    651     default:
    652         AUD_log (NULL, "invalid");
    653         break;
    654     }
    655     AUD_log (NULL, "\n");
    656 }
    657 
    658 static int audio_validate_settings (struct audsettings *as)
    659 {
    660     int invalid;
    661 
    662     invalid = as->nchannels != 1 && as->nchannels != 2;
    663     invalid |= as->endianness != 0 && as->endianness != 1;
    664 
    665     switch (as->fmt) {
    666     case AUD_FMT_S8:
    667     case AUD_FMT_U8:
    668     case AUD_FMT_S16:
    669     case AUD_FMT_U16:
    670     case AUD_FMT_S32:
    671     case AUD_FMT_U32:
    672         break;
    673     default:
    674         invalid = 1;
    675         break;
    676     }
    677 
    678     invalid |= as->freq <= 0;
    679     return invalid ? -1 : 0;
    680 }
    681 
    682 static int audio_pcm_info_eq (struct audio_pcm_info *info, struct audsettings *as)
    683 {
    684     int bits = 8, sign = 0;
    685 
    686     switch (as->fmt) {
    687     case AUD_FMT_S8:
    688         sign = 1;
    689     case AUD_FMT_U8:
    690         break;
    691 
    692     case AUD_FMT_S16:
    693         sign = 1;
    694     case AUD_FMT_U16:
    695         bits = 16;
    696         break;
    697 
    698     case AUD_FMT_S32:
    699         sign = 1;
    700     case AUD_FMT_U32:
    701         bits = 32;
    702         break;
    703     }
    704     return info->freq == as->freq
    705         && info->nchannels == as->nchannels
    706         && info->sign == sign
    707         && info->bits == bits
    708         && info->swap_endianness == (as->endianness != AUDIO_HOST_ENDIANNESS);
    709 }
    710 
    711 void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as)
    712 {
    713     int bits = 8, sign = 0, shift = 0;
    714 
    715     switch (as->fmt) {
    716     case AUD_FMT_S8:
    717         sign = 1;
    718     case AUD_FMT_U8:
    719         break;
    720 
    721     case AUD_FMT_S16:
    722         sign = 1;
    723     case AUD_FMT_U16:
    724         bits = 16;
    725         shift = 1;
    726         break;
    727 
    728     case AUD_FMT_S32:
    729         sign = 1;
    730     case AUD_FMT_U32:
    731         bits = 32;
    732         shift = 2;
    733         break;
    734     }
    735 
    736     info->freq = as->freq;
    737     info->bits = bits;
    738     info->sign = sign;
    739     info->nchannels = as->nchannels;
    740     info->shift = (as->nchannels == 2) + shift;
    741     info->align = (1 << info->shift) - 1;
    742     info->bytes_per_second = info->freq << info->shift;
    743     info->swap_endianness = (as->endianness != AUDIO_HOST_ENDIANNESS);
    744 }
    745 
    746 void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
    747 {
    748     if (!len) {
    749         return;
    750     }
    751 
    752     if (info->sign) {
    753         memset (buf, 0x00, len << info->shift);
    754     }
    755     else {
    756         switch (info->bits) {
    757         case 8:
    758             memset (buf, 0x80, len << info->shift);
    759             break;
    760 
    761         case 16:
    762             {
    763                 int i;
    764                 uint16_t *p = buf;
    765                 int shift = info->nchannels - 1;
    766                 short s = INT16_MAX;
    767 
    768                 if (info->swap_endianness) {
    769                     s = bswap16 (s);
    770                 }
    771 
    772                 for (i = 0; i < len << shift; i++) {
    773                     p[i] = s;
    774                 }
    775             }
    776             break;
    777 
    778         case 32:
    779             {
    780                 int i;
    781                 uint32_t *p = buf;
    782                 int shift = info->nchannels - 1;
    783                 int32_t s = INT32_MAX;
    784 
    785                 if (info->swap_endianness) {
    786                     s = bswap32 (s);
    787                 }
    788 
    789                 for (i = 0; i < len << shift; i++) {
    790                     p[i] = s;
    791                 }
    792             }
    793             break;
    794 
    795         default:
    796             AUD_log (NULL, "audio_pcm_info_clear_buf: invalid bits %d\n",
    797                      info->bits);
    798             break;
    799         }
    800     }
    801 }
    802 
    803 /*
    804  * Capture
    805  */
    806 static void noop_conv (struct st_sample *dst, const void *src,
    807                        int samples, struct mixeng_volume *vol)
    808 {
    809     (void) src;
    810     (void) dst;
    811     (void) samples;
    812     (void) vol;
    813 }
    814 
    815 static CaptureVoiceOut *audio_pcm_capture_find_specific (
    816     struct audsettings *as
    817     )
    818 {
    819     CaptureVoiceOut *cap;
    820     AudioState *s = &glob_audio_state;
    821 
    822     for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
    823         if (audio_pcm_info_eq (&cap->hw.info, as)) {
    824             return cap;
    825         }
    826     }
    827     return NULL;
    828 }
    829 
    830 static void audio_notify_capture (CaptureVoiceOut *cap, audcnotification_e cmd)
    831 {
    832     struct capture_callback *cb;
    833 
    834 #ifdef DEBUG_CAPTURE
    835     dolog ("notification %d sent\n", cmd);
    836 #endif
    837     for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
    838         cb->ops.notify (cb->opaque, cmd);
    839     }
    840 }
    841 
    842 static void audio_capture_maybe_changed (CaptureVoiceOut *cap, int enabled)
    843 {
    844     if (cap->hw.enabled != enabled) {
    845         audcnotification_e cmd;
    846         cap->hw.enabled = enabled;
    847         cmd = enabled ? AUD_CNOTIFY_ENABLE : AUD_CNOTIFY_DISABLE;
    848         audio_notify_capture (cap, cmd);
    849     }
    850 }
    851 
    852 static void audio_recalc_and_notify_capture (CaptureVoiceOut *cap)
    853 {
    854     HWVoiceOut *hw = &cap->hw;
    855     SWVoiceOut *sw;
    856     int enabled = 0;
    857 
    858     for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
    859         if (sw->active) {
    860             enabled = 1;
    861             break;
    862         }
    863     }
    864     audio_capture_maybe_changed (cap, enabled);
    865 }
    866 
    867 static void audio_detach_capture (HWVoiceOut *hw)
    868 {
    869     SWVoiceCap *sc = hw->cap_head.lh_first;
    870 
    871     while (sc) {
    872         SWVoiceCap *sc1 = sc->entries.le_next;
    873         SWVoiceOut *sw = &sc->sw;
    874         CaptureVoiceOut *cap = sc->cap;
    875         int was_active = sw->active;
    876 
    877         if (sw->rate) {
    878             st_rate_stop (sw->rate);
    879             sw->rate = NULL;
    880         }
    881 
    882         LIST_REMOVE (sw, entries);
    883         LIST_REMOVE (sc, entries);
    884         qemu_free (sc);
    885         if (was_active) {
    886             /* We have removed soft voice from the capture:
    887                this might have changed the overall status of the capture
    888                since this might have been the only active voice */
    889             audio_recalc_and_notify_capture (cap);
    890         }
    891         sc = sc1;
    892     }
    893 }
    894 
    895 static int audio_attach_capture (HWVoiceOut *hw)
    896 {
    897     AudioState *s = &glob_audio_state;
    898     CaptureVoiceOut *cap;
    899 
    900     audio_detach_capture (hw);
    901     for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
    902         SWVoiceCap *sc;
    903         SWVoiceOut *sw;
    904         HWVoiceOut *hw_cap = &cap->hw;
    905 
    906         sc = audio_calloc (AUDIO_FUNC, 1, sizeof (*sc));
    907         if (!sc) {
    908             dolog ("Could not allocate soft capture voice (%zu bytes)\n",
    909                    sizeof (*sc));
    910             return -1;
    911         }
    912 
    913         sc->cap = cap;
    914         sw = &sc->sw;
    915         sw->hw = hw_cap;
    916         sw->info = hw->info;
    917         sw->empty = 1;
    918         sw->active = hw->enabled;
    919         sw->conv = noop_conv;
    920         sw->ratio = ((int64_t) hw_cap->info.freq << 32) / sw->info.freq;
    921         sw->rate = st_rate_start (sw->info.freq, hw_cap->info.freq);
    922         if (!sw->rate) {
    923             dolog ("Could not start rate conversion for `%s'\n", SW_NAME (sw));
    924             qemu_free (sw);
    925             return -1;
    926         }
    927         LIST_INSERT_HEAD (&hw_cap->sw_head, sw, entries);
    928         LIST_INSERT_HEAD (&hw->cap_head, sc, entries);
    929 #ifdef DEBUG_CAPTURE
    930         asprintf (&sw->name, "for %p %d,%d,%d",
    931                   hw, sw->info.freq, sw->info.bits, sw->info.nchannels);
    932         dolog ("Added %s active = %d\n", sw->name, sw->active);
    933 #endif
    934         if (sw->active) {
    935             audio_capture_maybe_changed (cap, 1);
    936         }
    937     }
    938     return 0;
    939 }
    940 
    941 /*
    942  * Hard voice (capture)
    943  */
    944 static int audio_pcm_hw_find_min_in (HWVoiceIn *hw)
    945 {
    946     SWVoiceIn *sw;
    947     int m = hw->total_samples_captured;
    948 
    949     for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
    950         if (sw->active) {
    951             m = audio_MIN (m, sw->total_hw_samples_acquired);
    952         }
    953     }
    954     return m;
    955 }
    956 
    957 int audio_pcm_hw_get_live_in (HWVoiceIn *hw)
    958 {
    959     int live = hw->total_samples_captured - audio_pcm_hw_find_min_in (hw);
    960     if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
    961         dolog ("live=%d hw->samples=%d\n", live, hw->samples);
    962         return 0;
    963     }
    964     return live;
    965 }
    966 
    967 /*
    968  * Soft voice (capture)
    969  */
    970 static int audio_pcm_sw_get_rpos_in (SWVoiceIn *sw)
    971 {
    972     HWVoiceIn *hw = sw->hw;
    973     int live = hw->total_samples_captured - sw->total_hw_samples_acquired;
    974     int rpos;
    975 
    976     if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
    977         dolog ("live=%d hw->samples=%d\n", live, hw->samples);
    978         return 0;
    979     }
    980 
    981     rpos = hw->wpos - live;
    982     if (rpos >= 0) {
    983         return rpos;
    984     }
    985     else {
    986         return hw->samples + rpos;
    987     }
    988 }
    989 
    990 int audio_pcm_sw_read (SWVoiceIn *sw, void *buf, int size)
    991 {
    992     HWVoiceIn *hw = sw->hw;
    993     int samples, live, ret = 0, swlim, isamp, osamp, rpos, total = 0;
    994     struct st_sample *src, *dst = sw->buf;
    995 
    996     rpos = audio_pcm_sw_get_rpos_in (sw) % hw->samples;
    997 
    998     live = hw->total_samples_captured - sw->total_hw_samples_acquired;
    999     if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
   1000         dolog ("live_in=%d hw->samples=%d\n", live, hw->samples);
   1001         return 0;
   1002     }
   1003 
   1004     samples = size >> sw->info.shift;
   1005     if (!live) {
   1006         return 0;
   1007     }
   1008 
   1009     swlim = (live * sw->ratio) >> 32;
   1010     swlim = audio_MIN (swlim, samples);
   1011 
   1012     while (swlim) {
   1013         src = hw->conv_buf + rpos;
   1014         isamp = hw->wpos - rpos;
   1015         /* XXX: <= ? */
   1016         if (isamp <= 0) {
   1017             isamp = hw->samples - rpos;
   1018         }
   1019 
   1020         if (!isamp) {
   1021             break;
   1022         }
   1023         osamp = swlim;
   1024 
   1025         if (audio_bug (AUDIO_FUNC, osamp < 0)) {
   1026             dolog ("osamp=%d\n", osamp);
   1027             return 0;
   1028         }
   1029 
   1030         st_rate_flow (sw->rate, src, dst, &isamp, &osamp);
   1031         swlim -= osamp;
   1032         rpos = (rpos + isamp) % hw->samples;
   1033         dst += osamp;
   1034         ret += osamp;
   1035         total += isamp;
   1036     }
   1037 
   1038     sw->clip (buf, sw->buf, ret);
   1039     sw->total_hw_samples_acquired += total;
   1040     return ret << sw->info.shift;
   1041 }
   1042 
   1043 /*
   1044  * Hard voice (playback)
   1045  */
   1046 static int audio_pcm_hw_find_min_out (HWVoiceOut *hw, int *nb_livep)
   1047 {
   1048     SWVoiceOut *sw;
   1049     int m = INT_MAX;
   1050     int nb_live = 0;
   1051 
   1052     for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
   1053         if (sw->active || !sw->empty) {
   1054             m = audio_MIN (m, sw->total_hw_samples_mixed);
   1055             nb_live += 1;
   1056         }
   1057     }
   1058 
   1059     *nb_livep = nb_live;
   1060     return m;
   1061 }
   1062 
   1063 int audio_pcm_hw_get_live_out2 (HWVoiceOut *hw, int *nb_live)
   1064 {
   1065     int smin;
   1066 
   1067     smin = audio_pcm_hw_find_min_out (hw, nb_live);
   1068 
   1069     if (!*nb_live) {
   1070         return 0;
   1071     }
   1072     else {
   1073         int live = smin;
   1074 
   1075         if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
   1076             dolog ("live=%d hw->samples=%d\n", live, hw->samples);
   1077             return 0;
   1078         }
   1079         return live;
   1080     }
   1081 }
   1082 
   1083 int audio_pcm_hw_get_live_out (HWVoiceOut *hw)
   1084 {
   1085     int nb_live;
   1086     int live;
   1087 
   1088     live = audio_pcm_hw_get_live_out2 (hw, &nb_live);
   1089     if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
   1090         dolog ("live=%d hw->samples=%d\n", live, hw->samples);
   1091         return 0;
   1092     }
   1093     return live;
   1094 }
   1095 
   1096 /*
   1097  * Soft voice (playback)
   1098  */
   1099 int audio_pcm_sw_write (SWVoiceOut *sw, void *buf, int size)
   1100 {
   1101     int hwsamples, samples, isamp, osamp, wpos, live, dead, left, swlim, blck;
   1102     int ret = 0, pos = 0, total = 0;
   1103 
   1104     if (!sw) {
   1105         return size;
   1106     }
   1107 
   1108     hwsamples = sw->hw->samples;
   1109 
   1110     live = sw->total_hw_samples_mixed;
   1111     if (audio_bug (AUDIO_FUNC, live < 0 || live > hwsamples)){
   1112         dolog ("live=%d hw->samples=%d\n", live, hwsamples);
   1113         return 0;
   1114     }
   1115 
   1116     if (live == hwsamples) {
   1117 #ifdef DEBUG_OUT
   1118         dolog ("%s is full %d\n", sw->name, live);
   1119 #endif
   1120         return 0;
   1121     }
   1122 
   1123     wpos = (sw->hw->rpos + live) % hwsamples;
   1124     samples = size >> sw->info.shift;
   1125 
   1126     dead = hwsamples - live;
   1127     swlim = ((int64_t) dead << 32) / sw->ratio;
   1128     swlim = audio_MIN (swlim, samples);
   1129     if (swlim) {
   1130         sw->conv (sw->buf, buf, swlim, &sw->vol);
   1131     }
   1132 
   1133     while (swlim) {
   1134         dead = hwsamples - live;
   1135         left = hwsamples - wpos;
   1136         blck = audio_MIN (dead, left);
   1137         if (!blck) {
   1138             break;
   1139         }
   1140         isamp = swlim;
   1141         osamp = blck;
   1142         st_rate_flow_mix (
   1143             sw->rate,
   1144             sw->buf + pos,
   1145             sw->hw->mix_buf + wpos,
   1146             &isamp,
   1147             &osamp
   1148             );
   1149         ret += isamp;
   1150         swlim -= isamp;
   1151         pos += isamp;
   1152         live += osamp;
   1153         wpos = (wpos + osamp) % hwsamples;
   1154         total += osamp;
   1155     }
   1156 
   1157     sw->total_hw_samples_mixed += total;
   1158     sw->empty = sw->total_hw_samples_mixed == 0;
   1159 
   1160 #ifdef DEBUG_OUT
   1161     dolog (
   1162         "%s: write size %d ret %d total sw %d\n",
   1163         SW_NAME (sw),
   1164         size >> sw->info.shift,
   1165         ret,
   1166         sw->total_hw_samples_mixed
   1167         );
   1168 #endif
   1169 
   1170     return ret << sw->info.shift;
   1171 }
   1172 
   1173 #ifdef DEBUG_AUDIO
   1174 static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
   1175 {
   1176     dolog ("%s: bits %d, sign %d, freq %d, nchan %d\n",
   1177            cap, info->bits, info->sign, info->freq, info->nchannels);
   1178 }
   1179 #endif
   1180 
   1181 #define DAC
   1182 #include "audio_template.h"
   1183 #undef DAC
   1184 #include "audio_template.h"
   1185 
   1186 int AUD_write (SWVoiceOut *sw, void *buf, int size)
   1187 {
   1188     int bytes;
   1189 
   1190     if (!sw) {
   1191         /* XXX: Consider options */
   1192         return size;
   1193     }
   1194 
   1195     if (!sw->hw->enabled) {
   1196         dolog ("Writing to disabled voice %s\n", SW_NAME (sw));
   1197         return 0;
   1198     }
   1199 
   1200     BEGIN_NOSIGALRM
   1201         bytes = sw->hw->pcm_ops->write (sw, buf, size);
   1202     END_NOSIGALRM
   1203     return bytes;
   1204 }
   1205 
   1206 int AUD_read (SWVoiceIn *sw, void *buf, int size)
   1207 {
   1208     int bytes;
   1209 
   1210     if (!sw) {
   1211         /* XXX: Consider options */
   1212         return size;
   1213     }
   1214 
   1215     if (!sw->hw->enabled) {
   1216         dolog ("Reading from disabled voice %s\n", SW_NAME (sw));
   1217         return 0;
   1218     }
   1219 
   1220     BEGIN_NOSIGALRM
   1221         bytes = sw->hw->pcm_ops->read (sw, buf, size);
   1222     END_NOSIGALRM
   1223     return bytes;
   1224 }
   1225 
   1226 int AUD_get_buffer_size_out (SWVoiceOut *sw)
   1227 {
   1228     return sw->hw->samples << sw->hw->info.shift;
   1229 }
   1230 
   1231 void AUD_set_active_out (SWVoiceOut *sw, int on)
   1232 {
   1233     HWVoiceOut *hw;
   1234 
   1235     if (!sw) {
   1236         return;
   1237     }
   1238 
   1239     hw = sw->hw;
   1240     if (sw->active != on) {
   1241         AudioState *s = &glob_audio_state;
   1242         SWVoiceOut *temp_sw;
   1243         SWVoiceCap *sc;
   1244 
   1245         if (on) {
   1246             hw->pending_disable = 0;
   1247             if (!hw->enabled) {
   1248                 hw->enabled = 1;
   1249                 if (s->vm_running) {
   1250                 BEGIN_NOSIGALRM
   1251                     hw->pcm_ops->ctl_out (hw, VOICE_ENABLE);
   1252                 END_NOSIGALRM
   1253                 }
   1254             }
   1255         }
   1256         else {
   1257             if (hw->enabled) {
   1258                 int nb_active = 0;
   1259 
   1260                 for (temp_sw = hw->sw_head.lh_first; temp_sw;
   1261                      temp_sw = temp_sw->entries.le_next) {
   1262                     nb_active += temp_sw->active != 0;
   1263                 }
   1264 
   1265                 hw->pending_disable = nb_active == 1;
   1266             }
   1267         }
   1268 
   1269         for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
   1270             sc->sw.active = hw->enabled;
   1271             if (hw->enabled) {
   1272                 audio_capture_maybe_changed (sc->cap, 1);
   1273             }
   1274         }
   1275         sw->active = on;
   1276     }
   1277 }
   1278 
   1279 void AUD_set_active_in (SWVoiceIn *sw, int on)
   1280 {
   1281     HWVoiceIn *hw;
   1282 
   1283     if (!sw) {
   1284         return;
   1285     }
   1286 
   1287     hw = sw->hw;
   1288     if (sw->active != on) {
   1289         AudioState *s = &glob_audio_state;
   1290         SWVoiceIn *temp_sw;
   1291 
   1292         if (on) {
   1293             if (!hw->enabled) {
   1294                 hw->enabled = 1;
   1295                 if (s->vm_running) {
   1296                 BEGIN_NOSIGALRM
   1297                     hw->pcm_ops->ctl_in (hw, VOICE_ENABLE);
   1298                 END_NOSIGALRM
   1299                 }
   1300             }
   1301             sw->total_hw_samples_acquired = hw->total_samples_captured;
   1302         }
   1303         else {
   1304             if (hw->enabled) {
   1305                 int nb_active = 0;
   1306 
   1307                 for (temp_sw = hw->sw_head.lh_first; temp_sw;
   1308                      temp_sw = temp_sw->entries.le_next) {
   1309                     nb_active += temp_sw->active != 0;
   1310                 }
   1311 
   1312                 if (nb_active == 1) {
   1313                     hw->enabled = 0;
   1314                     BEGIN_NOSIGALRM
   1315                         hw->pcm_ops->ctl_in (hw, VOICE_DISABLE);
   1316                     END_NOSIGALRM
   1317                 }
   1318             }
   1319         }
   1320         sw->active = on;
   1321     }
   1322 }
   1323 
   1324 static int audio_get_avail (SWVoiceIn *sw)
   1325 {
   1326     int live;
   1327 
   1328     if (!sw) {
   1329         return 0;
   1330     }
   1331 
   1332     live = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;
   1333     if (audio_bug (AUDIO_FUNC, live < 0 || live > sw->hw->samples)) {
   1334         dolog ("live=%d sw->hw->samples=%d\n", live, sw->hw->samples);
   1335         return 0;
   1336     }
   1337 
   1338     ldebug (
   1339         "%s: get_avail live %d ret %" PRId64 "\n",
   1340         SW_NAME (sw),
   1341         live, (((int64_t) live << 32) / sw->ratio) << sw->info.shift
   1342         );
   1343 
   1344     return (((int64_t) live << 32) / sw->ratio) << sw->info.shift;
   1345 }
   1346 
   1347 static int audio_get_free (SWVoiceOut *sw)
   1348 {
   1349     int live, dead;
   1350 
   1351     if (!sw) {
   1352         return 0;
   1353     }
   1354 
   1355     live = sw->total_hw_samples_mixed;
   1356 
   1357     if (audio_bug (AUDIO_FUNC, live < 0 || live > sw->hw->samples)) {
   1358         dolog ("live=%d sw->hw->samples=%d\n", live, sw->hw->samples);
   1359         return 0;
   1360     }
   1361 
   1362     dead = sw->hw->samples - live;
   1363 
   1364 #ifdef DEBUG_OUT
   1365     dolog ("%s: get_free live %d dead %d ret %" PRId64 "\n",
   1366            SW_NAME (sw),
   1367            live, dead, (((int64_t) dead << 32) / sw->ratio) << sw->info.shift);
   1368 #endif
   1369 
   1370     return (((int64_t) dead << 32) / sw->ratio) << sw->info.shift;
   1371 }
   1372 
   1373 static void audio_capture_mix_and_clear (HWVoiceOut *hw, int rpos, int samples)
   1374 {
   1375     int n;
   1376 
   1377     if (hw->enabled) {
   1378         SWVoiceCap *sc;
   1379 
   1380         for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
   1381             SWVoiceOut *sw = &sc->sw;
   1382             int rpos2 = rpos;
   1383 
   1384             n = samples;
   1385             while (n) {
   1386                 int till_end_of_hw = hw->samples - rpos2;
   1387                 int to_write = audio_MIN (till_end_of_hw, n);
   1388                 int bytes = to_write << hw->info.shift;
   1389                 int written;
   1390 
   1391                 sw->buf = hw->mix_buf + rpos2;
   1392                 written = audio_pcm_sw_write (sw, NULL, bytes);
   1393                 if (written - bytes) {
   1394                     dolog ("Could not mix %d bytes into a capture "
   1395                            "buffer, mixed %d\n",
   1396                            bytes, written);
   1397                     break;
   1398                 }
   1399                 n -= to_write;
   1400                 rpos2 = (rpos2 + to_write) % hw->samples;
   1401             }
   1402         }
   1403     }
   1404 
   1405     n = audio_MIN (samples, hw->samples - rpos);
   1406     mixeng_clear (hw->mix_buf + rpos, n);
   1407     mixeng_clear (hw->mix_buf, samples - n);
   1408 }
   1409 
   1410 static void audio_run_out (AudioState *s)
   1411 {
   1412     HWVoiceOut *hw = NULL;
   1413     SWVoiceOut *sw;
   1414 
   1415     while ((hw = audio_pcm_hw_find_any_enabled_out (hw))) {
   1416         int played;
   1417         int live, free, nb_live, cleanup_required, prev_rpos;
   1418 
   1419         live = audio_pcm_hw_get_live_out2 (hw, &nb_live);
   1420         if (!nb_live) {
   1421             live = 0;
   1422         }
   1423 
   1424         if (audio_bug (AUDIO_FUNC, live < 0 || live > hw->samples)) {
   1425             dolog ("live=%d hw->samples=%d\n", live, hw->samples);
   1426             continue;
   1427         }
   1428 
   1429         if (hw->pending_disable && !nb_live) {
   1430             SWVoiceCap *sc;
   1431 #ifdef DEBUG_OUT
   1432             dolog ("Disabling voice\n");
   1433 #endif
   1434             hw->enabled = 0;
   1435             hw->pending_disable = 0;
   1436             BEGIN_NOSIGALRM
   1437                 hw->pcm_ops->ctl_out (hw, VOICE_DISABLE);
   1438             END_NOSIGALRM
   1439             for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
   1440                 sc->sw.active = 0;
   1441                 audio_recalc_and_notify_capture (sc->cap);
   1442             }
   1443             continue;
   1444         }
   1445 
   1446         if (!live) {
   1447             for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
   1448                 if (sw->active) {
   1449                     free = audio_get_free (sw);
   1450                     if (free > 0) {
   1451                         sw->callback.fn (sw->callback.opaque, free);
   1452                     }
   1453                 }
   1454             }
   1455             continue;
   1456         }
   1457 
   1458         prev_rpos = hw->rpos;
   1459         BEGIN_NOSIGALRM
   1460             played = hw->pcm_ops->run_out (hw);
   1461         END_NOSIGALRM
   1462         if (audio_bug (AUDIO_FUNC, hw->rpos >= hw->samples)) {
   1463             dolog ("hw->rpos=%d hw->samples=%d played=%d\n",
   1464                    hw->rpos, hw->samples, played);
   1465             hw->rpos = 0;
   1466         }
   1467 
   1468 #ifdef DEBUG_OUT
   1469         dolog ("played=%d\n", played);
   1470 #endif
   1471 
   1472         if (played) {
   1473             hw->ts_helper += played;
   1474             audio_capture_mix_and_clear (hw, prev_rpos, played);
   1475         }
   1476 
   1477         cleanup_required = 0;
   1478         for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
   1479             if (!sw->active && sw->empty) {
   1480                 continue;
   1481             }
   1482 
   1483             if (audio_bug (AUDIO_FUNC, played > sw->total_hw_samples_mixed)) {
   1484                 dolog ("played=%d sw->total_hw_samples_mixed=%d\n",
   1485                        played, sw->total_hw_samples_mixed);
   1486                 played = sw->total_hw_samples_mixed;
   1487             }
   1488 
   1489             sw->total_hw_samples_mixed -= played;
   1490 
   1491             if (!sw->total_hw_samples_mixed) {
   1492                 sw->empty = 1;
   1493                 cleanup_required |= !sw->active && !sw->callback.fn;
   1494             }
   1495 
   1496             if (sw->active) {
   1497                 free = audio_get_free (sw);
   1498                 if (free > 0) {
   1499                     sw->callback.fn (sw->callback.opaque, free);
   1500                 }
   1501             }
   1502         }
   1503 
   1504         if (cleanup_required) {
   1505             SWVoiceOut *sw1;
   1506 
   1507             sw = hw->sw_head.lh_first;
   1508             while (sw) {
   1509                 sw1 = sw->entries.le_next;
   1510                 if (!sw->active && !sw->callback.fn) {
   1511 #ifdef DEBUG_PLIVE
   1512                     dolog ("Finishing with old voice\n");
   1513 #endif
   1514                     audio_close_out (sw);
   1515                 }
   1516                 sw = sw1;
   1517             }
   1518         }
   1519     }
   1520 }
   1521 
   1522 static void audio_run_in (AudioState *s)
   1523 {
   1524     HWVoiceIn *hw = NULL;
   1525 
   1526     while ((hw = audio_pcm_hw_find_any_enabled_in (hw))) {
   1527         SWVoiceIn *sw;
   1528         int captured, min;
   1529 
   1530         BEGIN_NOSIGALRM
   1531             captured = hw->pcm_ops->run_in (hw);
   1532         END_NOSIGALRM
   1533 
   1534         min = audio_pcm_hw_find_min_in (hw);
   1535         hw->total_samples_captured += captured - min;
   1536         hw->ts_helper += captured;
   1537 
   1538         for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
   1539             sw->total_hw_samples_acquired -= min;
   1540 
   1541             if (sw->active) {
   1542                 int avail;
   1543 
   1544                 avail = audio_get_avail (sw);
   1545                 if (avail > 0) {
   1546                     sw->callback.fn (sw->callback.opaque, avail);
   1547                 }
   1548             }
   1549         }
   1550     }
   1551 }
   1552 
   1553 static void audio_run_capture (AudioState *s)
   1554 {
   1555     CaptureVoiceOut *cap;
   1556 
   1557     for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
   1558         int live, rpos, captured;
   1559         HWVoiceOut *hw = &cap->hw;
   1560         SWVoiceOut *sw;
   1561 
   1562         captured = live = audio_pcm_hw_get_live_out (hw);
   1563         rpos = hw->rpos;
   1564         while (live) {
   1565             int left = hw->samples - rpos;
   1566             int to_capture = audio_MIN (live, left);
   1567             struct st_sample *src;
   1568             struct capture_callback *cb;
   1569 
   1570             src = hw->mix_buf + rpos;
   1571             hw->clip (cap->buf, src, to_capture);
   1572             mixeng_clear (src, to_capture);
   1573 
   1574             for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
   1575                 cb->ops.capture (cb->opaque, cap->buf,
   1576                                  to_capture << hw->info.shift);
   1577             }
   1578             rpos = (rpos + to_capture) % hw->samples;
   1579             live -= to_capture;
   1580         }
   1581         hw->rpos = rpos;
   1582 
   1583         for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
   1584             if (!sw->active && sw->empty) {
   1585                 continue;
   1586             }
   1587 
   1588             if (audio_bug (AUDIO_FUNC, captured > sw->total_hw_samples_mixed)) {
   1589                 dolog ("captured=%d sw->total_hw_samples_mixed=%d\n",
   1590                        captured, sw->total_hw_samples_mixed);
   1591                 captured = sw->total_hw_samples_mixed;
   1592             }
   1593 
   1594             sw->total_hw_samples_mixed -= captured;
   1595             sw->empty = sw->total_hw_samples_mixed == 0;
   1596         }
   1597     }
   1598 }
   1599 
   1600 static void audio_timer (void *opaque)
   1601 {
   1602     AudioState *s = opaque;
   1603 #if 0
   1604 #define  MAX_DIFFS  1000
   1605     int64_t         now  = qemu_get_clock(vm_clock);
   1606 	static int64_t  last = 0;
   1607 	static float    diffs[MAX_DIFFS];
   1608 	static int      num_diffs;
   1609 
   1610     if (last == 0)
   1611 	    last = now;
   1612 	else {
   1613 		diffs[num_diffs] = (float)((now-last)/1e6);  /* last diff in ms */
   1614 		if (++num_diffs == MAX_DIFFS) {
   1615 			double  min_diff = 1e6, max_diff = -1e6;
   1616 			double  all_diff = 0.;
   1617 			int     nn;
   1618 
   1619 			for (nn = 0; nn < num_diffs; nn++) {
   1620 				if (diffs[nn] < min_diff) min_diff = diffs[nn];
   1621 				if (diffs[nn] > max_diff) max_diff = diffs[nn];
   1622 				all_diff += diffs[nn];
   1623 			}
   1624 			all_diff *= 1.0/num_diffs;
   1625 			printf("audio timer: min_diff=%6.2g max_diff=%6.2g avg_diff=%6.2g samples=%d\n",
   1626 					min_diff, max_diff, all_diff, num_diffs);
   1627 			num_diffs = 0;
   1628 		}
   1629 	}
   1630 	last = now;
   1631 #endif
   1632     audio_run_out (s);
   1633     audio_run_in (s);
   1634     audio_run_capture (s);
   1635 
   1636     qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + conf.period.ticks);
   1637 }
   1638 
   1639 static struct audio_option audio_options[] = {
   1640     /* DAC */
   1641     {"DAC_FIXED_SETTINGS", AUD_OPT_BOOL, &conf.fixed_out.enabled,
   1642      "Use fixed settings for host DAC", NULL, 0},
   1643 
   1644     {"DAC_FIXED_FREQ", AUD_OPT_INT, &conf.fixed_out.settings.freq,
   1645      "Frequency for fixed host DAC", NULL, 0},
   1646 
   1647     {"DAC_FIXED_FMT", AUD_OPT_FMT, &conf.fixed_out.settings.fmt,
   1648      "Format for fixed host DAC", NULL, 0},
   1649 
   1650     {"DAC_FIXED_CHANNELS", AUD_OPT_INT, &conf.fixed_out.settings.nchannels,
   1651      "Number of channels for fixed DAC (1 - mono, 2 - stereo)", NULL, 0},
   1652 
   1653     {"DAC_VOICES", AUD_OPT_INT, &conf.fixed_out.nb_voices,
   1654      "Number of voices for DAC", NULL, 0},
   1655 
   1656     /* ADC */
   1657     {"ADC_FIXED_SETTINGS", AUD_OPT_BOOL, &conf.fixed_in.enabled,
   1658      "Use fixed settings for host ADC", NULL, 0},
   1659 
   1660     {"ADC_FIXED_FREQ", AUD_OPT_INT, &conf.fixed_in.settings.freq,
   1661      "Frequency for fixed host ADC", NULL, 0},
   1662 
   1663     {"ADC_FIXED_FMT", AUD_OPT_FMT, &conf.fixed_in.settings.fmt,
   1664      "Format for fixed host ADC", NULL, 0},
   1665 
   1666     {"ADC_FIXED_CHANNELS", AUD_OPT_INT, &conf.fixed_in.settings.nchannels,
   1667      "Number of channels for fixed ADC (1 - mono, 2 - stereo)", NULL, 0},
   1668 
   1669     {"ADC_VOICES", AUD_OPT_INT, &conf.fixed_in.nb_voices,
   1670      "Number of voices for ADC", NULL, 0},
   1671 
   1672     /* Misc */
   1673     {"TIMER_PERIOD", AUD_OPT_INT, &conf.period.hertz,
   1674      "Timer period in HZ (0 - use lowest possible)", NULL, 0},
   1675 
   1676     {"PLIVE", AUD_OPT_BOOL, &conf.plive,
   1677      "(undocumented)", NULL, 0},
   1678 
   1679     {"LOG_TO_MONITOR", AUD_OPT_BOOL, &conf.log_to_monitor,
   1680      "print logging messages to monitor instead of stderr", NULL, 0},
   1681 
   1682     {NULL, 0, NULL, NULL, NULL, 0}
   1683 };
   1684 
   1685 static void audio_pp_nb_voices (const char *typ, int nb)
   1686 {
   1687     switch (nb) {
   1688     case 0:
   1689         printf ("Does not support %s\n", typ);
   1690         break;
   1691     case 1:
   1692         printf ("One %s voice\n", typ);
   1693         break;
   1694     case INT_MAX:
   1695         printf ("Theoretically supports many %s voices\n", typ);
   1696         break;
   1697     default:
   1698         printf ("Theoretically supports upto %d %s voices\n", nb, typ);
   1699         break;
   1700     }
   1701 
   1702 }
   1703 
   1704 void AUD_help (void)
   1705 {
   1706     size_t i;
   1707 
   1708     audio_process_options ("AUDIO", audio_options);
   1709     for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
   1710         struct audio_driver *d = drvtab[i];
   1711         if (d->options) {
   1712             audio_process_options (d->name, d->options);
   1713         }
   1714     }
   1715 
   1716     printf ("Audio options:\n");
   1717     audio_print_options ("AUDIO", audio_options);
   1718     printf ("\n");
   1719 
   1720     printf ("Available drivers:\n");
   1721 
   1722     for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
   1723         struct audio_driver *d = drvtab[i];
   1724 
   1725         printf ("Name: %s\n", d->name);
   1726         printf ("Description: %s\n", d->descr);
   1727 
   1728         audio_pp_nb_voices ("playback", d->max_voices_out);
   1729         audio_pp_nb_voices ("capture", d->max_voices_in);
   1730 
   1731         if (d->options) {
   1732             printf ("Options:\n");
   1733             audio_print_options (d->name, d->options);
   1734         }
   1735         else {
   1736             printf ("No options\n");
   1737         }
   1738         printf ("\n");
   1739     }
   1740 
   1741     printf (
   1742         "Options are settable through environment variables.\n"
   1743         "Example:\n"
   1744 #ifdef _WIN32
   1745         "  set QEMU_AUDIO_DRV=wav\n"
   1746         "  set QEMU_WAV_PATH=c:\\tune.wav\n"
   1747 #else
   1748         "  export QEMU_AUDIO_DRV=wav\n"
   1749         "  export QEMU_WAV_PATH=$HOME/tune.wav\n"
   1750         "(for csh replace export with setenv in the above)\n"
   1751 #endif
   1752         "  qemu ...\n\n"
   1753         );
   1754 }
   1755 
   1756 static int audio_driver_init (AudioState *s, struct audio_driver *drv, int  out)
   1757 {
   1758     void*   opaque;
   1759 
   1760     if (drv->options) {
   1761         audio_process_options (drv->name, drv->options);
   1762     }
   1763 
   1764     /* is the driver already initialized ? */
   1765     if (out) {
   1766         if (drv == s->drv_in) {
   1767             s->drv_out        = drv;
   1768             s->drv_out_opaque = s->drv_in_opaque;
   1769             return 0;
   1770         }
   1771     } else {
   1772         if (drv == s->drv_out) {
   1773             s->drv_in        = drv;
   1774             s->drv_in_opaque = s->drv_out_opaque;
   1775             return 0;
   1776         }
   1777     }
   1778 
   1779     BEGIN_NOSIGALRM
   1780     opaque = drv->init();
   1781     END_NOSIGALRM
   1782 
   1783     if (opaque != NULL) {
   1784         audio_init_nb_voices_out (drv);
   1785         audio_init_nb_voices_in (drv);
   1786         if (out) {
   1787             s->drv_out         = drv;
   1788             s->drv_out_opaque  = opaque;
   1789         } else {
   1790             s->drv_in        = drv;
   1791             s->drv_in_opaque = opaque;
   1792         }
   1793         return 0;
   1794     }
   1795     else {
   1796         dolog ("Could not init `%s' audio driver\n", drv->name);
   1797         return -1;
   1798     }
   1799 }
   1800 
   1801 static void audio_vm_change_state_handler (void *opaque, int running,
   1802                                            int reason)
   1803 {
   1804     AudioState *s = opaque;
   1805     HWVoiceOut *hwo = NULL;
   1806     HWVoiceIn *hwi = NULL;
   1807     int op = running ? VOICE_ENABLE : VOICE_DISABLE;
   1808 
   1809     s->vm_running = running;
   1810     BEGIN_NOSIGALRM
   1811         while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
   1812             hwo->pcm_ops->ctl_out (hwo, op);
   1813         }
   1814 
   1815         while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
   1816             hwi->pcm_ops->ctl_in (hwi, op);
   1817         }
   1818     END_NOSIGALRM
   1819 }
   1820 
   1821 // to make sure audio_atexit() is only called once
   1822 static int initialized = 0;
   1823 
   1824 static void audio_atexit (void)
   1825 {
   1826     AudioState *s = &glob_audio_state;
   1827     HWVoiceOut *hwo = NULL;
   1828     HWVoiceIn *hwi = NULL;
   1829 
   1830     if (!initialized) return;
   1831     initialized = 0;
   1832 
   1833     BEGIN_NOSIGALRM
   1834     while ((hwo = audio_pcm_hw_find_any_enabled_out (hwo))) {
   1835         SWVoiceCap *sc;
   1836 
   1837         hwo->pcm_ops->ctl_out (hwo, VOICE_DISABLE);
   1838         hwo->pcm_ops->fini_out (hwo);
   1839 
   1840         for (sc = hwo->cap_head.lh_first; sc; sc = sc->entries.le_next) {
   1841             CaptureVoiceOut *cap = sc->cap;
   1842             struct capture_callback *cb;
   1843 
   1844             for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
   1845                 cb->ops.destroy (cb->opaque);
   1846             }
   1847         }
   1848     }
   1849 
   1850     while ((hwi = audio_pcm_hw_find_any_enabled_in (hwi))) {
   1851         hwi->pcm_ops->ctl_in (hwi, VOICE_DISABLE);
   1852         hwi->pcm_ops->fini_in (hwi);
   1853     }
   1854 
   1855     if (s->drv_in) {
   1856         s->drv_in->fini (s->drv_in_opaque);
   1857     }
   1858     if (s->drv_out) {
   1859         s->drv_out->fini (s->drv_out_opaque);
   1860     }
   1861     END_NOSIGALRM
   1862 }
   1863 
   1864 static void audio_save (QEMUFile *f, void *opaque)
   1865 {
   1866     (void) f;
   1867     (void) opaque;
   1868 }
   1869 
   1870 static int audio_load (QEMUFile *f, void *opaque, int version_id)
   1871 {
   1872     (void) f;
   1873     (void) opaque;
   1874 
   1875     if (version_id != 1) {
   1876         return -EINVAL;
   1877     }
   1878 
   1879     return 0;
   1880 }
   1881 
   1882 static int
   1883 find_audio_driver( AudioState*  s, int  out )
   1884 {
   1885     int                   i, done = 0, def;
   1886     const char*           envname;
   1887     const char*           drvname;
   1888     struct audio_driver*  drv     = NULL;
   1889     const char*           drvtype = out ? "output" : "input";
   1890 
   1891     envname = out ? "QEMU_AUDIO_OUT_DRV" : "QEMU_AUDIO_IN_DRV";
   1892     drvname = audio_get_conf_str(envname, NULL, &def);
   1893     if (drvname == NULL) {
   1894         drvname = audio_get_conf_str("QEMU_AUDIO_DRV", NULL, &def);
   1895     }
   1896 
   1897     if (drvname != NULL) {  /* look for a specific driver */
   1898         for (i = 0; i < sizeof (drvtab) / sizeof (drvtab[0]); i++) {
   1899             if (!strcmp (drvname, drvtab[i]->name)) {
   1900                 drv   = drvtab[i];
   1901                 break;
   1902             }
   1903         }
   1904     }
   1905 
   1906     if (drv != NULL) {
   1907         done  = !audio_driver_init (s, drv, out);
   1908         if (!done) {
   1909             dolog ("Could not initialize '%s' %s audio backend, trying default one.\n",
   1910                     drvname, drvtype);
   1911             dolog ("Run with -qemu -audio-help to list available backends\n");
   1912             drv = NULL;
   1913         }
   1914     }
   1915 
   1916     if (!drv) {
   1917         for (i = 0; i < sizeof (drvtab) / sizeof (drvtab[0]); i++) {
   1918             if (drvtab[i]->can_be_default) {
   1919                 drv   = drvtab[i];
   1920                 done  = !audio_driver_init (s, drv, out);
   1921                 if (done)
   1922                     break;
   1923             }
   1924         }
   1925     }
   1926 
   1927     if (!done) {
   1928         drv  = &no_audio_driver;
   1929         done = !audio_driver_init (s, drv, out);
   1930         if (!done) {
   1931             /* this should never happen */
   1932             dolog ("Could not initialize audio subsystem\n");
   1933             return -1;
   1934         }
   1935         dolog ("warning: Could not find suitable audio %s backend\n", drvtype);
   1936     }
   1937 
   1938     if (VERBOSE_CHECK(init))
   1939         dprint("using '%s' audio %s backend", drv->name, drvtype );
   1940     return 0;
   1941 }
   1942 
   1943 
   1944 static void audio_init (void)
   1945 {
   1946     AudioState *s = &glob_audio_state;
   1947 
   1948     if (s->drv_out && s->drv_in) {
   1949         return;
   1950     }
   1951 
   1952     LIST_INIT (&s->hw_head_out);
   1953     LIST_INIT (&s->hw_head_in);
   1954     LIST_INIT (&s->cap_head);
   1955     atexit (audio_atexit);
   1956 
   1957     s->ts = qemu_new_timer (vm_clock, audio_timer, s);
   1958     if (!s->ts) {
   1959         dolog ("Could not create audio timer\n");
   1960         return;
   1961     }
   1962 
   1963     audio_process_options ("AUDIO", audio_options);
   1964 
   1965     s->nb_hw_voices_out = conf.fixed_out.nb_voices;
   1966     s->nb_hw_voices_in = conf.fixed_in.nb_voices;
   1967 
   1968     if (s->nb_hw_voices_out <= 0) {
   1969         dolog ("Bogus number of playback voices %d, setting to 1\n",
   1970                s->nb_hw_voices_out);
   1971         s->nb_hw_voices_out = 1;
   1972     }
   1973 
   1974     if (s->nb_hw_voices_in <= 0) {
   1975         dolog ("Bogus number of capture voices %d, setting to 0\n",
   1976                s->nb_hw_voices_in);
   1977         s->nb_hw_voices_in = 0;
   1978     }
   1979 
   1980     if ( find_audio_driver (s, 0) != 0 ||
   1981          find_audio_driver (s, 1) != 0 ) {
   1982         qemu_del_timer (s->ts);
   1983         return;
   1984     }
   1985 
   1986     VMChangeStateEntry *e;
   1987 
   1988     if (conf.period.hertz <= 0) {
   1989         if (conf.period.hertz < 0) {
   1990             dolog ("warning: Timer period is negative - %d "
   1991                    "treating as zero\n",
   1992                    conf.period.hertz);
   1993         }
   1994         conf.period.ticks = 1;
   1995     } else {
   1996         conf.period.ticks = ticks_per_sec / conf.period.hertz;
   1997     }
   1998 
   1999     e = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s);
   2000     if (!e) {
   2001         dolog ("warning: Could not register change state handler\n"
   2002                "(Audio can continue looping even after stopping the VM)\n");
   2003     }
   2004 
   2005     initialized = 1;
   2006 
   2007     LIST_INIT (&s->card_head);
   2008     register_savevm ("audio", 0, 1, audio_save, audio_load, s);
   2009     qemu_mod_timer (s->ts, qemu_get_clock (vm_clock) + conf.period.ticks);
   2010 }
   2011 
   2012 void AUD_register_card (const char *name, QEMUSoundCard *card)
   2013 {
   2014     audio_init ();
   2015     card->name = qemu_strdup (name);
   2016     memset (&card->entries, 0, sizeof (card->entries));
   2017     LIST_INSERT_HEAD (&glob_audio_state.card_head, card, entries);
   2018 }
   2019 
   2020 void AUD_remove_card (QEMUSoundCard *card)
   2021 {
   2022     LIST_REMOVE (card, entries);
   2023     qemu_free (card->name);
   2024 }
   2025 
   2026 // this was added to work around a deadlock in SDL when quitting
   2027 void AUD_cleanup()
   2028 {
   2029     audio_atexit();
   2030 }
   2031 
   2032 CaptureVoiceOut *AUD_add_capture (
   2033     struct audsettings *as,
   2034     struct audio_capture_ops *ops,
   2035     void *cb_opaque
   2036     )
   2037 {
   2038     AudioState *s = &glob_audio_state;
   2039     CaptureVoiceOut *cap;
   2040     struct capture_callback *cb;
   2041 
   2042     if (audio_validate_settings (as)) {
   2043         dolog ("Invalid settings were passed when trying to add capture\n");
   2044         audio_print_settings (as);
   2045         goto err0;
   2046     }
   2047 
   2048     cb = audio_calloc (AUDIO_FUNC, 1, sizeof (*cb));
   2049     if (!cb) {
   2050         dolog ("Could not allocate capture callback information, size %zu\n",
   2051                sizeof (*cb));
   2052         goto err0;
   2053     }
   2054     cb->ops = *ops;
   2055     cb->opaque = cb_opaque;
   2056 
   2057     cap = audio_pcm_capture_find_specific (as);
   2058     if (cap) {
   2059         LIST_INSERT_HEAD (&cap->cb_head, cb, entries);
   2060         return cap;
   2061     }
   2062     else {
   2063         HWVoiceOut *hw;
   2064         CaptureVoiceOut *cap;
   2065 
   2066         cap = audio_calloc (AUDIO_FUNC, 1, sizeof (*cap));
   2067         if (!cap) {
   2068             dolog ("Could not allocate capture voice, size %zu\n",
   2069                    sizeof (*cap));
   2070             goto err1;
   2071         }
   2072 
   2073         hw = &cap->hw;
   2074         LIST_INIT (&hw->sw_head);
   2075         LIST_INIT (&cap->cb_head);
   2076 
   2077         /* XXX find a more elegant way */
   2078         hw->samples = 4096 * 4;
   2079         hw->mix_buf = audio_calloc (AUDIO_FUNC, hw->samples,
   2080                                     sizeof (struct st_sample));
   2081         if (!hw->mix_buf) {
   2082             dolog ("Could not allocate capture mix buffer (%d samples)\n",
   2083                    hw->samples);
   2084             goto err2;
   2085         }
   2086 
   2087         audio_pcm_init_info (&hw->info, as);
   2088 
   2089         cap->buf = audio_calloc (AUDIO_FUNC, hw->samples, 1 << hw->info.shift);
   2090         if (!cap->buf) {
   2091             dolog ("Could not allocate capture buffer "
   2092                    "(%d samples, each %d bytes)\n",
   2093                    hw->samples, 1 << hw->info.shift);
   2094             goto err3;
   2095         }
   2096 
   2097         hw->clip = mixeng_clip
   2098             [hw->info.nchannels == 2]
   2099             [hw->info.sign]
   2100             [hw->info.swap_endianness]
   2101             [audio_bits_to_index (hw->info.bits)];
   2102 
   2103         LIST_INSERT_HEAD (&s->cap_head, cap, entries);
   2104         LIST_INSERT_HEAD (&cap->cb_head, cb, entries);
   2105 
   2106         hw = NULL;
   2107         while ((hw = audio_pcm_hw_find_any_out (hw))) {
   2108             audio_attach_capture (hw);
   2109         }
   2110         return cap;
   2111 
   2112     err3:
   2113         qemu_free (cap->hw.mix_buf);
   2114     err2:
   2115         qemu_free (cap);
   2116     err1:
   2117         qemu_free (cb);
   2118     err0:
   2119         return NULL;
   2120     }
   2121 }
   2122 
   2123 void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
   2124 {
   2125     struct capture_callback *cb;
   2126 
   2127     for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
   2128         if (cb->opaque == cb_opaque) {
   2129             cb->ops.destroy (cb_opaque);
   2130             LIST_REMOVE (cb, entries);
   2131             qemu_free (cb);
   2132 
   2133             if (!cap->cb_head.lh_first) {
   2134                 SWVoiceOut *sw = cap->hw.sw_head.lh_first, *sw1;
   2135 
   2136                 while (sw) {
   2137                     SWVoiceCap *sc = (SWVoiceCap *) sw;
   2138 #ifdef DEBUG_CAPTURE
   2139                     dolog ("freeing %s\n", sw->name);
   2140 #endif
   2141 
   2142                     sw1 = sw->entries.le_next;
   2143                     if (sw->rate) {
   2144                         st_rate_stop (sw->rate);
   2145                         sw->rate = NULL;
   2146                     }
   2147                     LIST_REMOVE (sw, entries);
   2148                     LIST_REMOVE (sc, entries);
   2149                     qemu_free (sc);
   2150                     sw = sw1;
   2151                 }
   2152                 LIST_REMOVE (cap, entries);
   2153                 qemu_free (cap);
   2154             }
   2155             return;
   2156         }
   2157     }
   2158 }
   2159 
   2160 void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol)
   2161 {
   2162     if (sw) {
   2163         sw->vol.mute = mute;
   2164         sw->vol.l = nominal_volume.l * lvol / 255;
   2165         sw->vol.r = nominal_volume.r * rvol / 255;
   2166     }
   2167 }
   2168 
   2169 void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol)
   2170 {
   2171     if (sw) {
   2172         sw->vol.mute = mute;
   2173         sw->vol.l = nominal_volume.l * lvol / 255;
   2174         sw->vol.r = nominal_volume.r * rvol / 255;
   2175     }
   2176 }
   2177