xref: /openbmc/qemu/audio/audio.c (revision 125062e791258c68109f3a59cb7aca3dadbdb5a3)
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
9   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10   * copies of the Software, and to permit persons to whom the Software is
11   * furnished to do so, subject to the following conditions:
12   *
13   * The above copyright notice and this permission notice shall be included in
14   * all copies or substantial portions of the Software.
15   *
16   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
19   * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22   * THE SOFTWARE.
23   */
24  
25  #include "qemu/osdep.h"
26  #include "audio.h"
27  #include "migration/vmstate.h"
28  #include "monitor/monitor.h"
29  #include "qemu/timer.h"
30  #include "qapi/error.h"
31  #include "qapi/clone-visitor.h"
32  #include "qapi/qobject-input-visitor.h"
33  #include "qapi/qapi-visit-audio.h"
34  #include "qapi/qapi-commands-audio.h"
35  #include "qapi/qmp/qdict.h"
36  #include "qemu/cutils.h"
37  #include "qemu/error-report.h"
38  #include "qemu/log.h"
39  #include "qemu/module.h"
40  #include "qemu/help_option.h"
41  #include "sysemu/sysemu.h"
42  #include "sysemu/replay.h"
43  #include "sysemu/runstate.h"
44  #include "ui/qemu-spice.h"
45  #include "trace.h"
46  
47  #define AUDIO_CAP "audio"
48  #include "audio_int.h"
49  
50  /* #define DEBUG_LIVE */
51  /* #define DEBUG_OUT */
52  /* #define DEBUG_CAPTURE */
53  /* #define DEBUG_POLL */
54  
55  #define SW_NAME(sw) (sw)->name ? (sw)->name : "unknown"
56  
57  
58  /* Order of CONFIG_AUDIO_DRIVERS is import.
59     The 1st one is the one used by default, that is the reason
60      that we generate the list.
61  */
62  const char *audio_prio_list[] = {
63      "spice",
64      CONFIG_AUDIO_DRIVERS
65      "none",
66      NULL
67  };
68  
69  static QLIST_HEAD(, audio_driver) audio_drivers;
70  static AudiodevListHead audiodevs =
71      QSIMPLEQ_HEAD_INITIALIZER(audiodevs);
72  static AudiodevListHead default_audiodevs =
73      QSIMPLEQ_HEAD_INITIALIZER(default_audiodevs);
74  
75  
76  void audio_driver_register(audio_driver *drv)
77  {
78      QLIST_INSERT_HEAD(&audio_drivers, drv, next);
79  }
80  
81  static audio_driver *audio_driver_lookup(const char *name)
82  {
83      struct audio_driver *d;
84      Error *local_err = NULL;
85      int rv;
86  
87      QLIST_FOREACH(d, &audio_drivers, next) {
88          if (strcmp(name, d->name) == 0) {
89              return d;
90          }
91      }
92      rv = audio_module_load(name, &local_err);
93      if (rv > 0) {
94          QLIST_FOREACH(d, &audio_drivers, next) {
95              if (strcmp(name, d->name) == 0) {
96                  return d;
97              }
98          }
99      } else if (rv < 0) {
100          error_report_err(local_err);
101      }
102      return NULL;
103  }
104  
105  static QTAILQ_HEAD(AudioStateHead, AudioState) audio_states =
106      QTAILQ_HEAD_INITIALIZER(audio_states);
107  static AudioState *default_audio_state;
108  
109  const struct mixeng_volume nominal_volume = {
110      .mute = 0,
111  #ifdef FLOAT_MIXENG
112      .r = 1.0,
113      .l = 1.0,
114  #else
115      .r = 1ULL << 32,
116      .l = 1ULL << 32,
117  #endif
118  };
119  
120  int audio_bug (const char *funcname, int cond)
121  {
122      if (cond) {
123          static int shown;
124  
125          AUD_log (NULL, "A bug was just triggered in %s\n", funcname);
126          if (!shown) {
127              shown = 1;
128              AUD_log (NULL, "Save all your work and restart without audio\n");
129              AUD_log (NULL, "I am sorry\n");
130          }
131          AUD_log (NULL, "Context:\n");
132      }
133  
134      return cond;
135  }
136  
137  static inline int audio_bits_to_index (int bits)
138  {
139      switch (bits) {
140      case 8:
141          return 0;
142  
143      case 16:
144          return 1;
145  
146      case 32:
147          return 2;
148  
149      default:
150          audio_bug ("bits_to_index", 1);
151          AUD_log (NULL, "invalid bits %d\n", bits);
152          return 0;
153      }
154  }
155  
156  void AUD_vlog (const char *cap, const char *fmt, va_list ap)
157  {
158      if (cap) {
159          fprintf(stderr, "%s: ", cap);
160      }
161  
162      vfprintf(stderr, fmt, ap);
163  }
164  
165  void AUD_log (const char *cap, const char *fmt, ...)
166  {
167      va_list ap;
168  
169      va_start (ap, fmt);
170      AUD_vlog (cap, fmt, ap);
171      va_end (ap);
172  }
173  
174  static void audio_print_settings (struct audsettings *as)
175  {
176      dolog ("frequency=%d nchannels=%d fmt=", as->freq, as->nchannels);
177  
178      switch (as->fmt) {
179      case AUDIO_FORMAT_S8:
180          AUD_log (NULL, "S8");
181          break;
182      case AUDIO_FORMAT_U8:
183          AUD_log (NULL, "U8");
184          break;
185      case AUDIO_FORMAT_S16:
186          AUD_log (NULL, "S16");
187          break;
188      case AUDIO_FORMAT_U16:
189          AUD_log (NULL, "U16");
190          break;
191      case AUDIO_FORMAT_S32:
192          AUD_log (NULL, "S32");
193          break;
194      case AUDIO_FORMAT_U32:
195          AUD_log (NULL, "U32");
196          break;
197      case AUDIO_FORMAT_F32:
198          AUD_log (NULL, "F32");
199          break;
200      default:
201          AUD_log (NULL, "invalid(%d)", as->fmt);
202          break;
203      }
204  
205      AUD_log (NULL, " endianness=");
206      switch (as->endianness) {
207      case 0:
208          AUD_log (NULL, "little");
209          break;
210      case 1:
211          AUD_log (NULL, "big");
212          break;
213      default:
214          AUD_log (NULL, "invalid");
215          break;
216      }
217      AUD_log (NULL, "\n");
218  }
219  
220  static int audio_validate_settings (struct audsettings *as)
221  {
222      int invalid;
223  
224      invalid = as->nchannels < 1;
225      invalid |= as->endianness != 0 && as->endianness != 1;
226  
227      switch (as->fmt) {
228      case AUDIO_FORMAT_S8:
229      case AUDIO_FORMAT_U8:
230      case AUDIO_FORMAT_S16:
231      case AUDIO_FORMAT_U16:
232      case AUDIO_FORMAT_S32:
233      case AUDIO_FORMAT_U32:
234      case AUDIO_FORMAT_F32:
235          break;
236      default:
237          invalid = 1;
238          break;
239      }
240  
241      invalid |= as->freq <= 0;
242      return invalid ? -1 : 0;
243  }
244  
245  static int audio_pcm_info_eq (struct audio_pcm_info *info, struct audsettings *as)
246  {
247      int bits = 8;
248      bool is_signed = false, is_float = false;
249  
250      switch (as->fmt) {
251      case AUDIO_FORMAT_S8:
252          is_signed = true;
253          /* fall through */
254      case AUDIO_FORMAT_U8:
255          break;
256  
257      case AUDIO_FORMAT_S16:
258          is_signed = true;
259          /* fall through */
260      case AUDIO_FORMAT_U16:
261          bits = 16;
262          break;
263  
264      case AUDIO_FORMAT_F32:
265          is_float = true;
266          /* fall through */
267      case AUDIO_FORMAT_S32:
268          is_signed = true;
269          /* fall through */
270      case AUDIO_FORMAT_U32:
271          bits = 32;
272          break;
273  
274      default:
275          abort();
276      }
277      return info->freq == as->freq
278          && info->nchannels == as->nchannels
279          && info->is_signed == is_signed
280          && info->is_float == is_float
281          && info->bits == bits
282          && info->swap_endianness == (as->endianness != AUDIO_HOST_ENDIANNESS);
283  }
284  
285  void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings *as)
286  {
287      int bits = 8, mul;
288      bool is_signed = false, is_float = false;
289  
290      switch (as->fmt) {
291      case AUDIO_FORMAT_S8:
292          is_signed = true;
293          /* fall through */
294      case AUDIO_FORMAT_U8:
295          mul = 1;
296          break;
297  
298      case AUDIO_FORMAT_S16:
299          is_signed = true;
300          /* fall through */
301      case AUDIO_FORMAT_U16:
302          bits = 16;
303          mul = 2;
304          break;
305  
306      case AUDIO_FORMAT_F32:
307          is_float = true;
308          /* fall through */
309      case AUDIO_FORMAT_S32:
310          is_signed = true;
311          /* fall through */
312      case AUDIO_FORMAT_U32:
313          bits = 32;
314          mul = 4;
315          break;
316  
317      default:
318          abort();
319      }
320  
321      info->freq = as->freq;
322      info->bits = bits;
323      info->is_signed = is_signed;
324      info->is_float = is_float;
325      info->nchannels = as->nchannels;
326      info->bytes_per_frame = as->nchannels * mul;
327      info->bytes_per_second = info->freq * info->bytes_per_frame;
328      info->swap_endianness = (as->endianness != AUDIO_HOST_ENDIANNESS);
329  }
330  
331  void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int len)
332  {
333      if (!len) {
334          return;
335      }
336  
337      if (info->is_signed || info->is_float) {
338          memset(buf, 0x00, len * info->bytes_per_frame);
339      } else {
340          switch (info->bits) {
341          case 8:
342              memset(buf, 0x80, len * info->bytes_per_frame);
343              break;
344  
345          case 16:
346              {
347                  int i;
348                  uint16_t *p = buf;
349                  short s = INT16_MAX;
350  
351                  if (info->swap_endianness) {
352                      s = bswap16 (s);
353                  }
354  
355                  for (i = 0; i < len * info->nchannels; i++) {
356                      p[i] = s;
357                  }
358              }
359              break;
360  
361          case 32:
362              {
363                  int i;
364                  uint32_t *p = buf;
365                  int32_t s = INT32_MAX;
366  
367                  if (info->swap_endianness) {
368                      s = bswap32 (s);
369                  }
370  
371                  for (i = 0; i < len * info->nchannels; i++) {
372                      p[i] = s;
373                  }
374              }
375              break;
376  
377          default:
378              AUD_log (NULL, "audio_pcm_info_clear_buf: invalid bits %d\n",
379                       info->bits);
380              break;
381          }
382      }
383  }
384  
385  /*
386   * Capture
387   */
388  static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioState *s,
389                                                          struct audsettings *as)
390  {
391      CaptureVoiceOut *cap;
392  
393      for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
394          if (audio_pcm_info_eq (&cap->hw.info, as)) {
395              return cap;
396          }
397      }
398      return NULL;
399  }
400  
401  static void audio_notify_capture (CaptureVoiceOut *cap, audcnotification_e cmd)
402  {
403      struct capture_callback *cb;
404  
405  #ifdef DEBUG_CAPTURE
406      dolog ("notification %d sent\n", cmd);
407  #endif
408      for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
409          cb->ops.notify (cb->opaque, cmd);
410      }
411  }
412  
413  static void audio_capture_maybe_changed (CaptureVoiceOut *cap, int enabled)
414  {
415      if (cap->hw.enabled != enabled) {
416          audcnotification_e cmd;
417          cap->hw.enabled = enabled;
418          cmd = enabled ? AUD_CNOTIFY_ENABLE : AUD_CNOTIFY_DISABLE;
419          audio_notify_capture (cap, cmd);
420      }
421  }
422  
423  static void audio_recalc_and_notify_capture (CaptureVoiceOut *cap)
424  {
425      HWVoiceOut *hw = &cap->hw;
426      SWVoiceOut *sw;
427      int enabled = 0;
428  
429      for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
430          if (sw->active) {
431              enabled = 1;
432              break;
433          }
434      }
435      audio_capture_maybe_changed (cap, enabled);
436  }
437  
438  static void audio_detach_capture (HWVoiceOut *hw)
439  {
440      SWVoiceCap *sc = hw->cap_head.lh_first;
441  
442      while (sc) {
443          SWVoiceCap *sc1 = sc->entries.le_next;
444          SWVoiceOut *sw = &sc->sw;
445          CaptureVoiceOut *cap = sc->cap;
446          int was_active = sw->active;
447  
448          if (sw->rate) {
449              st_rate_stop (sw->rate);
450              sw->rate = NULL;
451          }
452  
453          QLIST_REMOVE (sw, entries);
454          QLIST_REMOVE (sc, entries);
455          g_free (sc);
456          if (was_active) {
457              /* We have removed soft voice from the capture:
458                 this might have changed the overall status of the capture
459                 since this might have been the only active voice */
460              audio_recalc_and_notify_capture (cap);
461          }
462          sc = sc1;
463      }
464  }
465  
466  static int audio_attach_capture (HWVoiceOut *hw)
467  {
468      AudioState *s = hw->s;
469      CaptureVoiceOut *cap;
470  
471      audio_detach_capture (hw);
472      for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
473          SWVoiceCap *sc;
474          SWVoiceOut *sw;
475          HWVoiceOut *hw_cap = &cap->hw;
476  
477          sc = g_malloc0(sizeof(*sc));
478  
479          sc->cap = cap;
480          sw = &sc->sw;
481          sw->hw = hw_cap;
482          sw->info = hw->info;
483          sw->empty = 1;
484          sw->active = hw->enabled;
485          sw->vol = nominal_volume;
486          sw->rate = st_rate_start (sw->info.freq, hw_cap->info.freq);
487          QLIST_INSERT_HEAD (&hw_cap->sw_head, sw, entries);
488          QLIST_INSERT_HEAD (&hw->cap_head, sc, entries);
489  #ifdef DEBUG_CAPTURE
490          sw->name = g_strdup_printf ("for %p %d,%d,%d",
491                                      hw, sw->info.freq, sw->info.bits,
492                                      sw->info.nchannels);
493          dolog ("Added %s active = %d\n", sw->name, sw->active);
494  #endif
495          if (sw->active) {
496              audio_capture_maybe_changed (cap, 1);
497          }
498      }
499      return 0;
500  }
501  
502  /*
503   * Hard voice (capture)
504   */
505  static size_t audio_pcm_hw_find_min_in (HWVoiceIn *hw)
506  {
507      SWVoiceIn *sw;
508      size_t m = hw->total_samples_captured;
509  
510      for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
511          if (sw->active) {
512              m = MIN (m, sw->total_hw_samples_acquired);
513          }
514      }
515      return m;
516  }
517  
518  static size_t audio_pcm_hw_get_live_in(HWVoiceIn *hw)
519  {
520      size_t live = hw->total_samples_captured - audio_pcm_hw_find_min_in (hw);
521      if (audio_bug(__func__, live > hw->conv_buf.size)) {
522          dolog("live=%zu hw->conv_buf.size=%zu\n", live, hw->conv_buf.size);
523          return 0;
524      }
525      return live;
526  }
527  
528  static size_t audio_pcm_hw_conv_in(HWVoiceIn *hw, void *pcm_buf, size_t samples)
529  {
530      size_t conv = 0;
531      STSampleBuffer *conv_buf = &hw->conv_buf;
532  
533      while (samples) {
534          uint8_t *src = advance(pcm_buf, conv * hw->info.bytes_per_frame);
535          size_t proc = MIN(samples, conv_buf->size - conv_buf->pos);
536  
537          hw->conv(conv_buf->buffer + conv_buf->pos, src, proc);
538          conv_buf->pos = (conv_buf->pos + proc) % conv_buf->size;
539          samples -= proc;
540          conv += proc;
541      }
542  
543      return conv;
544  }
545  
546  /*
547   * Soft voice (capture)
548   */
549  static void audio_pcm_sw_resample_in(SWVoiceIn *sw,
550      size_t frames_in_max, size_t frames_out_max,
551      size_t *total_in, size_t *total_out)
552  {
553      HWVoiceIn *hw = sw->hw;
554      struct st_sample *src, *dst;
555      size_t live, rpos, frames_in, frames_out;
556  
557      live = hw->total_samples_captured - sw->total_hw_samples_acquired;
558      rpos = audio_ring_posb(hw->conv_buf.pos, live, hw->conv_buf.size);
559  
560      /* resample conv_buf from rpos to end of buffer */
561      src = hw->conv_buf.buffer + rpos;
562      frames_in = MIN(frames_in_max, hw->conv_buf.size - rpos);
563      dst = sw->resample_buf.buffer;
564      frames_out = frames_out_max;
565      st_rate_flow(sw->rate, src, dst, &frames_in, &frames_out);
566      rpos += frames_in;
567      *total_in = frames_in;
568      *total_out = frames_out;
569  
570      /* resample conv_buf from start of buffer if there are input frames left */
571      if (frames_in_max - frames_in && rpos == hw->conv_buf.size) {
572          src = hw->conv_buf.buffer;
573          frames_in = frames_in_max - frames_in;
574          dst += frames_out;
575          frames_out = frames_out_max - frames_out;
576          st_rate_flow(sw->rate, src, dst, &frames_in, &frames_out);
577          *total_in += frames_in;
578          *total_out += frames_out;
579      }
580  }
581  
582  static size_t audio_pcm_sw_read(SWVoiceIn *sw, void *buf, size_t buf_len)
583  {
584      HWVoiceIn *hw = sw->hw;
585      size_t live, frames_out_max, total_in, total_out;
586  
587      live = hw->total_samples_captured - sw->total_hw_samples_acquired;
588      if (!live) {
589          return 0;
590      }
591      if (audio_bug(__func__, live > hw->conv_buf.size)) {
592          dolog("live_in=%zu hw->conv_buf.size=%zu\n", live, hw->conv_buf.size);
593          return 0;
594      }
595  
596      frames_out_max = MIN(buf_len / sw->info.bytes_per_frame,
597                           sw->resample_buf.size);
598  
599      audio_pcm_sw_resample_in(sw, live, frames_out_max, &total_in, &total_out);
600  
601      if (!hw->pcm_ops->volume_in) {
602          mixeng_volume(sw->resample_buf.buffer, total_out, &sw->vol);
603      }
604      sw->clip(buf, sw->resample_buf.buffer, total_out);
605  
606      sw->total_hw_samples_acquired += total_in;
607      return total_out * sw->info.bytes_per_frame;
608  }
609  
610  /*
611   * Hard voice (playback)
612   */
613  static size_t audio_pcm_hw_find_min_out (HWVoiceOut *hw, int *nb_livep)
614  {
615      SWVoiceOut *sw;
616      size_t m = SIZE_MAX;
617      int nb_live = 0;
618  
619      for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
620          if (sw->active || !sw->empty) {
621              m = MIN (m, sw->total_hw_samples_mixed);
622              nb_live += 1;
623          }
624      }
625  
626      *nb_livep = nb_live;
627      return m;
628  }
629  
630  static size_t audio_pcm_hw_get_live_out (HWVoiceOut *hw, int *nb_live)
631  {
632      size_t smin;
633      int nb_live1;
634  
635      smin = audio_pcm_hw_find_min_out (hw, &nb_live1);
636      if (nb_live) {
637          *nb_live = nb_live1;
638      }
639  
640      if (nb_live1) {
641          size_t live = smin;
642  
643          if (audio_bug(__func__, live > hw->mix_buf.size)) {
644              dolog("live=%zu hw->mix_buf.size=%zu\n", live, hw->mix_buf.size);
645              return 0;
646          }
647          return live;
648      }
649      return 0;
650  }
651  
652  static size_t audio_pcm_hw_get_free(HWVoiceOut *hw)
653  {
654      return (hw->pcm_ops->buffer_get_free ? hw->pcm_ops->buffer_get_free(hw) :
655              INT_MAX) / hw->info.bytes_per_frame;
656  }
657  
658  static void audio_pcm_hw_clip_out(HWVoiceOut *hw, void *pcm_buf, size_t len)
659  {
660      size_t clipped = 0;
661      size_t pos = hw->mix_buf.pos;
662  
663      while (len) {
664          st_sample *src = hw->mix_buf.buffer + pos;
665          uint8_t *dst = advance(pcm_buf, clipped * hw->info.bytes_per_frame);
666          size_t samples_till_end_of_buf = hw->mix_buf.size - pos;
667          size_t samples_to_clip = MIN(len, samples_till_end_of_buf);
668  
669          hw->clip(dst, src, samples_to_clip);
670  
671          pos = (pos + samples_to_clip) % hw->mix_buf.size;
672          len -= samples_to_clip;
673          clipped += samples_to_clip;
674      }
675  }
676  
677  /*
678   * Soft voice (playback)
679   */
680  static void audio_pcm_sw_resample_out(SWVoiceOut *sw,
681      size_t frames_in_max, size_t frames_out_max,
682      size_t *total_in, size_t *total_out)
683  {
684      HWVoiceOut *hw = sw->hw;
685      struct st_sample *src, *dst;
686      size_t live, wpos, frames_in, frames_out;
687  
688      live = sw->total_hw_samples_mixed;
689      wpos = (hw->mix_buf.pos + live) % hw->mix_buf.size;
690  
691      /* write to mix_buf from wpos to end of buffer */
692      src = sw->resample_buf.buffer;
693      frames_in = frames_in_max;
694      dst = hw->mix_buf.buffer + wpos;
695      frames_out = MIN(frames_out_max, hw->mix_buf.size - wpos);
696      st_rate_flow_mix(sw->rate, src, dst, &frames_in, &frames_out);
697      wpos += frames_out;
698      *total_in = frames_in;
699      *total_out = frames_out;
700  
701      /* write to mix_buf from start of buffer if there are input frames left */
702      if (frames_in_max - frames_in > 0 && wpos == hw->mix_buf.size) {
703          src += frames_in;
704          frames_in = frames_in_max - frames_in;
705          dst = hw->mix_buf.buffer;
706          frames_out = frames_out_max - frames_out;
707          st_rate_flow_mix(sw->rate, src, dst, &frames_in, &frames_out);
708          *total_in += frames_in;
709          *total_out += frames_out;
710      }
711  }
712  
713  static size_t audio_pcm_sw_write(SWVoiceOut *sw, void *buf, size_t buf_len)
714  {
715      HWVoiceOut *hw = sw->hw;
716      size_t live, dead, hw_free, sw_max, fe_max;
717      size_t frames_in_max, frames_out_max, total_in, total_out;
718  
719      live = sw->total_hw_samples_mixed;
720      if (audio_bug(__func__, live > hw->mix_buf.size)) {
721          dolog("live=%zu hw->mix_buf.size=%zu\n", live, hw->mix_buf.size);
722          return 0;
723      }
724  
725      if (live == hw->mix_buf.size) {
726  #ifdef DEBUG_OUT
727          dolog ("%s is full %zu\n", sw->name, live);
728  #endif
729          return 0;
730      }
731  
732      dead = hw->mix_buf.size - live;
733      hw_free = audio_pcm_hw_get_free(hw);
734      hw_free = hw_free > live ? hw_free - live : 0;
735      frames_out_max = MIN(dead, hw_free);
736      sw_max = st_rate_frames_in(sw->rate, frames_out_max);
737      fe_max = MIN(buf_len / sw->info.bytes_per_frame + sw->resample_buf.pos,
738                   sw->resample_buf.size);
739      frames_in_max = MIN(sw_max, fe_max);
740  
741      if (!frames_in_max) {
742          return 0;
743      }
744  
745      if (frames_in_max > sw->resample_buf.pos) {
746          sw->conv(sw->resample_buf.buffer + sw->resample_buf.pos,
747                   buf, frames_in_max - sw->resample_buf.pos);
748          if (!sw->hw->pcm_ops->volume_out) {
749              mixeng_volume(sw->resample_buf.buffer + sw->resample_buf.pos,
750                            frames_in_max - sw->resample_buf.pos, &sw->vol);
751          }
752      }
753  
754      audio_pcm_sw_resample_out(sw, frames_in_max, frames_out_max,
755                                &total_in, &total_out);
756  
757      sw->total_hw_samples_mixed += total_out;
758      sw->empty = sw->total_hw_samples_mixed == 0;
759  
760      /*
761       * Upsampling may leave one audio frame in the resample buffer. Decrement
762       * total_in by one if there was a leftover frame from the previous resample
763       * pass in the resample buffer. Increment total_in by one if the current
764       * resample pass left one frame in the resample buffer.
765       */
766      if (frames_in_max - total_in == 1) {
767          /* copy one leftover audio frame to the beginning of the buffer */
768          *sw->resample_buf.buffer = *(sw->resample_buf.buffer + total_in);
769          total_in += 1 - sw->resample_buf.pos;
770          sw->resample_buf.pos = 1;
771      } else if (total_in >= sw->resample_buf.pos) {
772          total_in -= sw->resample_buf.pos;
773          sw->resample_buf.pos = 0;
774      }
775  
776  #ifdef DEBUG_OUT
777      dolog (
778          "%s: write size %zu written %zu total mixed %zu\n",
779          SW_NAME(sw),
780          buf_len / sw->info.bytes_per_frame,
781          total_in,
782          sw->total_hw_samples_mixed
783          );
784  #endif
785  
786      return total_in * sw->info.bytes_per_frame;
787  }
788  
789  #ifdef DEBUG_AUDIO
790  static void audio_pcm_print_info (const char *cap, struct audio_pcm_info *info)
791  {
792      dolog("%s: bits %d, sign %d, float %d, freq %d, nchan %d\n",
793            cap, info->bits, info->is_signed, info->is_float, info->freq,
794            info->nchannels);
795  }
796  #endif
797  
798  #define DAC
799  #include "audio_template.h"
800  #undef DAC
801  #include "audio_template.h"
802  
803  /*
804   * Timer
805   */
806  static int audio_is_timer_needed(AudioState *s)
807  {
808      HWVoiceIn *hwi = NULL;
809      HWVoiceOut *hwo = NULL;
810  
811      while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
812          if (!hwo->poll_mode) {
813              return 1;
814          }
815      }
816      while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
817          if (!hwi->poll_mode) {
818              return 1;
819          }
820      }
821      return 0;
822  }
823  
824  static void audio_reset_timer (AudioState *s)
825  {
826      if (audio_is_timer_needed(s)) {
827          timer_mod_anticipate_ns(s->ts,
828              qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) + s->period_ticks);
829          if (!s->timer_running) {
830              s->timer_running = true;
831              s->timer_last = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
832              trace_audio_timer_start(s->period_ticks / SCALE_MS);
833          }
834      } else {
835          timer_del(s->ts);
836          if (s->timer_running) {
837              s->timer_running = false;
838              trace_audio_timer_stop();
839          }
840      }
841  }
842  
843  static void audio_timer (void *opaque)
844  {
845      int64_t now, diff;
846      AudioState *s = opaque;
847  
848      now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
849      diff = now - s->timer_last;
850      if (diff > s->period_ticks * 3 / 2) {
851          trace_audio_timer_delayed(diff / SCALE_MS);
852      }
853      s->timer_last = now;
854  
855      audio_run(s, "timer");
856      audio_reset_timer(s);
857  }
858  
859  /*
860   * Public API
861   */
862  size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)
863  {
864      HWVoiceOut *hw;
865  
866      if (!sw) {
867          /* XXX: Consider options */
868          return size;
869      }
870      hw = sw->hw;
871  
872      if (!hw->enabled) {
873          dolog ("Writing to disabled voice %s\n", SW_NAME (sw));
874          return 0;
875      }
876  
877      if (audio_get_pdo_out(hw->s->dev)->mixing_engine) {
878          return audio_pcm_sw_write(sw, buf, size);
879      } else {
880          return hw->pcm_ops->write(hw, buf, size);
881      }
882  }
883  
884  size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)
885  {
886      HWVoiceIn *hw;
887  
888      if (!sw) {
889          /* XXX: Consider options */
890          return size;
891      }
892      hw = sw->hw;
893  
894      if (!hw->enabled) {
895          dolog ("Reading from disabled voice %s\n", SW_NAME (sw));
896          return 0;
897      }
898  
899      if (audio_get_pdo_in(hw->s->dev)->mixing_engine) {
900          return audio_pcm_sw_read(sw, buf, size);
901      } else {
902          return hw->pcm_ops->read(hw, buf, size);
903      }
904  }
905  
906  int AUD_get_buffer_size_out(SWVoiceOut *sw)
907  {
908      return sw->hw->samples * sw->hw->info.bytes_per_frame;
909  }
910  
911  void AUD_set_active_out (SWVoiceOut *sw, int on)
912  {
913      HWVoiceOut *hw;
914  
915      if (!sw) {
916          return;
917      }
918  
919      hw = sw->hw;
920      if (sw->active != on) {
921          AudioState *s = sw->s;
922          SWVoiceOut *temp_sw;
923          SWVoiceCap *sc;
924  
925          if (on) {
926              hw->pending_disable = 0;
927              if (!hw->enabled) {
928                  hw->enabled = 1;
929                  if (s->vm_running) {
930                      if (hw->pcm_ops->enable_out) {
931                          hw->pcm_ops->enable_out(hw, true);
932                      }
933                      audio_reset_timer (s);
934                  }
935              }
936          } else {
937              if (hw->enabled) {
938                  int nb_active = 0;
939  
940                  for (temp_sw = hw->sw_head.lh_first; temp_sw;
941                       temp_sw = temp_sw->entries.le_next) {
942                      nb_active += temp_sw->active != 0;
943                  }
944  
945                  hw->pending_disable = nb_active == 1;
946              }
947          }
948  
949          for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
950              sc->sw.active = hw->enabled;
951              if (hw->enabled) {
952                  audio_capture_maybe_changed (sc->cap, 1);
953              }
954          }
955          sw->active = on;
956      }
957  }
958  
959  void AUD_set_active_in (SWVoiceIn *sw, int on)
960  {
961      HWVoiceIn *hw;
962  
963      if (!sw) {
964          return;
965      }
966  
967      hw = sw->hw;
968      if (sw->active != on) {
969          AudioState *s = sw->s;
970          SWVoiceIn *temp_sw;
971  
972          if (on) {
973              if (!hw->enabled) {
974                  hw->enabled = 1;
975                  if (s->vm_running) {
976                      if (hw->pcm_ops->enable_in) {
977                          hw->pcm_ops->enable_in(hw, true);
978                      }
979                      audio_reset_timer (s);
980                  }
981              }
982              sw->total_hw_samples_acquired = hw->total_samples_captured;
983          } else {
984              if (hw->enabled) {
985                  int nb_active = 0;
986  
987                  for (temp_sw = hw->sw_head.lh_first; temp_sw;
988                       temp_sw = temp_sw->entries.le_next) {
989                      nb_active += temp_sw->active != 0;
990                  }
991  
992                  if (nb_active == 1) {
993                      hw->enabled = 0;
994                      if (hw->pcm_ops->enable_in) {
995                          hw->pcm_ops->enable_in(hw, false);
996                      }
997                  }
998              }
999          }
1000          sw->active = on;
1001      }
1002  }
1003  
1004  static size_t audio_get_avail (SWVoiceIn *sw)
1005  {
1006      size_t live;
1007  
1008      if (!sw) {
1009          return 0;
1010      }
1011  
1012      live = sw->hw->total_samples_captured - sw->total_hw_samples_acquired;
1013      if (audio_bug(__func__, live > sw->hw->conv_buf.size)) {
1014          dolog("live=%zu sw->hw->conv_buf.size=%zu\n", live,
1015                sw->hw->conv_buf.size);
1016          return 0;
1017      }
1018  
1019      ldebug (
1020          "%s: get_avail live %zu frontend frames %u\n",
1021          SW_NAME (sw),
1022          live, st_rate_frames_out(sw->rate, live)
1023          );
1024  
1025      return live;
1026  }
1027  
1028  static size_t audio_get_free(SWVoiceOut *sw)
1029  {
1030      size_t live, dead;
1031  
1032      if (!sw) {
1033          return 0;
1034      }
1035  
1036      live = sw->total_hw_samples_mixed;
1037  
1038      if (audio_bug(__func__, live > sw->hw->mix_buf.size)) {
1039          dolog("live=%zu sw->hw->mix_buf.size=%zu\n", live,
1040                sw->hw->mix_buf.size);
1041          return 0;
1042      }
1043  
1044      dead = sw->hw->mix_buf.size - live;
1045  
1046  #ifdef DEBUG_OUT
1047      dolog("%s: get_free live %zu dead %zu frontend frames %u\n",
1048            SW_NAME(sw), live, dead, st_rate_frames_in(sw->rate, dead));
1049  #endif
1050  
1051      return dead;
1052  }
1053  
1054  static void audio_capture_mix_and_clear(HWVoiceOut *hw, size_t rpos,
1055                                          size_t samples)
1056  {
1057      size_t n;
1058  
1059      if (hw->enabled) {
1060          SWVoiceCap *sc;
1061  
1062          for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1063              SWVoiceOut *sw = &sc->sw;
1064              size_t rpos2 = rpos;
1065  
1066              n = samples;
1067              while (n) {
1068                  size_t till_end_of_hw = hw->mix_buf.size - rpos2;
1069                  size_t to_read = MIN(till_end_of_hw, n);
1070                  size_t live, frames_in, frames_out;
1071  
1072                  sw->resample_buf.buffer = hw->mix_buf.buffer + rpos2;
1073                  sw->resample_buf.size = to_read;
1074                  live = sw->total_hw_samples_mixed;
1075  
1076                  audio_pcm_sw_resample_out(sw,
1077                                            to_read, sw->hw->mix_buf.size - live,
1078                                            &frames_in, &frames_out);
1079  
1080                  sw->total_hw_samples_mixed += frames_out;
1081                  sw->empty = sw->total_hw_samples_mixed == 0;
1082  
1083                  if (to_read - frames_in) {
1084                      dolog("Could not mix %zu frames into a capture "
1085                            "buffer, mixed %zu\n",
1086                            to_read, frames_in);
1087                      break;
1088                  }
1089                  n -= to_read;
1090                  rpos2 = (rpos2 + to_read) % hw->mix_buf.size;
1091              }
1092          }
1093      }
1094  
1095      n = MIN(samples, hw->mix_buf.size - rpos);
1096      mixeng_clear(hw->mix_buf.buffer + rpos, n);
1097      mixeng_clear(hw->mix_buf.buffer, samples - n);
1098  }
1099  
1100  static size_t audio_pcm_hw_run_out(HWVoiceOut *hw, size_t live)
1101  {
1102      size_t clipped = 0;
1103  
1104      while (live) {
1105          size_t size = live * hw->info.bytes_per_frame;
1106          size_t decr, proc;
1107          void *buf = hw->pcm_ops->get_buffer_out(hw, &size);
1108  
1109          if (size == 0) {
1110              break;
1111          }
1112  
1113          decr = MIN(size / hw->info.bytes_per_frame, live);
1114          if (buf) {
1115              audio_pcm_hw_clip_out(hw, buf, decr);
1116          }
1117          proc = hw->pcm_ops->put_buffer_out(hw, buf,
1118                                             decr * hw->info.bytes_per_frame) /
1119              hw->info.bytes_per_frame;
1120  
1121          live -= proc;
1122          clipped += proc;
1123          hw->mix_buf.pos = (hw->mix_buf.pos + proc) % hw->mix_buf.size;
1124  
1125          if (proc == 0 || proc < decr) {
1126              break;
1127          }
1128      }
1129  
1130      if (hw->pcm_ops->run_buffer_out) {
1131          hw->pcm_ops->run_buffer_out(hw);
1132      }
1133  
1134      return clipped;
1135  }
1136  
1137  static void audio_run_out (AudioState *s)
1138  {
1139      HWVoiceOut *hw = NULL;
1140      SWVoiceOut *sw;
1141  
1142      while ((hw = audio_pcm_hw_find_any_enabled_out(s, hw))) {
1143          size_t played, live, prev_rpos;
1144          size_t hw_free = audio_pcm_hw_get_free(hw);
1145          int nb_live;
1146  
1147          if (!audio_get_pdo_out(s->dev)->mixing_engine) {
1148              /* there is exactly 1 sw for each hw with no mixeng */
1149              sw = hw->sw_head.lh_first;
1150  
1151              if (hw->pending_disable) {
1152                  hw->enabled = 0;
1153                  hw->pending_disable = 0;
1154                  if (hw->pcm_ops->enable_out) {
1155                      hw->pcm_ops->enable_out(hw, false);
1156                  }
1157              }
1158  
1159              if (sw->active) {
1160                  sw->callback.fn(sw->callback.opaque,
1161                                  hw_free * sw->info.bytes_per_frame);
1162              }
1163  
1164              if (hw->pcm_ops->run_buffer_out) {
1165                  hw->pcm_ops->run_buffer_out(hw);
1166              }
1167  
1168              continue;
1169          }
1170  
1171          for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1172              if (sw->active) {
1173                  size_t sw_free = audio_get_free(sw);
1174                  size_t free;
1175  
1176                  if (hw_free > sw->total_hw_samples_mixed) {
1177                      free = st_rate_frames_in(sw->rate,
1178                          MIN(sw_free, hw_free - sw->total_hw_samples_mixed));
1179                  } else {
1180                      free = 0;
1181                  }
1182                  if (free > sw->resample_buf.pos) {
1183                      free = MIN(free, sw->resample_buf.size)
1184                             - sw->resample_buf.pos;
1185                      sw->callback.fn(sw->callback.opaque,
1186                                      free * sw->info.bytes_per_frame);
1187                  }
1188              }
1189          }
1190  
1191          live = audio_pcm_hw_get_live_out (hw, &nb_live);
1192          if (!nb_live) {
1193              live = 0;
1194          }
1195  
1196          if (audio_bug(__func__, live > hw->mix_buf.size)) {
1197              dolog("live=%zu hw->mix_buf.size=%zu\n", live, hw->mix_buf.size);
1198              continue;
1199          }
1200  
1201          if (hw->pending_disable && !nb_live) {
1202              SWVoiceCap *sc;
1203  #ifdef DEBUG_OUT
1204              dolog ("Disabling voice\n");
1205  #endif
1206              hw->enabled = 0;
1207              hw->pending_disable = 0;
1208              if (hw->pcm_ops->enable_out) {
1209                  hw->pcm_ops->enable_out(hw, false);
1210              }
1211              for (sc = hw->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1212                  sc->sw.active = 0;
1213                  audio_recalc_and_notify_capture (sc->cap);
1214              }
1215              continue;
1216          }
1217  
1218          if (!live) {
1219              if (hw->pcm_ops->run_buffer_out) {
1220                  hw->pcm_ops->run_buffer_out(hw);
1221              }
1222              continue;
1223          }
1224  
1225          prev_rpos = hw->mix_buf.pos;
1226          played = audio_pcm_hw_run_out(hw, live);
1227          replay_audio_out(&played);
1228          if (audio_bug(__func__, hw->mix_buf.pos >= hw->mix_buf.size)) {
1229              dolog("hw->mix_buf.pos=%zu hw->mix_buf.size=%zu played=%zu\n",
1230                    hw->mix_buf.pos, hw->mix_buf.size, played);
1231              hw->mix_buf.pos = 0;
1232          }
1233  
1234  #ifdef DEBUG_OUT
1235          dolog("played=%zu\n", played);
1236  #endif
1237  
1238          if (played) {
1239              hw->ts_helper += played;
1240              audio_capture_mix_and_clear (hw, prev_rpos, played);
1241          }
1242  
1243          for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1244              if (!sw->active && sw->empty) {
1245                  continue;
1246              }
1247  
1248              if (audio_bug(__func__, played > sw->total_hw_samples_mixed)) {
1249                  dolog("played=%zu sw->total_hw_samples_mixed=%zu\n",
1250                        played, sw->total_hw_samples_mixed);
1251                  played = sw->total_hw_samples_mixed;
1252              }
1253  
1254              sw->total_hw_samples_mixed -= played;
1255  
1256              if (!sw->total_hw_samples_mixed) {
1257                  sw->empty = 1;
1258              }
1259          }
1260      }
1261  }
1262  
1263  static size_t audio_pcm_hw_run_in(HWVoiceIn *hw, size_t samples)
1264  {
1265      size_t conv = 0;
1266  
1267      if (hw->pcm_ops->run_buffer_in) {
1268          hw->pcm_ops->run_buffer_in(hw);
1269      }
1270  
1271      while (samples) {
1272          size_t proc;
1273          size_t size = samples * hw->info.bytes_per_frame;
1274          void *buf = hw->pcm_ops->get_buffer_in(hw, &size);
1275  
1276          assert(size % hw->info.bytes_per_frame == 0);
1277          if (size == 0) {
1278              break;
1279          }
1280  
1281          proc = audio_pcm_hw_conv_in(hw, buf, size / hw->info.bytes_per_frame);
1282  
1283          samples -= proc;
1284          conv += proc;
1285          hw->pcm_ops->put_buffer_in(hw, buf, proc * hw->info.bytes_per_frame);
1286      }
1287  
1288      return conv;
1289  }
1290  
1291  static void audio_run_in (AudioState *s)
1292  {
1293      HWVoiceIn *hw = NULL;
1294  
1295      if (!audio_get_pdo_in(s->dev)->mixing_engine) {
1296          while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
1297              /* there is exactly 1 sw for each hw with no mixeng */
1298              SWVoiceIn *sw = hw->sw_head.lh_first;
1299              if (sw->active) {
1300                  sw->callback.fn(sw->callback.opaque, INT_MAX);
1301              }
1302          }
1303          return;
1304      }
1305  
1306      while ((hw = audio_pcm_hw_find_any_enabled_in(s, hw))) {
1307          SWVoiceIn *sw;
1308          size_t captured = 0, min;
1309  
1310          if (replay_mode != REPLAY_MODE_PLAY) {
1311              captured = audio_pcm_hw_run_in(
1312                  hw, hw->conv_buf.size - audio_pcm_hw_get_live_in(hw));
1313          }
1314          replay_audio_in(&captured, hw->conv_buf.buffer, &hw->conv_buf.pos,
1315                          hw->conv_buf.size);
1316  
1317          min = audio_pcm_hw_find_min_in (hw);
1318          hw->total_samples_captured += captured - min;
1319          hw->ts_helper += captured;
1320  
1321          for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1322              sw->total_hw_samples_acquired -= min;
1323  
1324              if (sw->active) {
1325                  size_t sw_avail = audio_get_avail(sw);
1326                  size_t avail;
1327  
1328                  avail = st_rate_frames_out(sw->rate, sw_avail);
1329                  if (avail > 0) {
1330                      avail = MIN(avail, sw->resample_buf.size);
1331                      sw->callback.fn(sw->callback.opaque,
1332                                      avail * sw->info.bytes_per_frame);
1333                  }
1334              }
1335          }
1336      }
1337  }
1338  
1339  static void audio_run_capture (AudioState *s)
1340  {
1341      CaptureVoiceOut *cap;
1342  
1343      for (cap = s->cap_head.lh_first; cap; cap = cap->entries.le_next) {
1344          size_t live, rpos, captured;
1345          HWVoiceOut *hw = &cap->hw;
1346          SWVoiceOut *sw;
1347  
1348          captured = live = audio_pcm_hw_get_live_out (hw, NULL);
1349          rpos = hw->mix_buf.pos;
1350          while (live) {
1351              size_t left = hw->mix_buf.size - rpos;
1352              size_t to_capture = MIN(live, left);
1353              struct st_sample *src;
1354              struct capture_callback *cb;
1355  
1356              src = hw->mix_buf.buffer + rpos;
1357              hw->clip (cap->buf, src, to_capture);
1358              mixeng_clear (src, to_capture);
1359  
1360              for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
1361                  cb->ops.capture (cb->opaque, cap->buf,
1362                                   to_capture * hw->info.bytes_per_frame);
1363              }
1364              rpos = (rpos + to_capture) % hw->mix_buf.size;
1365              live -= to_capture;
1366          }
1367          hw->mix_buf.pos = rpos;
1368  
1369          for (sw = hw->sw_head.lh_first; sw; sw = sw->entries.le_next) {
1370              if (!sw->active && sw->empty) {
1371                  continue;
1372              }
1373  
1374              if (audio_bug(__func__, captured > sw->total_hw_samples_mixed)) {
1375                  dolog("captured=%zu sw->total_hw_samples_mixed=%zu\n",
1376                        captured, sw->total_hw_samples_mixed);
1377                  captured = sw->total_hw_samples_mixed;
1378              }
1379  
1380              sw->total_hw_samples_mixed -= captured;
1381              sw->empty = sw->total_hw_samples_mixed == 0;
1382          }
1383      }
1384  }
1385  
1386  void audio_run(AudioState *s, const char *msg)
1387  {
1388      audio_run_out(s);
1389      audio_run_in(s);
1390      audio_run_capture(s);
1391  
1392  #ifdef DEBUG_POLL
1393      {
1394          static double prevtime;
1395          double currtime;
1396          struct timeval tv;
1397  
1398          if (gettimeofday (&tv, NULL)) {
1399              perror ("audio_run: gettimeofday");
1400              return;
1401          }
1402  
1403          currtime = tv.tv_sec + tv.tv_usec * 1e-6;
1404          dolog ("Elapsed since last %s: %f\n", msg, currtime - prevtime);
1405          prevtime = currtime;
1406      }
1407  #endif
1408  }
1409  
1410  void audio_generic_run_buffer_in(HWVoiceIn *hw)
1411  {
1412      if (unlikely(!hw->buf_emul)) {
1413          hw->size_emul = hw->samples * hw->info.bytes_per_frame;
1414          hw->buf_emul = g_malloc(hw->size_emul);
1415          hw->pos_emul = hw->pending_emul = 0;
1416      }
1417  
1418      while (hw->pending_emul < hw->size_emul) {
1419          size_t read_len = MIN(hw->size_emul - hw->pos_emul,
1420                                hw->size_emul - hw->pending_emul);
1421          size_t read = hw->pcm_ops->read(hw, hw->buf_emul + hw->pos_emul,
1422                                          read_len);
1423          hw->pending_emul += read;
1424          hw->pos_emul = (hw->pos_emul + read) % hw->size_emul;
1425          if (read < read_len) {
1426              break;
1427          }
1428      }
1429  }
1430  
1431  void *audio_generic_get_buffer_in(HWVoiceIn *hw, size_t *size)
1432  {
1433      size_t start;
1434  
1435      start = audio_ring_posb(hw->pos_emul, hw->pending_emul, hw->size_emul);
1436      assert(start < hw->size_emul);
1437  
1438      *size = MIN(*size, hw->pending_emul);
1439      *size = MIN(*size, hw->size_emul - start);
1440      return hw->buf_emul + start;
1441  }
1442  
1443  void audio_generic_put_buffer_in(HWVoiceIn *hw, void *buf, size_t size)
1444  {
1445      assert(size <= hw->pending_emul);
1446      hw->pending_emul -= size;
1447  }
1448  
1449  size_t audio_generic_buffer_get_free(HWVoiceOut *hw)
1450  {
1451      if (hw->buf_emul) {
1452          return hw->size_emul - hw->pending_emul;
1453      } else {
1454          return hw->samples * hw->info.bytes_per_frame;
1455      }
1456  }
1457  
1458  void audio_generic_run_buffer_out(HWVoiceOut *hw)
1459  {
1460      while (hw->pending_emul) {
1461          size_t write_len, written, start;
1462  
1463          start = audio_ring_posb(hw->pos_emul, hw->pending_emul, hw->size_emul);
1464          assert(start < hw->size_emul);
1465  
1466          write_len = MIN(hw->pending_emul, hw->size_emul - start);
1467  
1468          written = hw->pcm_ops->write(hw, hw->buf_emul + start, write_len);
1469          hw->pending_emul -= written;
1470  
1471          if (written < write_len) {
1472              break;
1473          }
1474      }
1475  }
1476  
1477  void *audio_generic_get_buffer_out(HWVoiceOut *hw, size_t *size)
1478  {
1479      if (unlikely(!hw->buf_emul)) {
1480          hw->size_emul = hw->samples * hw->info.bytes_per_frame;
1481          hw->buf_emul = g_malloc(hw->size_emul);
1482          hw->pos_emul = hw->pending_emul = 0;
1483      }
1484  
1485      *size = MIN(hw->size_emul - hw->pending_emul,
1486                  hw->size_emul - hw->pos_emul);
1487      return hw->buf_emul + hw->pos_emul;
1488  }
1489  
1490  size_t audio_generic_put_buffer_out(HWVoiceOut *hw, void *buf, size_t size)
1491  {
1492      assert(buf == hw->buf_emul + hw->pos_emul &&
1493             size + hw->pending_emul <= hw->size_emul);
1494  
1495      hw->pending_emul += size;
1496      hw->pos_emul = (hw->pos_emul + size) % hw->size_emul;
1497  
1498      return size;
1499  }
1500  
1501  size_t audio_generic_write(HWVoiceOut *hw, void *buf, size_t size)
1502  {
1503      size_t total = 0;
1504  
1505      if (hw->pcm_ops->buffer_get_free) {
1506          size_t free = hw->pcm_ops->buffer_get_free(hw);
1507  
1508          size = MIN(size, free);
1509      }
1510  
1511      while (total < size) {
1512          size_t dst_size = size - total;
1513          size_t copy_size, proc;
1514          void *dst = hw->pcm_ops->get_buffer_out(hw, &dst_size);
1515  
1516          if (dst_size == 0) {
1517              break;
1518          }
1519  
1520          copy_size = MIN(size - total, dst_size);
1521          if (dst) {
1522              memcpy(dst, (char *)buf + total, copy_size);
1523          }
1524          proc = hw->pcm_ops->put_buffer_out(hw, dst, copy_size);
1525          total += proc;
1526  
1527          if (proc == 0 || proc < copy_size) {
1528              break;
1529          }
1530      }
1531  
1532      return total;
1533  }
1534  
1535  size_t audio_generic_read(HWVoiceIn *hw, void *buf, size_t size)
1536  {
1537      size_t total = 0;
1538  
1539      if (hw->pcm_ops->run_buffer_in) {
1540          hw->pcm_ops->run_buffer_in(hw);
1541      }
1542  
1543      while (total < size) {
1544          size_t src_size = size - total;
1545          void *src = hw->pcm_ops->get_buffer_in(hw, &src_size);
1546  
1547          if (src_size == 0) {
1548              break;
1549          }
1550  
1551          memcpy((char *)buf + total, src, src_size);
1552          hw->pcm_ops->put_buffer_in(hw, src, src_size);
1553          total += src_size;
1554      }
1555  
1556      return total;
1557  }
1558  
1559  static int audio_driver_init(AudioState *s, struct audio_driver *drv,
1560                               Audiodev *dev, Error **errp)
1561  {
1562      Error *local_err = NULL;
1563  
1564      s->drv_opaque = drv->init(dev, &local_err);
1565  
1566      if (s->drv_opaque) {
1567          if (!drv->pcm_ops->get_buffer_in) {
1568              drv->pcm_ops->get_buffer_in = audio_generic_get_buffer_in;
1569              drv->pcm_ops->put_buffer_in = audio_generic_put_buffer_in;
1570          }
1571          if (!drv->pcm_ops->get_buffer_out) {
1572              drv->pcm_ops->get_buffer_out = audio_generic_get_buffer_out;
1573              drv->pcm_ops->put_buffer_out = audio_generic_put_buffer_out;
1574          }
1575  
1576          audio_init_nb_voices_out(s, drv, 1);
1577          audio_init_nb_voices_in(s, drv, 0);
1578          s->drv = drv;
1579          return 0;
1580      } else {
1581          if (local_err) {
1582              error_propagate(errp, local_err);
1583          } else {
1584              error_setg(errp, "Could not init `%s' audio driver", drv->name);
1585          }
1586          return -1;
1587      }
1588  }
1589  
1590  static void audio_vm_change_state_handler (void *opaque, bool running,
1591                                             RunState state)
1592  {
1593      AudioState *s = opaque;
1594      HWVoiceOut *hwo = NULL;
1595      HWVoiceIn *hwi = NULL;
1596  
1597      s->vm_running = running;
1598      while ((hwo = audio_pcm_hw_find_any_enabled_out(s, hwo))) {
1599          if (hwo->pcm_ops->enable_out) {
1600              hwo->pcm_ops->enable_out(hwo, running);
1601          }
1602      }
1603  
1604      while ((hwi = audio_pcm_hw_find_any_enabled_in(s, hwi))) {
1605          if (hwi->pcm_ops->enable_in) {
1606              hwi->pcm_ops->enable_in(hwi, running);
1607          }
1608      }
1609      audio_reset_timer (s);
1610  }
1611  
1612  static void free_audio_state(AudioState *s)
1613  {
1614      HWVoiceOut *hwo, *hwon;
1615      HWVoiceIn *hwi, *hwin;
1616  
1617      QLIST_FOREACH_SAFE(hwo, &s->hw_head_out, entries, hwon) {
1618          SWVoiceCap *sc;
1619  
1620          if (hwo->enabled && hwo->pcm_ops->enable_out) {
1621              hwo->pcm_ops->enable_out(hwo, false);
1622          }
1623          hwo->pcm_ops->fini_out (hwo);
1624  
1625          for (sc = hwo->cap_head.lh_first; sc; sc = sc->entries.le_next) {
1626              CaptureVoiceOut *cap = sc->cap;
1627              struct capture_callback *cb;
1628  
1629              for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
1630                  cb->ops.destroy (cb->opaque);
1631              }
1632          }
1633          QLIST_REMOVE(hwo, entries);
1634      }
1635  
1636      QLIST_FOREACH_SAFE(hwi, &s->hw_head_in, entries, hwin) {
1637          if (hwi->enabled && hwi->pcm_ops->enable_in) {
1638              hwi->pcm_ops->enable_in(hwi, false);
1639          }
1640          hwi->pcm_ops->fini_in (hwi);
1641          QLIST_REMOVE(hwi, entries);
1642      }
1643  
1644      if (s->drv) {
1645          s->drv->fini (s->drv_opaque);
1646          s->drv = NULL;
1647      }
1648  
1649      if (s->dev) {
1650          qapi_free_Audiodev(s->dev);
1651          s->dev = NULL;
1652      }
1653  
1654      if (s->ts) {
1655          timer_free(s->ts);
1656          s->ts = NULL;
1657      }
1658  
1659      g_free(s);
1660  }
1661  
1662  void audio_cleanup(void)
1663  {
1664      default_audio_state = NULL;
1665      while (!QTAILQ_EMPTY(&audio_states)) {
1666          AudioState *s = QTAILQ_FIRST(&audio_states);
1667          QTAILQ_REMOVE(&audio_states, s, list);
1668          free_audio_state(s);
1669      }
1670  }
1671  
1672  static bool vmstate_audio_needed(void *opaque)
1673  {
1674      /*
1675       * Never needed, this vmstate only exists in case
1676       * an old qemu sends it to us.
1677       */
1678      return false;
1679  }
1680  
1681  static const VMStateDescription vmstate_audio = {
1682      .name = "audio",
1683      .version_id = 1,
1684      .minimum_version_id = 1,
1685      .needed = vmstate_audio_needed,
1686      .fields = (VMStateField[]) {
1687          VMSTATE_END_OF_LIST()
1688      }
1689  };
1690  
1691  void audio_create_default_audiodevs(void)
1692  {
1693      for (int i = 0; audio_prio_list[i]; i++) {
1694          if (audio_driver_lookup(audio_prio_list[i])) {
1695              QDict *dict = qdict_new();
1696              Audiodev *dev = NULL;
1697              Visitor *v;
1698  
1699              qdict_put_str(dict, "driver", audio_prio_list[i]);
1700              qdict_put_str(dict, "id", "#default");
1701  
1702              v = qobject_input_visitor_new_keyval(QOBJECT(dict));
1703              qobject_unref(dict);
1704              visit_type_Audiodev(v, NULL, &dev, &error_fatal);
1705              visit_free(v);
1706  
1707              audio_define_default(dev, &error_abort);
1708          }
1709      }
1710  }
1711  
1712  /*
1713   * if we have dev, this function was called because of an -audiodev argument =>
1714   *   initialize a new state with it
1715   * if dev == NULL => legacy implicit initialization, return the already created
1716   *   state or create a new one
1717   */
1718  static AudioState *audio_init(Audiodev *dev, Error **errp)
1719  {
1720      static bool atexit_registered;
1721      int done = 0;
1722      const char *drvname;
1723      VMChangeStateEntry *vmse;
1724      AudioState *s;
1725      struct audio_driver *driver;
1726  
1727      s = g_new0(AudioState, 1);
1728  
1729      QLIST_INIT (&s->hw_head_out);
1730      QLIST_INIT (&s->hw_head_in);
1731      QLIST_INIT (&s->cap_head);
1732      if (!atexit_registered) {
1733          atexit(audio_cleanup);
1734          atexit_registered = true;
1735      }
1736  
1737      s->ts = timer_new_ns(QEMU_CLOCK_VIRTUAL, audio_timer, s);
1738  
1739      if (dev) {
1740          /* -audiodev option */
1741          s->dev = dev;
1742          drvname = AudiodevDriver_str(dev->driver);
1743          driver = audio_driver_lookup(drvname);
1744          if (driver) {
1745              done = !audio_driver_init(s, driver, dev, errp);
1746          } else {
1747              error_setg(errp, "Unknown audio driver `%s'\n", drvname);
1748          }
1749          if (!done) {
1750              goto out;
1751          }
1752      } else {
1753          assert(!default_audio_state);
1754          for (;;) {
1755              AudiodevListEntry *e = QSIMPLEQ_FIRST(&default_audiodevs);
1756              if (!e) {
1757                  error_setg(errp, "no default audio driver available");
1758                  goto out;
1759              }
1760              s->dev = dev = e->dev;
1761              drvname = AudiodevDriver_str(dev->driver);
1762              driver = audio_driver_lookup(drvname);
1763              if (!audio_driver_init(s, driver, dev, NULL)) {
1764                  break;
1765              }
1766              QSIMPLEQ_REMOVE_HEAD(&default_audiodevs, next);
1767          }
1768      }
1769  
1770      if (dev->timer_period <= 0) {
1771          s->period_ticks = 1;
1772      } else {
1773          s->period_ticks = dev->timer_period * (int64_t)SCALE_US;
1774      }
1775  
1776      vmse = qemu_add_vm_change_state_handler (audio_vm_change_state_handler, s);
1777      if (!vmse) {
1778          dolog ("warning: Could not register change state handler\n"
1779                 "(Audio can continue looping even after stopping the VM)\n");
1780      }
1781  
1782      QTAILQ_INSERT_TAIL(&audio_states, s, list);
1783      QLIST_INIT (&s->card_head);
1784      vmstate_register_any(NULL, &vmstate_audio, s);
1785      return s;
1786  
1787  out:
1788      free_audio_state(s);
1789      return NULL;
1790  }
1791  
1792  AudioState *audio_get_default_audio_state(Error **errp)
1793  {
1794      if (!default_audio_state) {
1795          default_audio_state = audio_init(NULL, errp);
1796          if (!default_audio_state) {
1797              if (!QSIMPLEQ_EMPTY(&audiodevs)) {
1798                  error_append_hint(errp, "Perhaps you wanted to use -audio or set audiodev=%s?\n",
1799                                    QSIMPLEQ_FIRST(&audiodevs)->dev->id);
1800              }
1801          }
1802      }
1803  
1804      return default_audio_state;
1805  }
1806  
1807  bool AUD_register_card (const char *name, QEMUSoundCard *card, Error **errp)
1808  {
1809      if (!card->state) {
1810          card->state = audio_get_default_audio_state(errp);
1811          if (!card->state) {
1812              return false;
1813          }
1814      }
1815  
1816      card->name = g_strdup (name);
1817      memset (&card->entries, 0, sizeof (card->entries));
1818      QLIST_INSERT_HEAD(&card->state->card_head, card, entries);
1819  
1820      return true;
1821  }
1822  
1823  void AUD_remove_card (QEMUSoundCard *card)
1824  {
1825      QLIST_REMOVE (card, entries);
1826      g_free (card->name);
1827  }
1828  
1829  static struct audio_pcm_ops capture_pcm_ops;
1830  
1831  CaptureVoiceOut *AUD_add_capture(
1832      AudioState *s,
1833      struct audsettings *as,
1834      struct audio_capture_ops *ops,
1835      void *cb_opaque
1836      )
1837  {
1838      CaptureVoiceOut *cap;
1839      struct capture_callback *cb;
1840  
1841      if (!s) {
1842          error_report("Capturing without setting an audiodev is not supported");
1843          abort();
1844      }
1845  
1846      if (!audio_get_pdo_out(s->dev)->mixing_engine) {
1847          dolog("Can't capture with mixeng disabled\n");
1848          return NULL;
1849      }
1850  
1851      if (audio_validate_settings (as)) {
1852          dolog ("Invalid settings were passed when trying to add capture\n");
1853          audio_print_settings (as);
1854          return NULL;
1855      }
1856  
1857      cb = g_malloc0(sizeof(*cb));
1858      cb->ops = *ops;
1859      cb->opaque = cb_opaque;
1860  
1861      cap = audio_pcm_capture_find_specific(s, as);
1862      if (cap) {
1863          QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
1864      } else {
1865          HWVoiceOut *hw;
1866  
1867          cap = g_malloc0(sizeof(*cap));
1868  
1869          hw = &cap->hw;
1870          hw->s = s;
1871          hw->pcm_ops = &capture_pcm_ops;
1872          QLIST_INIT (&hw->sw_head);
1873          QLIST_INIT (&cap->cb_head);
1874  
1875          /* XXX find a more elegant way */
1876          hw->samples = 4096 * 4;
1877          audio_pcm_hw_alloc_resources_out(hw);
1878  
1879          audio_pcm_init_info (&hw->info, as);
1880  
1881          cap->buf = g_malloc0_n(hw->mix_buf.size, hw->info.bytes_per_frame);
1882  
1883          if (hw->info.is_float) {
1884              hw->clip = mixeng_clip_float[hw->info.nchannels == 2];
1885          } else {
1886              hw->clip = mixeng_clip
1887                  [hw->info.nchannels == 2]
1888                  [hw->info.is_signed]
1889                  [hw->info.swap_endianness]
1890                  [audio_bits_to_index(hw->info.bits)];
1891          }
1892  
1893          QLIST_INSERT_HEAD (&s->cap_head, cap, entries);
1894          QLIST_INSERT_HEAD (&cap->cb_head, cb, entries);
1895  
1896          QLIST_FOREACH(hw, &s->hw_head_out, entries) {
1897              audio_attach_capture (hw);
1898          }
1899      }
1900  
1901      return cap;
1902  }
1903  
1904  void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
1905  {
1906      struct capture_callback *cb;
1907  
1908      for (cb = cap->cb_head.lh_first; cb; cb = cb->entries.le_next) {
1909          if (cb->opaque == cb_opaque) {
1910              cb->ops.destroy (cb_opaque);
1911              QLIST_REMOVE (cb, entries);
1912              g_free (cb);
1913  
1914              if (!cap->cb_head.lh_first) {
1915                  SWVoiceOut *sw = cap->hw.sw_head.lh_first, *sw1;
1916  
1917                  while (sw) {
1918                      SWVoiceCap *sc = (SWVoiceCap *) sw;
1919  #ifdef DEBUG_CAPTURE
1920                      dolog ("freeing %s\n", sw->name);
1921  #endif
1922  
1923                      sw1 = sw->entries.le_next;
1924                      if (sw->rate) {
1925                          st_rate_stop (sw->rate);
1926                          sw->rate = NULL;
1927                      }
1928                      QLIST_REMOVE (sw, entries);
1929                      QLIST_REMOVE (sc, entries);
1930                      g_free (sc);
1931                      sw = sw1;
1932                  }
1933                  QLIST_REMOVE (cap, entries);
1934                  g_free(cap->hw.mix_buf.buffer);
1935                  g_free (cap->buf);
1936                  g_free (cap);
1937              }
1938              return;
1939          }
1940      }
1941  }
1942  
1943  void AUD_set_volume_out (SWVoiceOut *sw, int mute, uint8_t lvol, uint8_t rvol)
1944  {
1945      Volume vol = { .mute = mute, .channels = 2, .vol = { lvol, rvol } };
1946      audio_set_volume_out(sw, &vol);
1947  }
1948  
1949  void audio_set_volume_out(SWVoiceOut *sw, Volume *vol)
1950  {
1951      if (sw) {
1952          HWVoiceOut *hw = sw->hw;
1953  
1954          sw->vol.mute = vol->mute;
1955          sw->vol.l = nominal_volume.l * vol->vol[0] / 255;
1956          sw->vol.r = nominal_volume.l * vol->vol[vol->channels > 1 ? 1 : 0] /
1957              255;
1958  
1959          if (hw->pcm_ops->volume_out) {
1960              hw->pcm_ops->volume_out(hw, vol);
1961          }
1962      }
1963  }
1964  
1965  void AUD_set_volume_in (SWVoiceIn *sw, int mute, uint8_t lvol, uint8_t rvol)
1966  {
1967      Volume vol = { .mute = mute, .channels = 2, .vol = { lvol, rvol } };
1968      audio_set_volume_in(sw, &vol);
1969  }
1970  
1971  void audio_set_volume_in(SWVoiceIn *sw, Volume *vol)
1972  {
1973      if (sw) {
1974          HWVoiceIn *hw = sw->hw;
1975  
1976          sw->vol.mute = vol->mute;
1977          sw->vol.l = nominal_volume.l * vol->vol[0] / 255;
1978          sw->vol.r = nominal_volume.r * vol->vol[vol->channels > 1 ? 1 : 0] /
1979              255;
1980  
1981          if (hw->pcm_ops->volume_in) {
1982              hw->pcm_ops->volume_in(hw, vol);
1983          }
1984      }
1985  }
1986  
1987  void audio_create_pdos(Audiodev *dev)
1988  {
1989      switch (dev->driver) {
1990  #define CASE(DRIVER, driver, pdo_name)                              \
1991      case AUDIODEV_DRIVER_##DRIVER:                                  \
1992          if (!dev->u.driver.in) {                                    \
1993              dev->u.driver.in = g_malloc0(                           \
1994                  sizeof(Audiodev##pdo_name##PerDirectionOptions));   \
1995          }                                                           \
1996          if (!dev->u.driver.out) {                                   \
1997              dev->u.driver.out = g_malloc0(                          \
1998                  sizeof(Audiodev##pdo_name##PerDirectionOptions));   \
1999          }                                                           \
2000          break
2001  
2002          CASE(NONE, none, );
2003  #ifdef CONFIG_AUDIO_ALSA
2004          CASE(ALSA, alsa, Alsa);
2005  #endif
2006  #ifdef CONFIG_AUDIO_COREAUDIO
2007          CASE(COREAUDIO, coreaudio, Coreaudio);
2008  #endif
2009  #ifdef CONFIG_DBUS_DISPLAY
2010          CASE(DBUS, dbus, );
2011  #endif
2012  #ifdef CONFIG_AUDIO_DSOUND
2013          CASE(DSOUND, dsound, );
2014  #endif
2015  #ifdef CONFIG_AUDIO_JACK
2016          CASE(JACK, jack, Jack);
2017  #endif
2018  #ifdef CONFIG_AUDIO_OSS
2019          CASE(OSS, oss, Oss);
2020  #endif
2021  #ifdef CONFIG_AUDIO_PA
2022          CASE(PA, pa, Pa);
2023  #endif
2024  #ifdef CONFIG_AUDIO_PIPEWIRE
2025          CASE(PIPEWIRE, pipewire, Pipewire);
2026  #endif
2027  #ifdef CONFIG_AUDIO_SDL
2028          CASE(SDL, sdl, Sdl);
2029  #endif
2030  #ifdef CONFIG_AUDIO_SNDIO
2031          CASE(SNDIO, sndio, );
2032  #endif
2033  #ifdef CONFIG_SPICE
2034          CASE(SPICE, spice, );
2035  #endif
2036          CASE(WAV, wav, );
2037  
2038      case AUDIODEV_DRIVER__MAX:
2039          abort();
2040      };
2041  }
2042  
2043  static void audio_validate_per_direction_opts(
2044      AudiodevPerDirectionOptions *pdo, Error **errp)
2045  {
2046      if (!pdo->has_mixing_engine) {
2047          pdo->has_mixing_engine = true;
2048          pdo->mixing_engine = true;
2049      }
2050      if (!pdo->has_fixed_settings) {
2051          pdo->has_fixed_settings = true;
2052          pdo->fixed_settings = pdo->mixing_engine;
2053      }
2054      if (!pdo->fixed_settings &&
2055          (pdo->has_frequency || pdo->has_channels || pdo->has_format)) {
2056          error_setg(errp,
2057                     "You can't use frequency, channels or format with fixed-settings=off");
2058          return;
2059      }
2060      if (!pdo->mixing_engine && pdo->fixed_settings) {
2061          error_setg(errp, "You can't use fixed-settings without mixeng");
2062          return;
2063      }
2064  
2065      if (!pdo->has_frequency) {
2066          pdo->has_frequency = true;
2067          pdo->frequency = 44100;
2068      }
2069      if (!pdo->has_channels) {
2070          pdo->has_channels = true;
2071          pdo->channels = 2;
2072      }
2073      if (!pdo->has_voices) {
2074          pdo->has_voices = true;
2075          pdo->voices = pdo->mixing_engine ? 1 : INT_MAX;
2076      }
2077      if (!pdo->has_format) {
2078          pdo->has_format = true;
2079          pdo->format = AUDIO_FORMAT_S16;
2080      }
2081  }
2082  
2083  static void audio_validate_opts(Audiodev *dev, Error **errp)
2084  {
2085      Error *err = NULL;
2086  
2087      audio_create_pdos(dev);
2088  
2089      audio_validate_per_direction_opts(audio_get_pdo_in(dev), &err);
2090      if (err) {
2091          error_propagate(errp, err);
2092          return;
2093      }
2094  
2095      audio_validate_per_direction_opts(audio_get_pdo_out(dev), &err);
2096      if (err) {
2097          error_propagate(errp, err);
2098          return;
2099      }
2100  
2101      if (!dev->has_timer_period) {
2102          dev->has_timer_period = true;
2103          dev->timer_period = 10000; /* 100Hz -> 10ms */
2104      }
2105  }
2106  
2107  void audio_help(void)
2108  {
2109      int i;
2110  
2111      printf("Available audio drivers:\n");
2112  
2113      for (i = 0; i < AUDIODEV_DRIVER__MAX; i++) {
2114          audio_driver *driver = audio_driver_lookup(AudiodevDriver_str(i));
2115          if (driver) {
2116              printf("%s\n", driver->name);
2117          }
2118      }
2119  }
2120  
2121  void audio_parse_option(const char *opt)
2122  {
2123      Audiodev *dev = NULL;
2124  
2125      if (is_help_option(opt)) {
2126          audio_help();
2127          exit(EXIT_SUCCESS);
2128      }
2129      Visitor *v = qobject_input_visitor_new_str(opt, "driver", &error_fatal);
2130      visit_type_Audiodev(v, NULL, &dev, &error_fatal);
2131      visit_free(v);
2132  
2133      audio_define(dev);
2134  }
2135  
2136  void audio_define(Audiodev *dev)
2137  {
2138      AudiodevListEntry *e;
2139  
2140      audio_validate_opts(dev, &error_fatal);
2141  
2142      e = g_new0(AudiodevListEntry, 1);
2143      e->dev = dev;
2144      QSIMPLEQ_INSERT_TAIL(&audiodevs, e, next);
2145  }
2146  
2147  void audio_define_default(Audiodev *dev, Error **errp)
2148  {
2149      AudiodevListEntry *e;
2150  
2151      audio_validate_opts(dev, errp);
2152  
2153      e = g_new0(AudiodevListEntry, 1);
2154      e->dev = dev;
2155      QSIMPLEQ_INSERT_TAIL(&default_audiodevs, e, next);
2156  }
2157  
2158  void audio_init_audiodevs(void)
2159  {
2160      AudiodevListEntry *e;
2161  
2162      QSIMPLEQ_FOREACH(e, &audiodevs, next) {
2163          audio_init(e->dev, &error_fatal);
2164      }
2165  }
2166  
2167  audsettings audiodev_to_audsettings(AudiodevPerDirectionOptions *pdo)
2168  {
2169      return (audsettings) {
2170          .freq = pdo->frequency,
2171          .nchannels = pdo->channels,
2172          .fmt = pdo->format,
2173          .endianness = AUDIO_HOST_ENDIANNESS,
2174      };
2175  }
2176  
2177  int audioformat_bytes_per_sample(AudioFormat fmt)
2178  {
2179      switch (fmt) {
2180      case AUDIO_FORMAT_U8:
2181      case AUDIO_FORMAT_S8:
2182          return 1;
2183  
2184      case AUDIO_FORMAT_U16:
2185      case AUDIO_FORMAT_S16:
2186          return 2;
2187  
2188      case AUDIO_FORMAT_U32:
2189      case AUDIO_FORMAT_S32:
2190      case AUDIO_FORMAT_F32:
2191          return 4;
2192  
2193      case AUDIO_FORMAT__MAX:
2194          ;
2195      }
2196      abort();
2197  }
2198  
2199  
2200  /* frames = freq * usec / 1e6 */
2201  int audio_buffer_frames(AudiodevPerDirectionOptions *pdo,
2202                          audsettings *as, int def_usecs)
2203  {
2204      uint64_t usecs = pdo->has_buffer_length ? pdo->buffer_length : def_usecs;
2205      return (as->freq * usecs + 500000) / 1000000;
2206  }
2207  
2208  /* samples = channels * frames = channels * freq * usec / 1e6 */
2209  int audio_buffer_samples(AudiodevPerDirectionOptions *pdo,
2210                           audsettings *as, int def_usecs)
2211  {
2212      return as->nchannels * audio_buffer_frames(pdo, as, def_usecs);
2213  }
2214  
2215  /*
2216   * bytes = bytes_per_sample * samples =
2217   *     bytes_per_sample * channels * freq * usec / 1e6
2218   */
2219  int audio_buffer_bytes(AudiodevPerDirectionOptions *pdo,
2220                         audsettings *as, int def_usecs)
2221  {
2222      return audio_buffer_samples(pdo, as, def_usecs) *
2223          audioformat_bytes_per_sample(as->fmt);
2224  }
2225  
2226  AudioState *audio_state_by_name(const char *name, Error **errp)
2227  {
2228      AudioState *s;
2229      QTAILQ_FOREACH(s, &audio_states, list) {
2230          assert(s->dev);
2231          if (strcmp(name, s->dev->id) == 0) {
2232              return s;
2233          }
2234      }
2235      error_setg(errp, "audiodev '%s' not found", name);
2236      return NULL;
2237  }
2238  
2239  const char *audio_get_id(QEMUSoundCard *card)
2240  {
2241      if (card->state) {
2242          assert(card->state->dev);
2243          return card->state->dev->id;
2244      } else {
2245          return "";
2246      }
2247  }
2248  
2249  const char *audio_application_name(void)
2250  {
2251      const char *vm_name;
2252  
2253      vm_name = qemu_get_vm_name();
2254      return vm_name ? vm_name : "qemu";
2255  }
2256  
2257  void audio_rate_start(RateCtl *rate)
2258  {
2259      memset(rate, 0, sizeof(RateCtl));
2260      rate->start_ticks = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
2261  }
2262  
2263  size_t audio_rate_peek_bytes(RateCtl *rate, struct audio_pcm_info *info)
2264  {
2265      int64_t now;
2266      int64_t ticks;
2267      int64_t bytes;
2268      int64_t frames;
2269  
2270      now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
2271      ticks = now - rate->start_ticks;
2272      bytes = muldiv64(ticks, info->bytes_per_second, NANOSECONDS_PER_SECOND);
2273      frames = (bytes - rate->bytes_sent) / info->bytes_per_frame;
2274      if (frames < 0 || frames > 65536) {
2275          AUD_log(NULL, "Resetting rate control (%" PRId64 " frames)\n", frames);
2276          audio_rate_start(rate);
2277          frames = 0;
2278      }
2279  
2280      return frames * info->bytes_per_frame;
2281  }
2282  
2283  void audio_rate_add_bytes(RateCtl *rate, size_t bytes_used)
2284  {
2285      rate->bytes_sent += bytes_used;
2286  }
2287  
2288  size_t audio_rate_get_bytes(RateCtl *rate, struct audio_pcm_info *info,
2289                              size_t bytes_avail)
2290  {
2291      size_t bytes;
2292  
2293      bytes = audio_rate_peek_bytes(rate, info);
2294      bytes = MIN(bytes, bytes_avail);
2295      audio_rate_add_bytes(rate, bytes);
2296  
2297      return bytes;
2298  }
2299  
2300  AudiodevList *qmp_query_audiodevs(Error **errp)
2301  {
2302      AudiodevList *ret = NULL;
2303      AudiodevListEntry *e;
2304      QSIMPLEQ_FOREACH(e, &audiodevs, next) {
2305          QAPI_LIST_PREPEND(ret, QAPI_CLONE(Audiodev, e->dev));
2306      }
2307      return ret;
2308  }
2309