@samitouri / QOSamiQemu / commits / 61e95a0c60

audio: make all the backend-specific APIs take the be

This will allow to dispatch to different implementations next. Reviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com> Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp> Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>

Marc-André Lureau committed Nov 4, 2025 at 19:38 UTC 61e95a0c608ca169b1d0ab41f0d4da6011c2e680
22 files changed +192 -173
audio/audio.c
+9 -9
@@ -847,7 +847,7 @@ static void audio_timer (void *opaque)
847 /*
848 * Public API
849 */
850 -size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)
850 +size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *buf, size_t size)
851 {
852 HWVoiceOut *hw;
853
@@ -869,7 +869,7 @@ size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)
869 }
870 }
871
872 -size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)
872 +size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *buf, size_t size)
873 {
874 HWVoiceIn *hw;
875
@@ -891,7 +891,7 @@ size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)
891 }
892 }
893
894 -int AUD_get_buffer_size_out(SWVoiceOut *sw)
894 +int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)
895 {
896 if (!sw) {
897 return 0;
@@ -904,7 +904,7 @@ int AUD_get_buffer_size_out(SWVoiceOut *sw)
904 return sw->hw->samples * sw->hw->info.bytes_per_frame;
905 }
906
907 -void AUD_set_active_out(SWVoiceOut *sw, bool on)
907 +void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on)
908 {
909 HWVoiceOut *hw;
910
@@ -952,7 +952,7 @@ void AUD_set_active_out(SWVoiceOut *sw, bool on)
952 }
953 }
954
955 -void AUD_set_active_in(SWVoiceIn *sw, bool on)
955 +void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)
956 {
957 HWVoiceIn *hw;
958
@@ -997,7 +997,7 @@ void AUD_set_active_in(SWVoiceIn *sw, bool on)
997 }
998 }
999
1000 -static size_t audio_get_avail (SWVoiceIn *sw)
1000 +static size_t audio_get_avail(SWVoiceIn *sw)
1001 {
1002 size_t live;
1003
@@ -1938,7 +1938,7 @@ CaptureVoiceOut *AUD_add_capture(
1938 return cap;
1939 }
1940
1941 -void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
1941 +void AUD_del_capture(AudioBackend *be, CaptureVoiceOut *cap, void *cb_opaque)
1942 {
1943 struct capture_callback *cb;
1944
@@ -1977,7 +1977,7 @@ void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)
1977 }
1978 }
1979
1980 -void AUD_set_volume_out(SWVoiceOut *sw, Volume *vol)
1980 +void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol)
1981 {
1982 if (sw) {
1983 HWVoiceOut *hw = sw->hw;
@@ -1993,7 +1993,7 @@ void AUD_set_volume_out(SWVoiceOut *sw, Volume *vol)
1993 }
1994 }
1995
1996 -void AUD_set_volume_in(SWVoiceIn *sw, Volume *vol)
1996 +void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol)
1997 {
1998 if (sw) {
1999 HWVoiceIn *hw = sw->hw;
audio/audio_template.h
+1 -1
@@ -569,7 +569,7 @@ SW *glue (AUD_open_, TYPE) (
569 return NULL;
570 }
571
572 -bool glue(AUD_is_active_, TYPE)(SW *sw)
572 +bool glue(AUD_is_active_, TYPE)(AudioBackend *be, SW *sw)
573 {
574 return sw ? sw->active : 0;
575 }
audio/wavcapture.c
+5 -2
@@ -1,4 +1,5 @@
1 #include "qemu/osdep.h"
2 +#include "qemu/audio.h"
3 #include "qemu/qemu-print.h"
4 #include "qemu/error-report.h"
5 #include "audio_int.h"
@@ -10,6 +11,7 @@ typedef struct {
11 int freq;
12 int bits;
13 int nchannels;
14 + AudioBackend *audio_be;
15 CaptureVoiceOut *cap;
16 } WAVState;
17
@@ -84,7 +86,7 @@ static void wav_capture_destroy (void *opaque)
86 {
87 WAVState *wav = opaque;
88
87 - AUD_del_capture (wav->cap, wav);
89 + AUD_del_capture(wav->audio_be, wav->cap, wav);
90 g_free (wav);
91 }
92
@@ -159,6 +161,7 @@ int wav_start_capture(AudioBackend *state, CaptureState *s, const char *path,
161 return -1;
162 }
163
164 + wav->audio_be = state;
165 wav->path = g_strdup (path);
166 wav->bits = bits;
167 wav->nchannels = nchannels;
@@ -169,7 +172,7 @@ int wav_start_capture(AudioBackend *state, CaptureState *s, const char *path,
172 goto error_free;
173 }
174
172 - cap = AUD_add_capture(state, &as, &ops, wav);
175 + cap = AUD_add_capture(wav->audio_be, &as, &ops, wav);
176 if (!cap) {
177 error_report("Failed to add audio capture");
178 goto error_free;
hw/audio/ac97.c
+12 -12
@@ -246,15 +246,15 @@ static void voice_set_active(AC97LinkState *s, int bm_index, int on)
246 {
247 switch (bm_index) {
248 case PI_INDEX:
249 - AUD_set_active_in(s->voice_pi, on);
249 + AUD_set_active_in(s->audio_be, s->voice_pi, on);
250 break;
251
252 case PO_INDEX:
253 - AUD_set_active_out(s->voice_po, on);
253 + AUD_set_active_out(s->audio_be, s->voice_po, on);
254 break;
255
256 case MC_INDEX:
257 - AUD_set_active_in(s->voice_mc, on);
257 + AUD_set_active_in(s->audio_be, s->voice_mc, on);
258 break;
259
260 default:
@@ -378,15 +378,15 @@ static void reset_voices(AC97LinkState *s, uint8_t active[LAST_INDEX])
378
379 freq = mixer_load(s, AC97_PCM_LR_ADC_Rate);
380 open_voice(s, PI_INDEX, freq);
381 - AUD_set_active_in(s->voice_pi, active[PI_INDEX]);
381 + AUD_set_active_in(s->audio_be, s->voice_pi, active[PI_INDEX]);
382
383 freq = mixer_load(s, AC97_PCM_Front_DAC_Rate);
384 open_voice(s, PO_INDEX, freq);
385 - AUD_set_active_out(s->voice_po, active[PO_INDEX]);
385 + AUD_set_active_out(s->audio_be, s->voice_po, active[PO_INDEX]);
386
387 freq = mixer_load(s, AC97_MIC_ADC_Rate);
388 open_voice(s, MC_INDEX, freq);
389 - AUD_set_active_in(s->voice_mc, active[MC_INDEX]);
389 + AUD_set_active_in(s->audio_be, s->voice_mc, active[MC_INDEX]);
390 }
391
392 static void get_volume(uint16_t vol, uint16_t mask, int inverse,
@@ -416,7 +416,7 @@ static void update_combined_volume_out(AC97LinkState *s)
416 lvol = (lvol * plvol) / 255;
417 rvol = (rvol * prvol) / 255;
418
419 - AUD_set_volume_out_lr(s->voice_po, mute, lvol, rvol);
419 + AUD_set_volume_out_lr(s->audio_be, s->voice_po, mute, lvol, rvol);
420 }
421
422 static void update_volume_in(AC97LinkState *s)
@@ -427,7 +427,7 @@ static void update_volume_in(AC97LinkState *s)
427 get_volume(mixer_load(s, AC97_Record_Gain_Mute), 0x0f, 0,
428 &mute, &lvol, &rvol);
429
430 - AUD_set_volume_in_lr(s->voice_pi, mute, lvol, rvol);
430 + AUD_set_volume_in_lr(s->audio_be, s->voice_pi, mute, lvol, rvol);
431 }
432
433 static void set_volume(AC97LinkState *s, int index, uint32_t val)
@@ -904,7 +904,7 @@ static int write_audio(AC97LinkState *s, AC97BusMasterRegs *r,
904 int copied;
905 to_copy = MIN(temp, sizeof(tmpbuf));
906 pci_dma_read(&s->dev, addr, tmpbuf, to_copy);
907 - copied = AUD_write(s->voice_po, tmpbuf, to_copy);
907 + copied = AUD_write(s->audio_be, s->voice_po, tmpbuf, to_copy);
908 dolog("write_audio max=%x to_copy=%x copied=%x",
909 max, to_copy, copied);
910 if (!copied) {
@@ -948,7 +948,7 @@ static void write_bup(AC97LinkState *s, int elapsed)
948 while (elapsed) {
949 int temp = MIN(elapsed, sizeof(s->silence));
950 while (temp) {
951 - int copied = AUD_write(s->voice_po, s->silence, temp);
951 + int copied = AUD_write(s->audio_be, s->voice_po, s->silence, temp);
952 if (!copied) {
953 return;
954 }
@@ -978,7 +978,7 @@ static int read_audio(AC97LinkState *s, AC97BusMasterRegs *r,
978 while (temp) {
979 int acquired;
980 to_copy = MIN(temp, sizeof(tmpbuf));
981 - acquired = AUD_read(voice, tmpbuf, to_copy);
981 + acquired = AUD_read(s->audio_be, voice, tmpbuf, to_copy);
982 if (!acquired) {
983 *stop = 1;
984 break;
@@ -1275,7 +1275,7 @@ static void ac97_realize(PCIDevice *dev, Error **errp)
1275 AC97LinkState *s = AC97(dev);
1276 uint8_t *c = s->dev.config;
1277
1278 - if (!AUD_backend_check (&s->audio_be, errp)) {
1278 + if (!AUD_backend_check(&s->audio_be, errp)) {
1279 return;
1280 }
1281
hw/audio/adlib.c
+5 -4
@@ -95,7 +95,7 @@ static void adlib_write(void *opaque, uint32_t nport, uint32_t val)
95 int a = nport & 3;
96
97 s->active = 1;
98 - AUD_set_active_out (s->voice, 1);
98 + AUD_set_active_out(s->audio_be, s->voice, 1);
99
100 adlib_kill_timers (s);
101
@@ -143,7 +143,8 @@ static int write_audio (AdlibState *s, int samples)
143 int nbytes, wbytes, wsampl;
144
145 nbytes = samples << SHIFT;
146 - wbytes = AUD_write (
146 + wbytes = AUD_write(
147 + s->audio_be,
148 s->voice,
149 s->mixbuf + (pos << (SHIFT - 1)),
150 nbytes
@@ -255,7 +256,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)
256 as.fmt = AUDIO_FORMAT_S16;
257 as.endianness = HOST_BIG_ENDIAN;
258
258 - s->voice = AUD_open_out (
259 + s->voice = AUD_open_out(
260 s->audio_be,
261 s->voice,
262 "adlib",
@@ -269,7 +270,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)
270 return;
271 }
272
272 - s->samples = AUD_get_buffer_size_out (s->voice) >> SHIFT;
273 + s->samples = AUD_get_buffer_size_out(s->audio_be, s->voice) >> SHIFT;
274 s->mixbuf = g_malloc0 (s->samples << SHIFT);
275
276 adlib_portio_list[0].offset = s->port;
hw/audio/asc.c
+8 -8
@@ -355,12 +355,12 @@ static void asc_out_cb(void *opaque, int free_b)
355 * loop because the FIFO has run out of data, and the driver
356 * reuses the stale content in its circular audio buffer.
357 */
358 - AUD_write(s->voice, s->silentbuf, samples << s->shift);
358 + AUD_write(s->audio_be, s->voice, s->silentbuf, samples << s->shift);
359 }
360 return;
361 }
362
363 - AUD_write(s->voice, s->mixbuf, generated << s->shift);
363 + AUD_write(s->audio_be, s->voice, s->mixbuf, generated << s->shift);
364 }
365
366 static uint64_t asc_fifo_read(void *opaque, hwaddr addr,
@@ -470,9 +470,9 @@ static void asc_write(void *opaque, hwaddr addr, uint64_t value,
470 asc_fifo_reset(&s->fifos[1]);
471 asc_lower_irq(s);
472 if (value != 0) {
473 - AUD_set_active_out(s->voice, 1);
473 + AUD_set_active_out(s->audio_be, s->voice, 1);
474 } else {
475 - AUD_set_active_out(s->voice, 0);
475 + AUD_set_active_out(s->audio_be, s->voice, 0);
476 }
477 }
478 break;
@@ -489,7 +489,7 @@ static void asc_write(void *opaque, hwaddr addr, uint64_t value,
489 {
490 int vol = (value & 0xe0);
491
492 - AUD_set_volume_out_lr(s->voice, 0, vol, vol);
492 + AUD_set_volume_out_lr(s->audio_be, s->voice, 0, vol, vol);
493 break;
494 }
495 }
@@ -545,7 +545,7 @@ static int asc_post_load(void *opaque, int version)
545 ASCState *s = ASC(opaque);
546
547 if (s->regs[ASC_MODE] != 0) {
548 - AUD_set_active_out(s->voice, 1);
548 + AUD_set_active_out(s->audio_be, s->voice, 1);
549 }
550
551 return 0;
@@ -614,7 +614,7 @@ static void asc_reset_hold(Object *obj, ResetType type)
614 {
615 ASCState *s = ASC(obj);
616
617 - AUD_set_active_out(s->voice, 0);
617 + AUD_set_active_out(s->audio_be, s->voice, 0);
618
619 memset(s->regs, 0, sizeof(s->regs));
620 asc_fifo_reset(&s->fifos[0]);
@@ -658,7 +658,7 @@ static void asc_realize(DeviceState *dev, Error **errp)
658 }
659
660 s->shift = 1;
661 - s->samples = AUD_get_buffer_size_out(s->voice) >> s->shift;
661 + s->samples = AUD_get_buffer_size_out(s->audio_be, s->voice) >> s->shift;
662 s->mixbuf = g_malloc0(s->samples << s->shift);
663
664 s->silentbuf = g_malloc(s->samples << s->shift);
hw/audio/cs4231a.c
+8 -8
@@ -327,7 +327,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
327 goto error;
328 }
329
330 - s->voice = AUD_open_out (
330 + s->voice = AUD_open_out(
331 s->audio_be,
332 s->voice,
333 "cs4231a",
@@ -339,7 +339,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
339 if (s->dregs[Interface_Configuration] & PEN) {
340 if (!s->dma_running) {
341 k->hold_DREQ(s->isa_dma, s->dma);
342 - AUD_set_active_out (s->voice, 1);
342 + AUD_set_active_out(s->audio_be, s->voice, 1);
343 s->transferred = 0;
344 }
345 s->dma_running = 1;
@@ -347,7 +347,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
347 else {
348 if (s->dma_running) {
349 k->release_DREQ(s->isa_dma, s->dma);
350 - AUD_set_active_out (s->voice, 0);
350 + AUD_set_active_out(s->audio_be, s->voice, 0);
351 }
352 s->dma_running = 0;
353 }
@@ -356,7 +356,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)
356 error:
357 if (s->dma_running) {
358 k->release_DREQ(s->isa_dma, s->dma);
359 - AUD_set_active_out (s->voice, 0);
359 + AUD_set_active_out(s->audio_be, s->voice, 0);
360 }
361 }
362
@@ -465,7 +465,7 @@ static void cs_write (void *opaque, hwaddr addr,
465 if (s->dma_running) {
466 IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
467 k->release_DREQ(s->isa_dma, s->dma);
468 - AUD_set_active_out (s->voice, 0);
468 + AUD_set_active_out(s->audio_be, s->voice, 0);
469 s->dma_running = 0;
470 }
471 }
@@ -551,11 +551,11 @@ static int cs_write_audio (CSState *s, int nchan, int dma_pos,
551
552 for (i = 0; i < copied; ++i)
553 linbuf[i] = s->tab[tmpbuf[i]];
554 - copied = AUD_write (s->voice, linbuf, copied << 1);
554 + copied = AUD_write(s->audio_be, s->voice, linbuf, copied << 1);
555 copied >>= 1;
556 }
557 else {
558 - copied = AUD_write (s->voice, tmpbuf, copied);
558 + copied = AUD_write(s->audio_be, s->voice, tmpbuf, copied);
559 }
560
561 temp -= copied;
@@ -614,7 +614,7 @@ static int cs4231a_pre_load (void *opaque)
614 if (s->dma_running) {
615 IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);
616 k->release_DREQ(s->isa_dma, s->dma);
617 - AUD_set_active_out (s->voice, 0);
617 + AUD_set_active_out(s->audio_be, s->voice, 0);
618 }
619 s->dma_running = 0;
620 return 0;
hw/audio/es1370.c
+6 -6
@@ -411,7 +411,7 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)
411
412 if (i == ADC_CHANNEL) {
413 s->adc_voice =
414 - AUD_open_in (
414 + AUD_open_in(
415 s->audio_be,
416 s->adc_voice,
417 "es1370.adc",
@@ -421,7 +421,7 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)
421 );
422 } else {
423 s->dac_voice[i] =
424 - AUD_open_out (
424 + AUD_open_out(
425 s->audio_be,
426 s->dac_voice[i],
427 i ? "es1370.dac2" : "es1370.dac1",
@@ -438,9 +438,9 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)
438 int on = (ctl & b->ctl_en) && !(sctl & b->sctl_pause);
439
440 if (i == ADC_CHANNEL) {
441 - AUD_set_active_in (s->adc_voice, on);
441 + AUD_set_active_in(s->audio_be, s->adc_voice, on);
442 } else {
443 - AUD_set_active_out (s->dac_voice[i], on);
443 + AUD_set_active_out(s->audio_be, s->dac_voice[i], on);
444 }
445 }
446 }
@@ -627,7 +627,7 @@ static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,
627 int acquired, to_copy;
628
629 to_copy = MIN(to_transfer, sizeof(tmpbuf));
630 - acquired = AUD_read (s->adc_voice, tmpbuf, to_copy);
630 + acquired = AUD_read(s->audio_be, s->adc_voice, tmpbuf, to_copy);
631 if (!acquired) {
632 break;
633 }
@@ -646,7 +646,7 @@ static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,
646
647 to_copy = MIN(to_transfer, sizeof(tmpbuf));
648 pci_dma_read (&s->dev, addr, tmpbuf, to_copy);
649 - copied = AUD_write (voice, tmpbuf, to_copy);
649 + copied = AUD_write(s->audio_be, voice, tmpbuf, to_copy);
650 if (!copied) {
651 break;
652 }
hw/audio/gus.c
+5 -4
@@ -87,7 +87,8 @@ static int write_audio (GUSState *s, int samples)
87 int nbytes, wbytes, wsampl;
88
89 nbytes = samples << s->shift;
90 - wbytes = AUD_write (
90 + wbytes = AUD_write(
91 + s->audio_be,
92 s->voice,
93 s->mixbuf + (pos << (s->shift - 1)),
94 nbytes
@@ -257,7 +258,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
258 as.fmt = AUDIO_FORMAT_S16;
259 as.endianness = HOST_BIG_ENDIAN;
260
260 - s->voice = AUD_open_out (
261 + s->voice = AUD_open_out(
262 s->audio_be,
263 NULL,
264 "gus",
@@ -272,7 +273,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
273 }
274
275 s->shift = 2;
275 - s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift;
276 + s->samples = AUD_get_buffer_size_out(s->audio_be, s->voice) >> s->shift;
277 s->mixbuf = g_malloc0 (s->samples << s->shift);
278
279 isa_register_portio_list(d, &s->portio_list1, s->port,
@@ -287,7 +288,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)
288 s->emu.opaque = s;
289 s->pic = isa_bus_get_irq(bus, s->emu.gusirq);
290
290 - AUD_set_active_out (s->voice, 1);
291 + AUD_set_active_out(s->audio_be, s->voice, 1);
292 }
293
294 static const Property gus_properties[] = {
hw/audio/hda-codec.c
+12 -8
@@ -275,7 +275,8 @@ static void hda_audio_input_cb(void *opaque, int avail)
275 while (to_transfer) {
276 uint32_t start = (uint32_t) (wpos & B_MASK);
277 uint32_t chunk = (uint32_t) MIN(B_SIZE - start, to_transfer);
278 - uint32_t read = AUD_read(st->voice.in, st->buf + start, chunk);
278 + uint32_t read = AUD_read(st->state->audio_be, st->voice.in,
279 + st->buf + start, chunk);
280 wpos += read;
281 to_transfer -= read;
282 st->wpos += read;
@@ -354,7 +355,8 @@ static void hda_audio_output_cb(void *opaque, int avail)
355 while (to_transfer) {
356 uint32_t start = (uint32_t) (rpos & B_MASK);
357 uint32_t chunk = (uint32_t) MIN(B_SIZE - start, to_transfer);
357 - uint32_t written = AUD_write(st->voice.out, st->buf + start, chunk);
358 + uint32_t written = AUD_write(st->state->audio_be, st->voice.out,
359 + st->buf + start, chunk);
360 rpos += written;
361 to_transfer -= written;
362 st->rpos += written;
@@ -375,7 +377,8 @@ static void hda_audio_compat_input_cb(void *opaque, int avail)
377
378 while (avail - recv >= sizeof(st->compat_buf)) {
379 if (st->compat_bpos != sizeof(st->compat_buf)) {
378 - len = AUD_read(st->voice.in, st->compat_buf + st->compat_bpos,
380 + len = AUD_read(st->state->audio_be, st->voice.in,
381 + st->compat_buf + st->compat_bpos,
382 sizeof(st->compat_buf) - st->compat_bpos);
383 st->compat_bpos += len;
384 recv += len;
@@ -408,7 +411,8 @@ static void hda_audio_compat_output_cb(void *opaque, int avail)
411 }
412 st->compat_bpos = 0;
413 }
411 - len = AUD_write(st->voice.out, st->compat_buf + st->compat_bpos,
414 + len = AUD_write(st->state->audio_be, st->voice.out,
415 + st->compat_buf + st->compat_bpos,
416 sizeof(st->compat_buf) - st->compat_bpos);
417 st->compat_bpos += len;
418 sent += len;
@@ -440,9 +444,9 @@ static void hda_audio_set_running(HDAAudioStream *st, bool running)
444 }
445 }
446 if (st->output) {
443 - AUD_set_active_out(st->voice.out, st->running);
447 + AUD_set_active_out(st->state->audio_be, st->voice.out, st->running);
448 } else {
445 - AUD_set_active_in(st->voice.in, st->running);
449 + AUD_set_active_in(st->state->audio_be, st->voice.in, st->running);
450 }
451 }
452
@@ -466,9 +470,9 @@ static void hda_audio_set_amp(HDAAudioStream *st)
470 return;
471 }
472 if (st->output) {
469 - AUD_set_volume_out_lr(st->voice.out, muted, left, right);
473 + AUD_set_volume_out_lr(st->state->audio_be, st->voice.out, muted, left, right);
474 } else {
471 - AUD_set_volume_in_lr(st->voice.in, muted, left, right);
475 + AUD_set_volume_in_lr(st->state->audio_be, st->voice.in, muted, left, right);
476 }
477 }
478
hw/audio/lm4549.c
+6 -6
@@ -101,11 +101,11 @@ static void lm4549_audio_transfer(lm4549_state *s)
101 uint32_t i;
102
103 /* Activate the voice */
104 - AUD_set_active_out(s->voice, 1);
104 + AUD_set_active_out(s->audio_be, s->voice, 1);
105 s->voice_is_active = 1;
106
107 /* Try to write the buffer content */
108 - written_bytes = AUD_write(s->voice, s->buffer,
108 + written_bytes = AUD_write(s->audio_be, s->voice, s->buffer,
109 s->buffer_level * sizeof(uint16_t));
110 written_samples = written_bytes >> 1;
111
@@ -129,14 +129,14 @@ static void lm4549_audio_out_callback(void *opaque, int free)
129 static uint32_t prev_buffer_level;
130
131 #ifdef LM4549_DEBUG
132 - int size = AUD_get_buffer_size_out(s->voice);
132 + int size = AUD_get_buffer_size_out(s->audio_be, s->voice);
133 DPRINTF("audio_out_callback size = %i free = %i\n", size, free);
134 #endif
135
136 /* Detect that no data are consumed
137 => disable the voice */
138 if (s->buffer_level == prev_buffer_level) {
139 - AUD_set_active_out(s->voice, 0);
139 + AUD_set_active_out(s->audio_be, s->voice, 0);
140 s->voice_is_active = 0;
141 }
142 prev_buffer_level = s->buffer_level;
@@ -285,7 +285,7 @@ static int lm4549_post_load(void *opaque, int version_id)
285
286 /* Request data */
287 if (s->voice_is_active == 1) {
288 - lm4549_audio_out_callback(s, AUD_get_buffer_size_out(s->voice));
288 + lm4549_audio_out_callback(s, AUD_get_buffer_size_out(s->audio_be, s->voice));
289 }
290
291 return 0;
@@ -323,7 +323,7 @@ void lm4549_init(lm4549_state *s, lm4549_callback data_req_cb, void* opaque,
323 &as
324 );
325
326 - AUD_set_volume_out_lr(s->voice, 0, 255, 255);
326 + AUD_set_volume_out_lr(s->audio_be, s->voice, 0, 255, 255);
327
328 s->voice_is_active = 0;
329
hw/audio/pcspk.c
+2 -2
@@ -105,7 +105,7 @@ static void pcspk_callback(void *opaque, int free)
105
106 while (free > 0) {
107 n = MIN(s->samples - s->play_pos, (unsigned int)free);
108 - n = AUD_write(s->voice, &s->sample_buf[s->play_pos], n);
108 + n = AUD_write(s->audio_be, s->voice, &s->sample_buf[s->play_pos], n);
109 if (!n)
110 break;
111 s->play_pos = (s->play_pos + n) % s->samples;
@@ -163,7 +163,7 @@ static void pcspk_io_write(void *opaque, hwaddr addr, uint64_t val,
163 if (s->voice) {
164 if (gate) /* restart */
165 s->play_pos = 0;
166 - AUD_set_active_out(s->voice, gate & s->data_on);
166 + AUD_set_active_out(s->audio_be, s->voice, gate & s->data_on);
167 }
168 }
169
hw/audio/sb16.c
+7 -7
@@ -185,11 +185,11 @@ static void control (SB16State *s, int hold)
185
186 if (hold) {
187 k->hold_DREQ(isa_dma, dma);
188 - AUD_set_active_out (s->voice, 1);
188 + AUD_set_active_out(s->audio_be, s->voice, 1);
189 }
190 else {
191 k->release_DREQ(isa_dma, dma);
192 - AUD_set_active_out (s->voice, 0);
192 + AUD_set_active_out(s->audio_be, s->voice, 0);
193 }
194 }
195
@@ -215,7 +215,7 @@ static void continue_dma8 (SB16State *s)
215 as.fmt = s->fmt;
216 as.endianness = 0;
217
218 - s->voice = AUD_open_out (
218 + s->voice = AUD_open_out(
219 s->audio_be,
220 s->voice,
221 "sb16",
@@ -378,7 +378,7 @@ static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)
378 as.fmt = s->fmt;
379 as.endianness = 0;
380
381 - s->voice = AUD_open_out (
381 + s->voice = AUD_open_out(
382 s->audio_be,
383 s->voice,
384 "sb16",
@@ -879,7 +879,7 @@ static void legacy_reset (SB16State *s)
879 as.fmt = AUDIO_FORMAT_U8;
880 as.endianness = 0;
881
882 - s->voice = AUD_open_out (
882 + s->voice = AUD_open_out(
883 s->audio_be,
884 s->voice,
885 "sb16",
@@ -1196,7 +1196,7 @@ static int write_audio (SB16State *s, int nchan, int dma_pos,
1196 }
1197
1198 copied = k->read_memory(isa_dma, nchan, tmpbuf, dma_pos, to_copy);
1199 - copied = AUD_write (s->voice, tmpbuf, copied);
1199 + copied = AUD_write(s->audio_be, s->voice, tmpbuf, copied);
1200
1201 temp -= copied;
1202 dma_pos = (dma_pos + copied) % dma_len;
@@ -1302,7 +1302,7 @@ static int sb16_post_load (void *opaque, int version_id)
1302 as.fmt = s->fmt;
1303 as.endianness = 0;
1304
1305 - s->voice = AUD_open_out (
1305 + s->voice = AUD_open_out(
1306 s->audio_be,
1307 s->voice,
1308 "sb16",
hw/audio/via-ac97.c
+7 -7
@@ -53,7 +53,7 @@ static void codec_volume_set_out(ViaAC97State *s)
53 rvol /= 255;
54 mute = CODEC_REG(s, AC97_Master_Volume_Mute) >> MUTE_SHIFT;
55 mute |= CODEC_REG(s, AC97_PCM_Out_Volume_Mute) >> MUTE_SHIFT;
56 - AUD_set_volume_out_lr(s->vo, mute, lvol, rvol);
56 + AUD_set_volume_out_lr(s->audio_be, s->vo, mute, lvol, rvol);
57 }
58
59 static void codec_reset(ViaAC97State *s)
@@ -189,7 +189,7 @@ static void out_cb(void *opaque, int avail)
189 while (temp) {
190 to_copy = MIN(temp, sizeof(tmpbuf));
191 pci_dma_read(&s->dev, c->addr, tmpbuf, to_copy);
192 - copied = AUD_write(s->vo, tmpbuf, to_copy);
192 + copied = AUD_write(s->audio_be, s->vo, tmpbuf, to_copy);
193 if (!copied) {
194 stop = true;
195 break;
@@ -208,7 +208,7 @@ static void out_cb(void *opaque, int avail)
208 c->stat |= STAT_PAUSED;
209 } else {
210 c->stat &= ~STAT_ACTIVE;
211 - AUD_set_active_out(s->vo, 0);
211 + AUD_set_active_out(s->audio_be, s->vo, 0);
212 }
213 if (c->type & STAT_EOL) {
214 via_isa_set_irq(&s->dev, 0, 1);
@@ -317,20 +317,20 @@ static void sgd_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)
317 break;
318 case 1:
319 if (val & CNTL_START) {
320 - AUD_set_active_out(s->vo, 1);
320 + AUD_set_active_out(s->audio_be, s->vo, 1);
321 s->aur.stat = STAT_ACTIVE;
322 }
323 if (val & CNTL_TERM) {
324 - AUD_set_active_out(s->vo, 0);
324 + AUD_set_active_out(s->audio_be, s->vo, 0);
325 s->aur.stat &= ~(STAT_ACTIVE | STAT_PAUSED);
326 s->aur.clen = 0;
327 }
328 if (val & CNTL_PAUSE) {
329 - AUD_set_active_out(s->vo, 0);
329 + AUD_set_active_out(s->audio_be, s->vo, 0);
330 s->aur.stat &= ~STAT_ACTIVE;
331 s->aur.stat |= STAT_PAUSED;
332 } else if (!(val & CNTL_PAUSE) && (s->aur.stat & STAT_PAUSED)) {
333 - AUD_set_active_out(s->vo, 1);
333 + AUD_set_active_out(s->audio_be, s->vo, 1);
334 s->aur.stat |= STAT_ACTIVE;
335 s->aur.stat &= ~STAT_PAUSED;
336 }
hw/audio/virtio-snd.c
+8 -6
@@ -475,7 +475,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id)
475 stream,
476 virtio_snd_pcm_out_cb,
477 &as);
478 - AUD_set_volume_out_lr(stream->voice.out, 0, 255, 255);
478 + AUD_set_volume_out_lr(s->audio_be, stream->voice.out, 0, 255, 255);
479 } else {
480 stream->voice.in = AUD_open_in(s->audio_be,
481 stream->voice.in,
@@ -483,7 +483,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id)
483 stream,
484 virtio_snd_pcm_in_cb,
485 &as);
486 - AUD_set_volume_in_lr(stream->voice.in, 0, 255, 255);
486 + AUD_set_volume_in_lr(s->audio_be, stream->voice.in, 0, 255, 255);
487 }
488
489 return cpu_to_le32(VIRTIO_SND_S_OK);
@@ -573,9 +573,9 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSound *s,
573 stream->active = start;
574 }
575 if (stream->info.direction == VIRTIO_SND_D_OUTPUT) {
576 - AUD_set_active_out(stream->voice.out, start);
576 + AUD_set_active_out(s->audio_be, stream->voice.out, start);
577 } else {
578 - AUD_set_active_in(stream->voice.in, start);
578 + AUD_set_active_in(s->audio_be, stream->voice.in, start);
579 }
580 } else {
581 error_report("Invalid stream id: %"PRIu32, stream_id);
@@ -1177,7 +1177,8 @@ static void virtio_snd_pcm_out_cb(void *data, int available)
1177 buffer->populated = true;
1178 }
1179 for (;;) {
1180 - size = AUD_write(stream->voice.out,
1180 + size = AUD_write(stream->s->audio_be,
1181 + stream->voice.out,
1182 buffer->data + buffer->offset,
1183 MIN(buffer->size, available));
1184 assert(size <= MIN(buffer->size, available));
@@ -1279,7 +1280,8 @@ static void virtio_snd_pcm_in_cb(void *data, int available)
1280 to_read = stream->params.period_bytes - buffer->size;
1281 to_read = MIN(to_read, available);
1282 to_read = MIN(to_read, max_size - buffer->size);
1282 - size = AUD_read(stream->voice.in,
1283 + size = AUD_read(stream->s->audio_be,
1284 + stream->voice.in,
1285 buffer->data + buffer->size,
1286 to_read);
1287 if (!size) {
hw/audio/wm8750.c
+12 -12
@@ -72,7 +72,7 @@ static inline void wm8750_in_load(WM8750State *s)
72 if (s->idx_in + s->req_in <= sizeof(s->data_in))
73 return;
74 s->idx_in = MAX(0, (int) sizeof(s->data_in) - s->req_in);
75 - AUD_read(*s->in[0], s->data_in + s->idx_in,
75 + AUD_read(s->audio_be, *s->in[0], s->data_in + s->idx_in,
76 sizeof(s->data_in) - s->idx_in);
77 }
78
@@ -80,7 +80,7 @@ static inline void wm8750_out_flush(WM8750State *s)
80 {
81 int sent = 0;
82 while (sent < s->idx_out)
83 - sent += AUD_write(*s->out[0], s->data_out + sent, s->idx_out - sent)
83 + sent += AUD_write(s->audio_be, *s->out[0], s->data_out + sent, s->idx_out - sent)
84 ?: s->idx_out;
85 s->idx_out = 0;
86 }
@@ -145,30 +145,30 @@ static void wm8750_vol_update(WM8750State *s)
145 {
146 /* FIXME: multiply all volumes by s->invol[2], s->invol[3] */
147
148 - AUD_set_volume_in_lr(s->adc_voice[0], s->mute,
148 + AUD_set_volume_in_lr(s->audio_be, s->adc_voice[0], s->mute,
149 s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]),
150 s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1]));
151 - AUD_set_volume_in_lr(s->adc_voice[1], s->mute,
151 + AUD_set_volume_in_lr(s->audio_be, s->adc_voice[1], s->mute,
152 s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]),
153 s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1]));
154 - AUD_set_volume_in_lr(s->adc_voice[2], s->mute,
154 + AUD_set_volume_in_lr(s->audio_be, s->adc_voice[2], s->mute,
155 s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]),
156 s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1]));
157
158 /* FIXME: multiply all volumes by s->outvol[0], s->outvol[1] */
159
160 /* Speaker: LOUT2VOL ROUT2VOL */
161 - AUD_set_volume_out_lr(s->dac_voice[0], s->mute,
161 + AUD_set_volume_out_lr(s->audio_be, s->dac_voice[0], s->mute,
162 s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[4]),
163 s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[5]));
164
165 /* Headphone: LOUT1VOL ROUT1VOL */
166 - AUD_set_volume_out_lr(s->dac_voice[1], s->mute,
166 + AUD_set_volume_out_lr(s->audio_be, s->dac_voice[1], s->mute,
167 s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[2]),
168 s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[3]));
169
170 /* MONOOUT: MONOVOL MONOVOL */
171 - AUD_set_volume_out_lr(s->dac_voice[2], s->mute,
171 + AUD_set_volume_out_lr(s->audio_be, s->dac_voice[2], s->mute,
172 s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[6]),
173 s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[6]));
174 }
@@ -182,9 +182,9 @@ static void wm8750_set_format(WM8750State *s)
182 wm8750_out_flush(s);
183
184 if (s->in[0] && *s->in[0])
185 - AUD_set_active_in(*s->in[0], 0);
185 + AUD_set_active_in(s->audio_be, *s->in[0], 0);
186 if (s->out[0] && *s->out[0])
187 - AUD_set_active_out(*s->out[0], 0);
187 + AUD_set_active_out(s->audio_be, *s->out[0], 0);
188
189 for (i = 0; i < IN_PORT_N; i ++)
190 if (s->adc_voice[i]) {
@@ -235,9 +235,9 @@ static void wm8750_set_format(WM8750State *s)
235 * for mixing or combining paths to different ports, so we
236 * connect both channels to where the left channel is routed. */
237 if (s->in[0] && *s->in[0])
238 - AUD_set_active_in(*s->in[0], 1);
238 + AUD_set_active_in(s->audio_be, *s->in[0], 1);
239 if (s->out[0] && *s->out[0])
240 - AUD_set_active_out(*s->out[0], 1);
240 + AUD_set_active_out(s->audio_be, *s->out[0], 1);
241 }
242
243 static void wm8750_clk_update(WM8750State *s, int ext)
hw/display/xlnx_dp.c
+5 -5
@@ -331,7 +331,7 @@ static inline void xlnx_dp_audio_activate(XlnxDPState *s)
331 {
332 bool activated = ((s->core_registers[DP_TX_AUDIO_CONTROL]
333 & DP_TX_AUD_CTRL) != 0);
334 - AUD_set_active_out(s->amixer_output_stream, activated);
334 + AUD_set_active_out(s->audio_be, s->amixer_output_stream, activated);
335 xlnx_dpdma_set_host_data_location(s->dpdma, DP_AUDIO_DMA_CHANNEL(0),
336 &s->audio_buffer_0);
337 xlnx_dpdma_set_host_data_location(s->dpdma, DP_AUDIO_DMA_CHANNEL(1),
@@ -401,7 +401,7 @@ static void xlnx_dp_audio_callback(void *opaque, int avail)
401 /* Send the buffer through the audio. */
402 if (s->byte_left <= MAX_QEMU_BUFFER_SIZE) {
403 if (s->byte_left != 0) {
404 - written = AUD_write(s->amixer_output_stream,
404 + written = AUD_write(s->audio_be, s->amixer_output_stream,
405 &s->out_buffer[s->data_ptr], s->byte_left);
406 } else {
407 int len_to_copy;
@@ -413,12 +413,12 @@ static void xlnx_dp_audio_callback(void *opaque, int avail)
413 while (avail) {
414 len_to_copy = MIN(AUD_CHBUF_MAX_DEPTH, avail);
415 memset(s->out_buffer, 0, len_to_copy);
416 - avail -= AUD_write(s->amixer_output_stream, s->out_buffer,
416 + avail -= AUD_write(s->audio_be, s->amixer_output_stream, s->out_buffer,
417 len_to_copy);
418 }
419 }
420 } else {
421 - written = AUD_write(s->amixer_output_stream,
421 + written = AUD_write(s->audio_be, s->amixer_output_stream,
422 &s->out_buffer[s->data_ptr], MAX_QEMU_BUFFER_SIZE);
423 }
424 s->byte_left -= written;
@@ -1401,7 +1401,7 @@ static void xlnx_dp_realize(DeviceState *dev, Error **errp)
1401 s,
1402 xlnx_dp_audio_callback,
1403 &as);
1404 - AUD_set_volume_out_lr(s->amixer_output_stream, 0, 255, 255);
1404 + AUD_set_volume_out_lr(s->audio_be, s->amixer_output_stream, 0, 255, 255);
1405 xlnx_dp_audio_activate(s);
1406 s->vblank = ptimer_init(vblank_hit, s, DP_VBLANK_PTIMER_POLICY);
1407 ptimer_transaction_begin(s->vblank);
hw/usb/dev-audio.c
+6 -6
@@ -669,7 +669,7 @@ static void output_callback(void *opaque, int avail)
669 return;
670 }
671
672 - written = AUD_write(s->out.voice, data, len);
672 + written = AUD_write(s->audio_be, s->out.voice, data, len);
673 avail -= written;
674 s->out.buf.cons += written;
675
@@ -683,7 +683,7 @@ static int usb_audio_set_output_altset(USBAudioState *s, int altset)
683 {
684 switch (altset) {
685 case ALTSET_OFF:
686 - AUD_set_active_out(s->out.voice, false);
686 + AUD_set_active_out(s->audio_be, s->out.voice, false);
687 break;
688 case ALTSET_STEREO:
689 case ALTSET_51:
@@ -692,7 +692,7 @@ static int usb_audio_set_output_altset(USBAudioState *s, int altset)
692 usb_audio_reinit(USB_DEVICE(s), altset_channels[altset]);
693 }
694 streambuf_init(&s->out.buf, s->buffer, s->out.channels);
695 - AUD_set_active_out(s->out.voice, true);
695 + AUD_set_active_out(s->audio_be, s->out.voice, true);
696 break;
697 default:
698 return -1;
@@ -805,7 +805,7 @@ static int usb_audio_set_control(USBAudioState *s, uint8_t attrib,
805 }
806 fprintf(stderr, "\n");
807 }
808 - AUD_set_volume_out(s->out.voice, &s->out.vol);
808 + AUD_set_volume_out(s->audio_be, s->out.voice, &s->out.vol);
809 }
810
811 return ret;
@@ -980,8 +980,8 @@ static void usb_audio_reinit(USBDevice *dev, unsigned channels)
980
981 s->out.voice = AUD_open_out(s->audio_be, s->out.voice, TYPE_USB_AUDIO,
982 s, output_callback, &s->out.as);
983 - AUD_set_volume_out(s->out.voice, &s->out.vol);
984 - AUD_set_active_out(s->out.voice, 0);
983 + AUD_set_volume_out(s->audio_be, s->out.voice, &s->out.vol);
984 + AUD_set_active_out(s->audio_be, s->out.voice, 0);
985 }
986
987 static const VMStateDescription vmstate_usb_audio = {
include/qemu/audio-capture.h
+6 -3
@@ -36,8 +36,11 @@ CaptureVoiceOut *AUD_add_capture(
36 AudioBackend *be,
37 struct audsettings *as,
38 struct audio_capture_ops *ops,
39 - void *opaque
40 - );
41 -void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);
39 + void *opaque);
40 +
41 +void AUD_del_capture(
42 + AudioBackend *be,
43 + CaptureVoiceOut *cap,
44 + void *cb_opaque);
45
46 #endif /* QEMU_AUDIO_CAPTURE_H */
include/qemu/audio.h
+19 -15
@@ -63,7 +63,7 @@ typedef struct AudioBackendClass {
63
64 bool AUD_backend_check(AudioBackend **be, Error **errp);
65
66 -SWVoiceOut *AUD_open_out (
66 +SWVoiceOut *AUD_open_out(
67 AudioBackend *be,
68 SWVoiceOut *sw,
69 const char *name,
@@ -72,11 +72,11 @@ SWVoiceOut *AUD_open_out (
72 const struct audsettings *settings
73 );
74
75 -void AUD_close_out (AudioBackend *be, SWVoiceOut *sw);
76 -size_t AUD_write (SWVoiceOut *sw, void *pcm_buf, size_t size);
77 -int AUD_get_buffer_size_out (SWVoiceOut *sw);
78 -void AUD_set_active_out(SWVoiceOut *sw, bool on);
79 -bool AUD_is_active_out(SWVoiceOut *sw);
75 +void AUD_close_out(AudioBackend *be, SWVoiceOut *sw);
76 +size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *pcm_buf, size_t size);
77 +int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw);
78 +void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on);
79 +bool AUD_is_active_out(AudioBackend *be, SWVoiceOut *sw);
80
81 #define AUDIO_MAX_CHANNELS 16
82 typedef struct Volume {
@@ -85,19 +85,23 @@ typedef struct Volume {
85 uint8_t vol[AUDIO_MAX_CHANNELS];
86 } Volume;
87
88 -void AUD_set_volume_out(SWVoiceOut *sw, Volume *vol);
89 -void AUD_set_volume_in(SWVoiceIn *sw, Volume *vol);
88 +void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol);
89 +void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol);
90
91 static inline void
92 -AUD_set_volume_out_lr(SWVoiceOut *sw, bool mut, uint8_t lvol, uint8_t rvol) {
93 - AUD_set_volume_out(sw, &(Volume) {
92 +AUD_set_volume_out_lr(AudioBackend *be, SWVoiceOut *sw,
93 + bool mut, uint8_t lvol, uint8_t rvol)
94 +{
95 + AUD_set_volume_out(be, sw, &(Volume) {
96 .mute = mut, .channels = 2, .vol = { lvol, rvol }
97 });
98 }
99
100 static inline void
99 -AUD_set_volume_in_lr(SWVoiceIn *sw, bool mut, uint8_t lvol, uint8_t rvol) {
100 - AUD_set_volume_in(sw, &(Volume) {
101 +AUD_set_volume_in_lr(AudioBackend *be, SWVoiceIn *sw,
102 + bool mut, uint8_t lvol, uint8_t rvol)
103 +{
104 + AUD_set_volume_in(be, sw, &(Volume) {
105 .mute = mut, .channels = 2, .vol = { lvol, rvol }
106 });
107 }
@@ -112,9 +116,9 @@ SWVoiceIn *AUD_open_in(
116 );
117
118 void AUD_close_in(AudioBackend *be, SWVoiceIn *sw);
115 -size_t AUD_read (SWVoiceIn *sw, void *pcm_buf, size_t size);
116 -void AUD_set_active_in(SWVoiceIn *sw, bool on);
117 -bool AUD_is_active_in(SWVoiceIn *sw);
119 +size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *pcm_buf, size_t size);
120 +void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on);
121 +bool AUD_is_active_in(AudioBackend *be, SWVoiceIn *sw);
122
123 void audio_cleanup(void);
124
tests/audio/test-audio.c
+42 -41
@@ -142,7 +142,7 @@ static void test_sine_callback(void *opaque, int avail)
142
143 generate_sine_samples(buffer, frames_to_write, s->frames_written);
144
145 - bytes_written = AUD_write(s->voice, buffer,
145 + bytes_written = AUD_write(s->be, s->voice, buffer,
146 frames_to_write * sizeof(int16_t) * CHANNELS);
147 s->frames_written += bytes_written / (sizeof(int16_t) * CHANNELS);
148 }
@@ -163,7 +163,7 @@ static void test_audio_out_sine_wave(void)
163 &state, test_sine_callback);
164
165 g_test_message("Playing 440Hz sine wave for %d seconds...", DURATION_SECS);
166 - AUD_set_active_out(state.voice, true);
166 + AUD_set_active_out(state.be, state.voice, true);
167
168 /*
169 * Run the audio subsystem until all frames are written or timeout.
@@ -188,7 +188,7 @@ static void test_audio_out_sine_wave(void)
188
189 g_assert_cmpint(state.frames_written, ==, state.total_frames);
190
191 - AUD_set_active_out(state.voice, false);
191 + AUD_set_active_out(state.be, state.voice, false);
192 AUD_close_out(state.be, state.voice);
193 }
194
@@ -224,13 +224,13 @@ static void test_audio_out_active_state(void)
224 be = get_test_audio_backend();
225 voice = open_test_voice_out(be, "test-active", NULL, dummy_audio_callback);
226
227 - g_assert_false(AUD_is_active_out(voice));
227 + g_assert_false(AUD_is_active_out(be, voice));
228
229 - AUD_set_active_out(voice, true);
230 - g_assert_true(AUD_is_active_out(voice));
229 + AUD_set_active_out(be, voice, true);
230 + g_assert_true(AUD_is_active_out(be, voice));
231
232 - AUD_set_active_out(voice, false);
233 - g_assert_false(AUD_is_active_out(voice));
232 + AUD_set_active_out(be, voice, false);
233 + g_assert_false(AUD_is_active_out(be, voice));
234
235 AUD_close_out(be, voice);
236 }
@@ -244,13 +244,13 @@ static void test_audio_out_buffer_size(void)
244 be = get_test_audio_backend();
245 voice = open_test_voice_out(be, "test-buffer", NULL, dummy_audio_callback);
246
247 - buffer_size = AUD_get_buffer_size_out(voice);
247 + buffer_size = AUD_get_buffer_size_out(be, voice);
248 g_test_message("Buffer size: %d bytes", buffer_size);
249 g_assert_cmpint(buffer_size, >, 0);
250
251 AUD_close_out(be, voice);
252
253 - g_assert_cmpint(AUD_get_buffer_size_out(NULL), ==, 0);
253 + g_assert_cmpint(AUD_get_buffer_size_out(NULL, NULL), ==, 0);
254 }
255
256 static void test_audio_out_volume(void)
@@ -263,13 +263,13 @@ static void test_audio_out_volume(void)
263 voice = open_test_voice_out(be, "test-volume", NULL, dummy_audio_callback);
264
265 vol = (Volume){ .mute = false, .channels = 2, .vol = {255, 255} };
266 - AUD_set_volume_out(voice, &vol);
266 + AUD_set_volume_out(be, voice, &vol);
267
268 vol = (Volume){ .mute = true, .channels = 2, .vol = {255, 255} };
269 - AUD_set_volume_out(voice, &vol);
269 + AUD_set_volume_out(be, voice, &vol);
270
271 vol = (Volume){ .mute = false, .channels = 2, .vol = {128, 128} };
272 - AUD_set_volume_out(voice, &vol);
272 + AUD_set_volume_out(be, voice, &vol);
273
274 AUD_close_out(be, voice);
275 }
@@ -286,13 +286,13 @@ static void test_audio_in_active_state(void)
286 return;
287 }
288
289 - g_assert_false(AUD_is_active_in(voice));
289 + g_assert_false(AUD_is_active_in(be, voice));
290
291 - AUD_set_active_in(voice, true);
292 - g_assert_true(AUD_is_active_in(voice));
291 + AUD_set_active_in(be, voice, true);
292 + g_assert_true(AUD_is_active_in(be, voice));
293
294 - AUD_set_active_in(voice, false);
295 - g_assert_false(AUD_is_active_in(voice));
294 + AUD_set_active_in(be, voice, false);
295 + g_assert_false(AUD_is_active_in(be, voice));
296
297 AUD_close_in(be, voice);
298 }
@@ -311,10 +311,10 @@ static void test_audio_in_volume(void)
311 }
312
313 vol = (Volume){ .mute = false, .channels = 2, .vol = {255, 255} };
314 - AUD_set_volume_in(voice, &vol);
314 + AUD_set_volume_in(be, voice, &vol);
315
316 vol = (Volume){ .mute = true, .channels = 2, .vol = {255, 255} };
317 - AUD_set_volume_in(voice, &vol);
317 + AUD_set_volume_in(be, voice, &vol);
318
319 AUD_close_in(be, voice);
320 }
@@ -427,7 +427,7 @@ static void test_audio_capture(void)
427 &sine_state, test_sine_callback);
428 sine_state.voice = voice;
429
430 - AUD_set_active_out(voice, true);
430 + AUD_set_active_out(be, voice, true);
431
432 start_time = g_get_monotonic_time();
433 while (sine_state.frames_written < sine_state.total_frames ||
@@ -472,10 +472,10 @@ static void test_audio_capture(void)
472 g_assert_cmpfloat(match_ratio, >=, 0.9);
473 }
474
475 - AUD_set_active_out(voice, false);
475 + AUD_set_active_out(be, voice, false);
476 AUD_close_out(be, voice);
477
478 - AUD_del_capture(cap, &state);
478 + AUD_del_capture(be, cap, &state);
479 g_assert_true(state.destroy_called);
480
481 g_free(state.captured_samples);
@@ -483,26 +483,27 @@ static void test_audio_capture(void)
483
484 static void test_audio_null_handling(void)
485 {
486 + AudioBackend *be = get_test_audio_backend();
487 uint8_t buffer[64];
488
489 /* AUD_is_active_out/in(NULL) should return false */
489 - g_assert_false(AUD_is_active_out(NULL));
490 - g_assert_false(AUD_is_active_in(NULL));
490 + g_assert_false(AUD_is_active_out(be, NULL));
491 + g_assert_false(AUD_is_active_in(be, NULL));
492
493 /* AUD_get_buffer_size_out(NULL) should return 0 */
493 - g_assert_cmpint(AUD_get_buffer_size_out(NULL), ==, 0);
494 + g_assert_cmpint(AUD_get_buffer_size_out(be, NULL), ==, 0);
495
496 /* AUD_write/read(NULL, ...) should return size (no-op) */
496 - g_assert_cmpuint(AUD_write(NULL, buffer, sizeof(buffer)), ==,
497 + g_assert_cmpuint(AUD_write(be, NULL, buffer, sizeof(buffer)), ==,
498 sizeof(buffer));
498 - g_assert_cmpuint(AUD_read(NULL, buffer, sizeof(buffer)), ==,
499 + g_assert_cmpuint(AUD_read(be, NULL, buffer, sizeof(buffer)), ==,
500 sizeof(buffer));
501
502 /* These should not crash */
502 - AUD_set_active_out(NULL, true);
503 - AUD_set_active_out(NULL, false);
504 - AUD_set_active_in(NULL, true);
505 - AUD_set_active_in(NULL, false);
503 + AUD_set_active_out(be, NULL, true);
504 + AUD_set_active_out(be, NULL, false);
505 + AUD_set_active_in(be, NULL, true);
506 + AUD_set_active_in(be, NULL, false);
507 }
508
509 static void test_audio_multiple_voices(void)
@@ -516,19 +517,19 @@ static void test_audio_multiple_voices(void)
517 out2 = open_test_voice_out(be, "test-multi-out2", NULL, dummy_audio_callback);
518 in1 = open_test_voice_in(be, "test-multi-in1", NULL, dummy_audio_callback);
519
519 - AUD_set_active_out(out1, true);
520 - AUD_set_active_out(out2, true);
521 - AUD_set_active_in(in1, true);
520 + AUD_set_active_out(be, out1, true);
521 + AUD_set_active_out(be, out2, true);
522 + AUD_set_active_in(be, in1, true);
523
523 - g_assert_true(AUD_is_active_out(out1));
524 - g_assert_true(AUD_is_active_out(out2));
524 + g_assert_true(AUD_is_active_out(be, out1));
525 + g_assert_true(AUD_is_active_out(be, out2));
526 if (in1) {
526 - g_assert_true(AUD_is_active_in(in1));
527 + g_assert_true(AUD_is_active_in(be, in1));
528 }
529
529 - AUD_set_active_out(out1, false);
530 - AUD_set_active_out(out2, false);
531 - AUD_set_active_in(in1, false);
530 + AUD_set_active_out(be, out1, false);
531 + AUD_set_active_out(be, out2, false);
532 + AUD_set_active_in(be, in1, false);
533
534 AUD_close_in(be, in1);
535 AUD_close_out(be, out2);
ui/vnc.c
+1 -1
@@ -1289,7 +1289,7 @@ static void audio_add(VncState *vs)
1289 static void audio_del(VncState *vs)
1290 {
1291 if (vs->audio_cap) {
1292 - AUD_del_capture(vs->audio_cap, vs);
1292 + AUD_del_capture(vs->vd->audio_be, vs->audio_cap, vs);
1293 vs->audio_cap = NULL;
1294 }
1295 }