Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/2196818/?format=api
{ "id": 2196818, "url": "http://patchwork.ozlabs.org/api/patches/2196818/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260216-audio-v1-34-e676662e4514@redhat.com/", "project": { "id": 14, "url": "http://patchwork.ozlabs.org/api/projects/14/?format=api", "name": "QEMU Development", "link_name": "qemu-devel", "list_id": "qemu-devel.nongnu.org", "list_email": "qemu-devel@nongnu.org", "web_url": "", "scm_url": "", "webscm_url": "", "list_archive_url": "", "list_archive_url_format": "", "commit_url_format": "" }, "msgid": "<20260216-audio-v1-34-e676662e4514@redhat.com>", "list_archive_url": null, "date": "2026-02-16T11:15:23", "name": "[34/85] audio: make all the backend-specific APIs take the be", "commit_ref": null, "pull_url": null, "state": "new", "archived": false, "hash": "e1b93264ca2f0800d387f0d98455d6dec3da5580", "submitter": { "id": 66774, "url": "http://patchwork.ozlabs.org/api/people/66774/?format=api", "name": "Marc-André Lureau", "email": "marcandre.lureau@redhat.com" }, "delegate": null, "mbox": "http://patchwork.ozlabs.org/project/qemu-devel/patch/20260216-audio-v1-34-e676662e4514@redhat.com/mbox/", "series": [ { "id": 492294, "url": "http://patchwork.ozlabs.org/api/series/492294/?format=api", "web_url": "http://patchwork.ozlabs.org/project/qemu-devel/list/?series=492294", "date": "2026-02-16T11:14:52", "name": "audio: cleanups & add a manual test", "version": 1, "mbox": "http://patchwork.ozlabs.org/series/492294/mbox/" } ], "comments": "http://patchwork.ozlabs.org/api/patches/2196818/comments/", "check": "pending", "checks": "http://patchwork.ozlabs.org/api/patches/2196818/checks/", "tags": {}, "related": [], "headers": { "Return-Path": "<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>", "X-Original-To": "incoming@patchwork.ozlabs.org", "Delivered-To": "patchwork-incoming@legolas.ozlabs.org", "Authentication-Results": [ "legolas.ozlabs.org;\n\tdkim=pass (1024-bit key;\n unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256\n header.s=mimecast20190719 header.b=AzUsPrus;\n\tdkim-atps=neutral", "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=nongnu.org\n (client-ip=209.51.188.17; helo=lists.gnu.org;\n envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n receiver=patchwork.ozlabs.org)" ], "Received": [ "from lists.gnu.org (lists.gnu.org [209.51.188.17])\n\t(using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits))\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4fF0hx0hWbz1xpY\n\tfor <incoming@patchwork.ozlabs.org>; Mon, 16 Feb 2026 22:21:37 +1100 (AEDT)", "from localhost ([::1] helo=lists1p.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.90_1)\n\t(envelope-from <qemu-devel-bounces@nongnu.org>)\n\tid 1vrwf4-00054N-LR; Mon, 16 Feb 2026 06:21:08 -0500", "from eggs.gnu.org ([2001:470:142:3::10])\n by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1vrwbZ-0005hB-43\n for qemu-devel@nongnu.org; Mon, 16 Feb 2026 06:17:35 -0500", "from us-smtp-delivery-124.mimecast.com ([170.10.129.124])\n by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256)\n (Exim 4.90_1) (envelope-from <marcandre.lureau@redhat.com>)\n id 1vrwbT-0007r4-08\n for qemu-devel@nongnu.org; Mon, 16 Feb 2026 06:17:28 -0500", "from mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com\n (ec2-54-186-198-63.us-west-2.compute.amazonaws.com [54.186.198.63]) by\n relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3,\n cipher=TLS_AES_256_GCM_SHA384) id us-mta-111-oFU-FyazNrGmyManVaKbXw-1; Mon,\n 16 Feb 2026 06:17:15 -0500", "from mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com\n (mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com [10.30.177.4])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n (No client certificate requested)\n by mx-prod-mc-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTPS\n id 7837F19560A7; Mon, 16 Feb 2026 11:17:13 +0000 (UTC)", "from localhost (unknown [10.45.242.26])\n by mx-prod-int-01.mail-002.prod.us-west-2.aws.redhat.com (Postfix) with ESMTP\n id 653A930001A5; Mon, 16 Feb 2026 11:17:12 +0000 (UTC)" ], "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com;\n s=mimecast20190719; t=1771240639;\n h=from:from:reply-to:subject:subject:date:date:message-id:message-id:\n to:to:cc:cc:mime-version:mime-version:content-type:content-type:\n content-transfer-encoding:content-transfer-encoding:\n in-reply-to:in-reply-to:references:references;\n bh=Rt+HPOyuJm7qletTT+ss/T1sC+DVrQFoaFt7vssnDDQ=;\n b=AzUsPrus02zB5EqEcZcSVA/jnlmkcy/A0tqLjYKDmnDKjEBaRM/Zs6oPK/YjLJAB17Mf9P\n P237XW5UxFRh3cmsLrP0INFN+yjeb8+Y38LeYqzyM7b1wXRYWna83ySqw1ihcmaMMOpFpy\n UlEgjTSu21VvqeUlxZJeHUz+C1HBSXI=", "X-MC-Unique": "oFU-FyazNrGmyManVaKbXw-1", "X-Mimecast-MFC-AGG-ID": "oFU-FyazNrGmyManVaKbXw_1771240633", "From": "=?utf-8?q?Marc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>", "Date": "Mon, 16 Feb 2026 12:15:23 +0100", "Subject": "[PATCH 34/85] audio: make all the backend-specific APIs take the\n be", "MIME-Version": "1.0", "Content-Type": "text/plain; charset=\"utf-8\"", "Content-Transfer-Encoding": "8bit", "Message-Id": "<20260216-audio-v1-34-e676662e4514@redhat.com>", "References": "<20260216-audio-v1-0-e676662e4514@redhat.com>", "In-Reply-To": "<20260216-audio-v1-0-e676662e4514@redhat.com>", "To": "qemu-devel@nongnu.org", "Cc": "Gerd Hoffmann <kraxel@redhat.com>, Eduardo Habkost <eduardo@habkost.net>,\n Paolo Bonzini <pbonzini@redhat.com>,\n =?utf-8?q?Daniel_P=2E_Berrang=C3=A9?= <berrange@redhat.com>, =?utf-8?q?Phil?=\n\t=?utf-8?q?ippe_Mathieu-Daud=C3=A9?= <philmd@linaro.org>,\n John Snow <jsnow@redhat.com>, Cleber Rosa <crosa@redhat.com>,\n Christian Schoenebeck <qemu_oss@crudebyte.com>,\n Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>,\n Thomas Huth <huth@tuxfamily.org>, Alexandre Ratchov <alex@caoua.org>,\n\t=?utf-8?q?Alex_Benn=C3=A9e?= <alex.bennee@linaro.org>,\n Laurent Vivier <laurent@vivier.eu>, \"Michael S. Tsirkin\" <mst@redhat.com>,\n Manos Pitsidianakis <manos.pitsidianakis@linaro.org>,\n Alistair Francis <alistair@alistair23.me>,\n \"Edgar E. Iglesias\" <edgar.iglesias@gmail.com>,\n Peter Maydell <peter.maydell@linaro.org>, qemu-arm@nongnu.org, =?utf-8?q?M?=\n\t=?utf-8?q?arc-Andr=C3=A9_Lureau?= <marcandre.lureau@redhat.com>,\n Mark Cave-Ayland <mark.caveayland@nutanix.com>", "X-Developer-Signature": "v=1; a=openpgp-sha256; l=52311;\n i=marcandre.lureau@redhat.com; h=from:subject:message-id;\n bh=/rRhVM+jDRi5sDzXlLAJN7ZBGNIfJJy6PtlyFMA/eVY=;\n b=owEBbQKS/ZANAwAKAdro4Ql1lpzlAcsmYgBpkvxPTKONenw+26ne3Kj4vEVwN5s10qeKbQXqR\n FMkuv0oFSWJAjMEAAEKAB0WIQSHqb2TP4fGBtJ29i3a6OEJdZac5QUCaZL8TwAKCRDa6OEJdZac\n 5bj2D/4pusGQI2RsT0zZMWqXSXBk13Vf8KIlkz++H4ygjjUeWeJWHkC/7Cmxj2iZyrYGKh6gnTs\n ESuiE1KpzGisPpBvEqCy/MlOYRQKdWEl0PUzIqW+m5k+1BT0/8rXaFHr+tuhzpNcT3GZMx+03NJ\n MYpMh3zhQvpHxtnY8a1nFQ0CeM+XL7/BBQ0ox61DtaqKiFHomjx+yOxgrcqjvGelj++zddcW2WW\n xPEbKtcqH2bVHvnOjIns2oq4fg3ItZfpEApbxZjABX7Ucw+KJ8X+B2MRHh8vbY/XJLxHolAQZjM\n 2tuPv02PDYmisGPqZcu7la/ey25Q9igp9MvGiIfLHvsQzWZZS4bmcB8X3wLXVGTj0uLZ/8I9Teb\n 3E2uSg3SKFDe6SaG+aRl/QtSYAnWoG2cKsWmSmddVUbnWQGdKgnihY906V+XYGIC5nLMsobz+AL\n ecPBihN7cxWGw5nJ4f2K4GfRV/Ptzb0A8F3+JLpR8KnTCC/Q5Fpx1k1s2Kso5IWP4mGRX2Qjxnk\n azNOAPwlY0qiomKIIkaRuKD/UmgeSel0ANHbXczYagChngxd/sCLQIvKY7FchiXQ15M5E+6jfiR\n +l6U2nvH24EfVqWSdpeNoqfsaQuAgHSWLL/8OySnj1pvF6CbWc0UVIQOtElxie6sEjIczM5ERyt\n qyDgO/spQ0yLegA==", "X-Developer-Key": "i=marcandre.lureau@redhat.com; a=openpgp;\n fpr=87A9BD933F87C606D276F62DDAE8E10975969CE5", "X-Scanned-By": "MIMEDefang 3.4.1 on 10.30.177.4", "Received-SPF": "pass client-ip=170.10.129.124;\n envelope-from=marcandre.lureau@redhat.com;\n helo=us-smtp-delivery-124.mimecast.com", "X-Spam_score_int": "-20", "X-Spam_score": "-2.1", "X-Spam_bar": "--", "X-Spam_report": "(-2.1 / 5.0 requ) BAYES_00=-1.9, DKIMWL_WL_HIGH=-0.001,\n DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1,\n RCVD_IN_DNSWL_NONE=-0.0001, RCVD_IN_MSPIKE_H4=0.001, RCVD_IN_MSPIKE_WL=0.001,\n RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, RCVD_IN_VALIDITY_SAFE_BLOCKED=0.001,\n SPF_HELO_PASS=-0.001, SPF_PASS=-0.001,\n T_FILL_THIS_FORM_SHORT=0.01 autolearn=unavailable autolearn_force=no", "X-Spam_action": "no action", "X-BeenThere": "qemu-devel@nongnu.org", "X-Mailman-Version": "2.1.29", "Precedence": "list", "List-Id": "qemu development <qemu-devel.nongnu.org>", "List-Unsubscribe": "<https://lists.nongnu.org/mailman/options/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>", "List-Archive": "<https://lists.nongnu.org/archive/html/qemu-devel>", "List-Post": "<mailto:qemu-devel@nongnu.org>", "List-Help": "<mailto:qemu-devel-request@nongnu.org?subject=help>", "List-Subscribe": "<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n <mailto:qemu-devel-request@nongnu.org?subject=subscribe>", "Errors-To": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org", "Sender": "qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org" }, "content": "This will allow to dispatch to different implementations next.\n\nSigned-off-by: Marc-André Lureau <marcandre.lureau@redhat.com>\nReviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com>\n---\n audio/audio_template.h | 2 +-\n include/qemu/audio-capture.h | 9 +++--\n include/qemu/audio.h | 34 ++++++++++--------\n audio/audio.c | 18 +++++-----\n audio/wavcapture.c | 7 ++--\n hw/audio/ac97.c | 24 ++++++-------\n hw/audio/adlib.c | 9 ++---\n hw/audio/asc.c | 16 ++++-----\n hw/audio/cs4231a.c | 16 ++++-----\n hw/audio/es1370.c | 12 +++----\n hw/audio/gus.c | 9 ++---\n hw/audio/hda-codec.c | 20 ++++++-----\n hw/audio/lm4549.c | 12 +++----\n hw/audio/pcspk.c | 4 +--\n hw/audio/sb16.c | 14 ++++----\n hw/audio/via-ac97.c | 14 ++++----\n hw/audio/virtio-snd.c | 14 ++++----\n hw/audio/wm8750.c | 24 ++++++-------\n hw/display/xlnx_dp.c | 10 +++---\n hw/usb/dev-audio.c | 12 +++----\n tests/audio/test-audio.c | 83 ++++++++++++++++++++++----------------------\n ui/vnc.c | 2 +-\n 22 files changed, 192 insertions(+), 173 deletions(-)", "diff": "diff --git a/audio/audio_template.h b/audio/audio_template.h\nindex 512abbfe22f..33f2ff432eb 100644\n--- a/audio/audio_template.h\n+++ b/audio/audio_template.h\n@@ -569,7 +569,7 @@ SW *glue (AUD_open_, TYPE) (\n return NULL;\n }\n \n-bool glue(AUD_is_active_, TYPE)(SW *sw)\n+bool glue(AUD_is_active_, TYPE)(AudioBackend *be, SW *sw)\n {\n return sw ? sw->active : 0;\n }\ndiff --git a/include/qemu/audio-capture.h b/include/qemu/audio-capture.h\nindex a07412db857..f500b0a7f8c 100644\n--- a/include/qemu/audio-capture.h\n+++ b/include/qemu/audio-capture.h\n@@ -36,8 +36,11 @@ CaptureVoiceOut *AUD_add_capture(\n AudioBackend *be,\n struct audsettings *as,\n struct audio_capture_ops *ops,\n- void *opaque\n- );\n-void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque);\n+ void *opaque);\n+\n+void AUD_del_capture(\n+ AudioBackend *be,\n+ CaptureVoiceOut *cap,\n+ void *cb_opaque);\n \n #endif /* QEMU_AUDIO_CAPTURE_H */\ndiff --git a/include/qemu/audio.h b/include/qemu/audio.h\nindex 03ce9adbc88..e87708e3d1e 100644\n--- a/include/qemu/audio.h\n+++ b/include/qemu/audio.h\n@@ -63,7 +63,7 @@ typedef struct AudioBackendClass {\n \n bool AUD_backend_check(AudioBackend **be, Error **errp);\n \n-SWVoiceOut *AUD_open_out (\n+SWVoiceOut *AUD_open_out(\n AudioBackend *be,\n SWVoiceOut *sw,\n const char *name,\n@@ -72,11 +72,11 @@ SWVoiceOut *AUD_open_out (\n const struct audsettings *settings\n );\n \n-void AUD_close_out (AudioBackend *be, SWVoiceOut *sw);\n-size_t AUD_write (SWVoiceOut *sw, void *pcm_buf, size_t size);\n-int AUD_get_buffer_size_out (SWVoiceOut *sw);\n-void AUD_set_active_out(SWVoiceOut *sw, bool on);\n-bool AUD_is_active_out(SWVoiceOut *sw);\n+void AUD_close_out(AudioBackend *be, SWVoiceOut *sw);\n+size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *pcm_buf, size_t size);\n+int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw);\n+void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on);\n+bool AUD_is_active_out(AudioBackend *be, SWVoiceOut *sw);\n \n #define AUDIO_MAX_CHANNELS 16\n typedef struct Volume {\n@@ -85,19 +85,23 @@ typedef struct Volume {\n uint8_t vol[AUDIO_MAX_CHANNELS];\n } Volume;\n \n-void AUD_set_volume_out(SWVoiceOut *sw, Volume *vol);\n-void AUD_set_volume_in(SWVoiceIn *sw, Volume *vol);\n+void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol);\n+void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol);\n \n static inline void\n-AUD_set_volume_out_lr(SWVoiceOut *sw, bool mut, uint8_t lvol, uint8_t rvol) {\n- AUD_set_volume_out(sw, &(Volume) {\n+AUD_set_volume_out_lr(AudioBackend *be, SWVoiceOut *sw,\n+ bool mut, uint8_t lvol, uint8_t rvol)\n+{\n+ AUD_set_volume_out(be, sw, &(Volume) {\n .mute = mut, .channels = 2, .vol = { lvol, rvol }\n });\n }\n \n static inline void\n-AUD_set_volume_in_lr(SWVoiceIn *sw, bool mut, uint8_t lvol, uint8_t rvol) {\n- AUD_set_volume_in(sw, &(Volume) {\n+AUD_set_volume_in_lr(AudioBackend *be, SWVoiceIn *sw,\n+ bool mut, uint8_t lvol, uint8_t rvol)\n+{\n+ AUD_set_volume_in(be, sw, &(Volume) {\n .mute = mut, .channels = 2, .vol = { lvol, rvol }\n });\n }\n@@ -112,9 +116,9 @@ SWVoiceIn *AUD_open_in(\n );\n \n void AUD_close_in(AudioBackend *be, SWVoiceIn *sw);\n-size_t AUD_read (SWVoiceIn *sw, void *pcm_buf, size_t size);\n-void AUD_set_active_in(SWVoiceIn *sw, bool on);\n-bool AUD_is_active_in(SWVoiceIn *sw);\n+size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *pcm_buf, size_t size);\n+void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on);\n+bool AUD_is_active_in(AudioBackend *be, SWVoiceIn *sw);\n \n void audio_cleanup(void);\n \ndiff --git a/audio/audio.c b/audio/audio.c\nindex 3e16b719399..320035c0484 100644\n--- a/audio/audio.c\n+++ b/audio/audio.c\n@@ -847,7 +847,7 @@ static void audio_timer (void *opaque)\n /*\n * Public API\n */\n-size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)\n+size_t AUD_write(AudioBackend *be, SWVoiceOut *sw, void *buf, size_t size)\n {\n HWVoiceOut *hw;\n \n@@ -869,7 +869,7 @@ size_t AUD_write(SWVoiceOut *sw, void *buf, size_t size)\n }\n }\n \n-size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)\n+size_t AUD_read(AudioBackend *be, SWVoiceIn *sw, void *buf, size_t size)\n {\n HWVoiceIn *hw;\n \n@@ -891,7 +891,7 @@ size_t AUD_read(SWVoiceIn *sw, void *buf, size_t size)\n }\n }\n \n-int AUD_get_buffer_size_out(SWVoiceOut *sw)\n+int AUD_get_buffer_size_out(AudioBackend *be, SWVoiceOut *sw)\n {\n if (!sw) {\n return 0;\n@@ -904,7 +904,7 @@ int AUD_get_buffer_size_out(SWVoiceOut *sw)\n return sw->hw->samples * sw->hw->info.bytes_per_frame;\n }\n \n-void AUD_set_active_out(SWVoiceOut *sw, bool on)\n+void AUD_set_active_out(AudioBackend *be, SWVoiceOut *sw, bool on)\n {\n HWVoiceOut *hw;\n \n@@ -952,7 +952,7 @@ void AUD_set_active_out(SWVoiceOut *sw, bool on)\n }\n }\n \n-void AUD_set_active_in(SWVoiceIn *sw, bool on)\n+void AUD_set_active_in(AudioBackend *be, SWVoiceIn *sw, bool on)\n {\n HWVoiceIn *hw;\n \n@@ -997,7 +997,7 @@ void AUD_set_active_in(SWVoiceIn *sw, bool on)\n }\n }\n \n-static size_t audio_get_avail (SWVoiceIn *sw)\n+static size_t audio_get_avail(SWVoiceIn *sw)\n {\n size_t live;\n \n@@ -1938,7 +1938,7 @@ CaptureVoiceOut *AUD_add_capture(\n return cap;\n }\n \n-void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)\n+void AUD_del_capture(AudioBackend *be, CaptureVoiceOut *cap, void *cb_opaque)\n {\n struct capture_callback *cb;\n \n@@ -1977,7 +1977,7 @@ void AUD_del_capture (CaptureVoiceOut *cap, void *cb_opaque)\n }\n }\n \n-void AUD_set_volume_out(SWVoiceOut *sw, Volume *vol)\n+void AUD_set_volume_out(AudioBackend *be, SWVoiceOut *sw, Volume *vol)\n {\n if (sw) {\n HWVoiceOut *hw = sw->hw;\n@@ -1993,7 +1993,7 @@ void AUD_set_volume_out(SWVoiceOut *sw, Volume *vol)\n }\n }\n \n-void AUD_set_volume_in(SWVoiceIn *sw, Volume *vol)\n+void AUD_set_volume_in(AudioBackend *be, SWVoiceIn *sw, Volume *vol)\n {\n if (sw) {\n HWVoiceIn *hw = sw->hw;\ndiff --git a/audio/wavcapture.c b/audio/wavcapture.c\nindex b33a38ff45b..2950ceaf242 100644\n--- a/audio/wavcapture.c\n+++ b/audio/wavcapture.c\n@@ -1,4 +1,5 @@\n #include \"qemu/osdep.h\"\n+#include \"qemu/audio.h\"\n #include \"qemu/qemu-print.h\"\n #include \"qemu/error-report.h\"\n #include \"audio_int.h\"\n@@ -10,6 +11,7 @@ typedef struct {\n int freq;\n int bits;\n int nchannels;\n+ AudioBackend *audio_be;\n CaptureVoiceOut *cap;\n } WAVState;\n \n@@ -84,7 +86,7 @@ static void wav_capture_destroy (void *opaque)\n {\n WAVState *wav = opaque;\n \n- AUD_del_capture (wav->cap, wav);\n+ AUD_del_capture(wav->audio_be, wav->cap, wav);\n g_free (wav);\n }\n \n@@ -159,6 +161,7 @@ int wav_start_capture(AudioBackend *state, CaptureState *s, const char *path,\n return -1;\n }\n \n+ wav->audio_be = state;\n wav->path = g_strdup (path);\n wav->bits = bits;\n wav->nchannels = nchannels;\n@@ -169,7 +172,7 @@ int wav_start_capture(AudioBackend *state, CaptureState *s, const char *path,\n goto error_free;\n }\n \n- cap = AUD_add_capture(state, &as, &ops, wav);\n+ cap = AUD_add_capture(wav->audio_be, &as, &ops, wav);\n if (!cap) {\n error_report(\"Failed to add audio capture\");\n goto error_free;\ndiff --git a/hw/audio/ac97.c b/hw/audio/ac97.c\nindex 0694f0adf9c..65a4141b8af 100644\n--- a/hw/audio/ac97.c\n+++ b/hw/audio/ac97.c\n@@ -246,15 +246,15 @@ static void voice_set_active(AC97LinkState *s, int bm_index, int on)\n {\n switch (bm_index) {\n case PI_INDEX:\n- AUD_set_active_in(s->voice_pi, on);\n+ AUD_set_active_in(s->audio_be, s->voice_pi, on);\n break;\n \n case PO_INDEX:\n- AUD_set_active_out(s->voice_po, on);\n+ AUD_set_active_out(s->audio_be, s->voice_po, on);\n break;\n \n case MC_INDEX:\n- AUD_set_active_in(s->voice_mc, on);\n+ AUD_set_active_in(s->audio_be, s->voice_mc, on);\n break;\n \n default:\n@@ -378,15 +378,15 @@ static void reset_voices(AC97LinkState *s, uint8_t active[LAST_INDEX])\n \n freq = mixer_load(s, AC97_PCM_LR_ADC_Rate);\n open_voice(s, PI_INDEX, freq);\n- AUD_set_active_in(s->voice_pi, active[PI_INDEX]);\n+ AUD_set_active_in(s->audio_be, s->voice_pi, active[PI_INDEX]);\n \n freq = mixer_load(s, AC97_PCM_Front_DAC_Rate);\n open_voice(s, PO_INDEX, freq);\n- AUD_set_active_out(s->voice_po, active[PO_INDEX]);\n+ AUD_set_active_out(s->audio_be, s->voice_po, active[PO_INDEX]);\n \n freq = mixer_load(s, AC97_MIC_ADC_Rate);\n open_voice(s, MC_INDEX, freq);\n- AUD_set_active_in(s->voice_mc, active[MC_INDEX]);\n+ AUD_set_active_in(s->audio_be, s->voice_mc, active[MC_INDEX]);\n }\n \n static void get_volume(uint16_t vol, uint16_t mask, int inverse,\n@@ -416,7 +416,7 @@ static void update_combined_volume_out(AC97LinkState *s)\n lvol = (lvol * plvol) / 255;\n rvol = (rvol * prvol) / 255;\n \n- AUD_set_volume_out_lr(s->voice_po, mute, lvol, rvol);\n+ AUD_set_volume_out_lr(s->audio_be, s->voice_po, mute, lvol, rvol);\n }\n \n static void update_volume_in(AC97LinkState *s)\n@@ -427,7 +427,7 @@ static void update_volume_in(AC97LinkState *s)\n get_volume(mixer_load(s, AC97_Record_Gain_Mute), 0x0f, 0,\n &mute, &lvol, &rvol);\n \n- AUD_set_volume_in_lr(s->voice_pi, mute, lvol, rvol);\n+ AUD_set_volume_in_lr(s->audio_be, s->voice_pi, mute, lvol, rvol);\n }\n \n static void set_volume(AC97LinkState *s, int index, uint32_t val)\n@@ -904,7 +904,7 @@ static int write_audio(AC97LinkState *s, AC97BusMasterRegs *r,\n int copied;\n to_copy = MIN(temp, sizeof(tmpbuf));\n pci_dma_read(&s->dev, addr, tmpbuf, to_copy);\n- copied = AUD_write(s->voice_po, tmpbuf, to_copy);\n+ copied = AUD_write(s->audio_be, s->voice_po, tmpbuf, to_copy);\n dolog(\"write_audio max=%x to_copy=%x copied=%x\",\n max, to_copy, copied);\n if (!copied) {\n@@ -948,7 +948,7 @@ static void write_bup(AC97LinkState *s, int elapsed)\n while (elapsed) {\n int temp = MIN(elapsed, sizeof(s->silence));\n while (temp) {\n- int copied = AUD_write(s->voice_po, s->silence, temp);\n+ int copied = AUD_write(s->audio_be, s->voice_po, s->silence, temp);\n if (!copied) {\n return;\n }\n@@ -978,7 +978,7 @@ static int read_audio(AC97LinkState *s, AC97BusMasterRegs *r,\n while (temp) {\n int acquired;\n to_copy = MIN(temp, sizeof(tmpbuf));\n- acquired = AUD_read(voice, tmpbuf, to_copy);\n+ acquired = AUD_read(s->audio_be, voice, tmpbuf, to_copy);\n if (!acquired) {\n *stop = 1;\n break;\n@@ -1275,7 +1275,7 @@ static void ac97_realize(PCIDevice *dev, Error **errp)\n AC97LinkState *s = AC97(dev);\n uint8_t *c = s->dev.config;\n \n- if (!AUD_backend_check (&s->audio_be, errp)) {\n+ if (!AUD_backend_check(&s->audio_be, errp)) {\n return;\n }\n \ndiff --git a/hw/audio/adlib.c b/hw/audio/adlib.c\nindex f79654627f5..dd5d9cf6772 100644\n--- a/hw/audio/adlib.c\n+++ b/hw/audio/adlib.c\n@@ -95,7 +95,7 @@ static void adlib_write(void *opaque, uint32_t nport, uint32_t val)\n int a = nport & 3;\n \n s->active = 1;\n- AUD_set_active_out (s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n \n adlib_kill_timers (s);\n \n@@ -143,7 +143,8 @@ static int write_audio (AdlibState *s, int samples)\n int nbytes, wbytes, wsampl;\n \n nbytes = samples << SHIFT;\n- wbytes = AUD_write (\n+ wbytes = AUD_write(\n+ s->audio_be,\n s->voice,\n s->mixbuf + (pos << (SHIFT - 1)),\n nbytes\n@@ -255,7 +256,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)\n as.fmt = AUDIO_FORMAT_S16;\n as.endianness = HOST_BIG_ENDIAN;\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n s->voice,\n \"adlib\",\n@@ -269,7 +270,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp)\n return;\n }\n \n- s->samples = AUD_get_buffer_size_out (s->voice) >> SHIFT;\n+ s->samples = AUD_get_buffer_size_out(s->audio_be, s->voice) >> SHIFT;\n s->mixbuf = g_malloc0 (s->samples << SHIFT);\n \n adlib_portio_list[0].offset = s->port;\ndiff --git a/hw/audio/asc.c b/hw/audio/asc.c\nindex a934c2e82c0..43cd51939a3 100644\n--- a/hw/audio/asc.c\n+++ b/hw/audio/asc.c\n@@ -355,12 +355,12 @@ static void asc_out_cb(void *opaque, int free_b)\n * loop because the FIFO has run out of data, and the driver\n * reuses the stale content in its circular audio buffer.\n */\n- AUD_write(s->voice, s->silentbuf, samples << s->shift);\n+ AUD_write(s->audio_be, s->voice, s->silentbuf, samples << s->shift);\n }\n return;\n }\n \n- AUD_write(s->voice, s->mixbuf, generated << s->shift);\n+ AUD_write(s->audio_be, s->voice, s->mixbuf, generated << s->shift);\n }\n \n static uint64_t asc_fifo_read(void *opaque, hwaddr addr,\n@@ -470,9 +470,9 @@ static void asc_write(void *opaque, hwaddr addr, uint64_t value,\n asc_fifo_reset(&s->fifos[1]);\n asc_lower_irq(s);\n if (value != 0) {\n- AUD_set_active_out(s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n } else {\n- AUD_set_active_out(s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n }\n }\n break;\n@@ -489,7 +489,7 @@ static void asc_write(void *opaque, hwaddr addr, uint64_t value,\n {\n int vol = (value & 0xe0);\n \n- AUD_set_volume_out_lr(s->voice, 0, vol, vol);\n+ AUD_set_volume_out_lr(s->audio_be, s->voice, 0, vol, vol);\n break;\n }\n }\n@@ -545,7 +545,7 @@ static int asc_post_load(void *opaque, int version)\n ASCState *s = ASC(opaque);\n \n if (s->regs[ASC_MODE] != 0) {\n- AUD_set_active_out(s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n }\n \n return 0;\n@@ -614,7 +614,7 @@ static void asc_reset_hold(Object *obj, ResetType type)\n {\n ASCState *s = ASC(obj);\n \n- AUD_set_active_out(s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n \n memset(s->regs, 0, sizeof(s->regs));\n asc_fifo_reset(&s->fifos[0]);\n@@ -658,7 +658,7 @@ static void asc_realize(DeviceState *dev, Error **errp)\n }\n \n s->shift = 1;\n- s->samples = AUD_get_buffer_size_out(s->voice) >> s->shift;\n+ s->samples = AUD_get_buffer_size_out(s->audio_be, s->voice) >> s->shift;\n s->mixbuf = g_malloc0(s->samples << s->shift);\n \n s->silentbuf = g_malloc(s->samples << s->shift);\ndiff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c\nindex 7489cf42b7d..3b8ed092fe4 100644\n--- a/hw/audio/cs4231a.c\n+++ b/hw/audio/cs4231a.c\n@@ -327,7 +327,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)\n goto error;\n }\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n s->voice,\n \"cs4231a\",\n@@ -339,7 +339,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)\n if (s->dregs[Interface_Configuration] & PEN) {\n if (!s->dma_running) {\n k->hold_DREQ(s->isa_dma, s->dma);\n- AUD_set_active_out (s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n s->transferred = 0;\n }\n s->dma_running = 1;\n@@ -347,7 +347,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)\n else {\n if (s->dma_running) {\n k->release_DREQ(s->isa_dma, s->dma);\n- AUD_set_active_out (s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n }\n s->dma_running = 0;\n }\n@@ -356,7 +356,7 @@ static void cs_reset_voices (CSState *s, uint32_t val)\n error:\n if (s->dma_running) {\n k->release_DREQ(s->isa_dma, s->dma);\n- AUD_set_active_out (s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n }\n }\n \n@@ -465,7 +465,7 @@ static void cs_write (void *opaque, hwaddr addr,\n if (s->dma_running) {\n IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);\n k->release_DREQ(s->isa_dma, s->dma);\n- AUD_set_active_out (s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n s->dma_running = 0;\n }\n }\n@@ -551,11 +551,11 @@ static int cs_write_audio (CSState *s, int nchan, int dma_pos,\n \n for (i = 0; i < copied; ++i)\n linbuf[i] = s->tab[tmpbuf[i]];\n- copied = AUD_write (s->voice, linbuf, copied << 1);\n+ copied = AUD_write(s->audio_be, s->voice, linbuf, copied << 1);\n copied >>= 1;\n }\n else {\n- copied = AUD_write (s->voice, tmpbuf, copied);\n+ copied = AUD_write(s->audio_be, s->voice, tmpbuf, copied);\n }\n \n temp -= copied;\n@@ -614,7 +614,7 @@ static int cs4231a_pre_load (void *opaque)\n if (s->dma_running) {\n IsaDmaClass *k = ISADMA_GET_CLASS(s->isa_dma);\n k->release_DREQ(s->isa_dma, s->dma);\n- AUD_set_active_out (s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n }\n s->dma_running = 0;\n return 0;\ndiff --git a/hw/audio/es1370.c b/hw/audio/es1370.c\nindex 566f93f1eae..44b204730b5 100644\n--- a/hw/audio/es1370.c\n+++ b/hw/audio/es1370.c\n@@ -411,7 +411,7 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)\n \n if (i == ADC_CHANNEL) {\n s->adc_voice =\n- AUD_open_in (\n+ AUD_open_in(\n s->audio_be,\n s->adc_voice,\n \"es1370.adc\",\n@@ -421,7 +421,7 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)\n );\n } else {\n s->dac_voice[i] =\n- AUD_open_out (\n+ AUD_open_out(\n s->audio_be,\n s->dac_voice[i],\n i ? \"es1370.dac2\" : \"es1370.dac1\",\n@@ -438,9 +438,9 @@ static void es1370_update_voices (ES1370State *s, uint32_t ctl, uint32_t sctl)\n int on = (ctl & b->ctl_en) && !(sctl & b->sctl_pause);\n \n if (i == ADC_CHANNEL) {\n- AUD_set_active_in (s->adc_voice, on);\n+ AUD_set_active_in(s->audio_be, s->adc_voice, on);\n } else {\n- AUD_set_active_out (s->dac_voice[i], on);\n+ AUD_set_active_out(s->audio_be, s->dac_voice[i], on);\n }\n }\n }\n@@ -627,7 +627,7 @@ static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,\n int acquired, to_copy;\n \n to_copy = MIN(to_transfer, sizeof(tmpbuf));\n- acquired = AUD_read (s->adc_voice, tmpbuf, to_copy);\n+ acquired = AUD_read(s->audio_be, s->adc_voice, tmpbuf, to_copy);\n if (!acquired) {\n break;\n }\n@@ -646,7 +646,7 @@ static void es1370_transfer_audio (ES1370State *s, struct chan *d, int loop_sel,\n \n to_copy = MIN(to_transfer, sizeof(tmpbuf));\n pci_dma_read (&s->dev, addr, tmpbuf, to_copy);\n- copied = AUD_write (voice, tmpbuf, to_copy);\n+ copied = AUD_write(s->audio_be, voice, tmpbuf, to_copy);\n if (!copied) {\n break;\n }\ndiff --git a/hw/audio/gus.c b/hw/audio/gus.c\nindex 69ddc419191..1ede1c4a51d 100644\n--- a/hw/audio/gus.c\n+++ b/hw/audio/gus.c\n@@ -87,7 +87,8 @@ static int write_audio (GUSState *s, int samples)\n int nbytes, wbytes, wsampl;\n \n nbytes = samples << s->shift;\n- wbytes = AUD_write (\n+ wbytes = AUD_write(\n+ s->audio_be,\n s->voice,\n s->mixbuf + (pos << (s->shift - 1)),\n nbytes\n@@ -257,7 +258,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)\n as.fmt = AUDIO_FORMAT_S16;\n as.endianness = HOST_BIG_ENDIAN;\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n NULL,\n \"gus\",\n@@ -272,7 +273,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)\n }\n \n s->shift = 2;\n- s->samples = AUD_get_buffer_size_out (s->voice) >> s->shift;\n+ s->samples = AUD_get_buffer_size_out(s->audio_be, s->voice) >> s->shift;\n s->mixbuf = g_malloc0 (s->samples << s->shift);\n \n isa_register_portio_list(d, &s->portio_list1, s->port,\n@@ -287,7 +288,7 @@ static void gus_realizefn (DeviceState *dev, Error **errp)\n s->emu.opaque = s;\n s->pic = isa_bus_get_irq(bus, s->emu.gusirq);\n \n- AUD_set_active_out (s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n }\n \n static const Property gus_properties[] = {\ndiff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c\nindex 6445d227594..0373d2f7271 100644\n--- a/hw/audio/hda-codec.c\n+++ b/hw/audio/hda-codec.c\n@@ -275,7 +275,8 @@ static void hda_audio_input_cb(void *opaque, int avail)\n while (to_transfer) {\n uint32_t start = (uint32_t) (wpos & B_MASK);\n uint32_t chunk = (uint32_t) MIN(B_SIZE - start, to_transfer);\n- uint32_t read = AUD_read(st->voice.in, st->buf + start, chunk);\n+ uint32_t read = AUD_read(st->state->audio_be, st->voice.in,\n+ st->buf + start, chunk);\n wpos += read;\n to_transfer -= read;\n st->wpos += read;\n@@ -354,7 +355,8 @@ static void hda_audio_output_cb(void *opaque, int avail)\n while (to_transfer) {\n uint32_t start = (uint32_t) (rpos & B_MASK);\n uint32_t chunk = (uint32_t) MIN(B_SIZE - start, to_transfer);\n- uint32_t written = AUD_write(st->voice.out, st->buf + start, chunk);\n+ uint32_t written = AUD_write(st->state->audio_be, st->voice.out,\n+ st->buf + start, chunk);\n rpos += written;\n to_transfer -= written;\n st->rpos += written;\n@@ -375,7 +377,8 @@ static void hda_audio_compat_input_cb(void *opaque, int avail)\n \n while (avail - recv >= sizeof(st->compat_buf)) {\n if (st->compat_bpos != sizeof(st->compat_buf)) {\n- len = AUD_read(st->voice.in, st->compat_buf + st->compat_bpos,\n+ len = AUD_read(st->state->audio_be, st->voice.in,\n+ st->compat_buf + st->compat_bpos,\n sizeof(st->compat_buf) - st->compat_bpos);\n st->compat_bpos += len;\n recv += len;\n@@ -408,7 +411,8 @@ static void hda_audio_compat_output_cb(void *opaque, int avail)\n }\n st->compat_bpos = 0;\n }\n- len = AUD_write(st->voice.out, st->compat_buf + st->compat_bpos,\n+ len = AUD_write(st->state->audio_be, st->voice.out,\n+ st->compat_buf + st->compat_bpos,\n sizeof(st->compat_buf) - st->compat_bpos);\n st->compat_bpos += len;\n sent += len;\n@@ -440,9 +444,9 @@ static void hda_audio_set_running(HDAAudioStream *st, bool running)\n }\n }\n if (st->output) {\n- AUD_set_active_out(st->voice.out, st->running);\n+ AUD_set_active_out(st->state->audio_be, st->voice.out, st->running);\n } else {\n- AUD_set_active_in(st->voice.in, st->running);\n+ AUD_set_active_in(st->state->audio_be, st->voice.in, st->running);\n }\n }\n \n@@ -466,9 +470,9 @@ static void hda_audio_set_amp(HDAAudioStream *st)\n return;\n }\n if (st->output) {\n- AUD_set_volume_out_lr(st->voice.out, muted, left, right);\n+ AUD_set_volume_out_lr(st->state->audio_be, st->voice.out, muted, left, right);\n } else {\n- AUD_set_volume_in_lr(st->voice.in, muted, left, right);\n+ AUD_set_volume_in_lr(st->state->audio_be, st->voice.in, muted, left, right);\n }\n }\n \ndiff --git a/hw/audio/lm4549.c b/hw/audio/lm4549.c\nindex f85226d1ac5..b875e83d454 100644\n--- a/hw/audio/lm4549.c\n+++ b/hw/audio/lm4549.c\n@@ -101,11 +101,11 @@ static void lm4549_audio_transfer(lm4549_state *s)\n uint32_t i;\n \n /* Activate the voice */\n- AUD_set_active_out(s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n s->voice_is_active = 1;\n \n /* Try to write the buffer content */\n- written_bytes = AUD_write(s->voice, s->buffer,\n+ written_bytes = AUD_write(s->audio_be, s->voice, s->buffer,\n s->buffer_level * sizeof(uint16_t));\n written_samples = written_bytes >> 1;\n \n@@ -129,14 +129,14 @@ static void lm4549_audio_out_callback(void *opaque, int free)\n static uint32_t prev_buffer_level;\n \n #ifdef LM4549_DEBUG\n- int size = AUD_get_buffer_size_out(s->voice);\n+ int size = AUD_get_buffer_size_out(s->audio_be, s->voice);\n DPRINTF(\"audio_out_callback size = %i free = %i\\n\", size, free);\n #endif\n \n /* Detect that no data are consumed\n => disable the voice */\n if (s->buffer_level == prev_buffer_level) {\n- AUD_set_active_out(s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n s->voice_is_active = 0;\n }\n prev_buffer_level = s->buffer_level;\n@@ -285,7 +285,7 @@ static int lm4549_post_load(void *opaque, int version_id)\n \n /* Request data */\n if (s->voice_is_active == 1) {\n- lm4549_audio_out_callback(s, AUD_get_buffer_size_out(s->voice));\n+ lm4549_audio_out_callback(s, AUD_get_buffer_size_out(s->audio_be, s->voice));\n }\n \n return 0;\n@@ -323,7 +323,7 @@ void lm4549_init(lm4549_state *s, lm4549_callback data_req_cb, void* opaque,\n &as\n );\n \n- AUD_set_volume_out_lr(s->voice, 0, 255, 255);\n+ AUD_set_volume_out_lr(s->audio_be, s->voice, 0, 255, 255);\n \n s->voice_is_active = 0;\n \ndiff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c\nindex 0b01544941c..07ebfcfccf6 100644\n--- a/hw/audio/pcspk.c\n+++ b/hw/audio/pcspk.c\n@@ -105,7 +105,7 @@ static void pcspk_callback(void *opaque, int free)\n \n while (free > 0) {\n n = MIN(s->samples - s->play_pos, (unsigned int)free);\n- n = AUD_write(s->voice, &s->sample_buf[s->play_pos], n);\n+ n = AUD_write(s->audio_be, s->voice, &s->sample_buf[s->play_pos], n);\n if (!n)\n break;\n s->play_pos = (s->play_pos + n) % s->samples;\n@@ -163,7 +163,7 @@ static void pcspk_io_write(void *opaque, hwaddr addr, uint64_t val,\n if (s->voice) {\n if (gate) /* restart */\n s->play_pos = 0;\n- AUD_set_active_out(s->voice, gate & s->data_on);\n+ AUD_set_active_out(s->audio_be, s->voice, gate & s->data_on);\n }\n }\n \ndiff --git a/hw/audio/sb16.c b/hw/audio/sb16.c\nindex 3c5beb9dfa3..da0c33ea41b 100644\n--- a/hw/audio/sb16.c\n+++ b/hw/audio/sb16.c\n@@ -185,11 +185,11 @@ static void control (SB16State *s, int hold)\n \n if (hold) {\n k->hold_DREQ(isa_dma, dma);\n- AUD_set_active_out (s->voice, 1);\n+ AUD_set_active_out(s->audio_be, s->voice, 1);\n }\n else {\n k->release_DREQ(isa_dma, dma);\n- AUD_set_active_out (s->voice, 0);\n+ AUD_set_active_out(s->audio_be, s->voice, 0);\n }\n }\n \n@@ -215,7 +215,7 @@ static void continue_dma8 (SB16State *s)\n as.fmt = s->fmt;\n as.endianness = 0;\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n s->voice,\n \"sb16\",\n@@ -378,7 +378,7 @@ static void dma_cmd (SB16State *s, uint8_t cmd, uint8_t d0, int dma_len)\n as.fmt = s->fmt;\n as.endianness = 0;\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n s->voice,\n \"sb16\",\n@@ -879,7 +879,7 @@ static void legacy_reset (SB16State *s)\n as.fmt = AUDIO_FORMAT_U8;\n as.endianness = 0;\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n s->voice,\n \"sb16\",\n@@ -1196,7 +1196,7 @@ static int write_audio (SB16State *s, int nchan, int dma_pos,\n }\n \n copied = k->read_memory(isa_dma, nchan, tmpbuf, dma_pos, to_copy);\n- copied = AUD_write (s->voice, tmpbuf, copied);\n+ copied = AUD_write(s->audio_be, s->voice, tmpbuf, copied);\n \n temp -= copied;\n dma_pos = (dma_pos + copied) % dma_len;\n@@ -1302,7 +1302,7 @@ static int sb16_post_load (void *opaque, int version_id)\n as.fmt = s->fmt;\n as.endianness = 0;\n \n- s->voice = AUD_open_out (\n+ s->voice = AUD_open_out(\n s->audio_be,\n s->voice,\n \"sb16\",\ndiff --git a/hw/audio/via-ac97.c b/hw/audio/via-ac97.c\nindex 019d2968534..5b344d7a0fc 100644\n--- a/hw/audio/via-ac97.c\n+++ b/hw/audio/via-ac97.c\n@@ -53,7 +53,7 @@ static void codec_volume_set_out(ViaAC97State *s)\n rvol /= 255;\n mute = CODEC_REG(s, AC97_Master_Volume_Mute) >> MUTE_SHIFT;\n mute |= CODEC_REG(s, AC97_PCM_Out_Volume_Mute) >> MUTE_SHIFT;\n- AUD_set_volume_out_lr(s->vo, mute, lvol, rvol);\n+ AUD_set_volume_out_lr(s->audio_be, s->vo, mute, lvol, rvol);\n }\n \n static void codec_reset(ViaAC97State *s)\n@@ -189,7 +189,7 @@ static void out_cb(void *opaque, int avail)\n while (temp) {\n to_copy = MIN(temp, sizeof(tmpbuf));\n pci_dma_read(&s->dev, c->addr, tmpbuf, to_copy);\n- copied = AUD_write(s->vo, tmpbuf, to_copy);\n+ copied = AUD_write(s->audio_be, s->vo, tmpbuf, to_copy);\n if (!copied) {\n stop = true;\n break;\n@@ -208,7 +208,7 @@ static void out_cb(void *opaque, int avail)\n c->stat |= STAT_PAUSED;\n } else {\n c->stat &= ~STAT_ACTIVE;\n- AUD_set_active_out(s->vo, 0);\n+ AUD_set_active_out(s->audio_be, s->vo, 0);\n }\n if (c->type & STAT_EOL) {\n via_isa_set_irq(&s->dev, 0, 1);\n@@ -317,20 +317,20 @@ static void sgd_write(void *opaque, hwaddr addr, uint64_t val, unsigned size)\n break;\n case 1:\n if (val & CNTL_START) {\n- AUD_set_active_out(s->vo, 1);\n+ AUD_set_active_out(s->audio_be, s->vo, 1);\n s->aur.stat = STAT_ACTIVE;\n }\n if (val & CNTL_TERM) {\n- AUD_set_active_out(s->vo, 0);\n+ AUD_set_active_out(s->audio_be, s->vo, 0);\n s->aur.stat &= ~(STAT_ACTIVE | STAT_PAUSED);\n s->aur.clen = 0;\n }\n if (val & CNTL_PAUSE) {\n- AUD_set_active_out(s->vo, 0);\n+ AUD_set_active_out(s->audio_be, s->vo, 0);\n s->aur.stat &= ~STAT_ACTIVE;\n s->aur.stat |= STAT_PAUSED;\n } else if (!(val & CNTL_PAUSE) && (s->aur.stat & STAT_PAUSED)) {\n- AUD_set_active_out(s->vo, 1);\n+ AUD_set_active_out(s->audio_be, s->vo, 1);\n s->aur.stat |= STAT_ACTIVE;\n s->aur.stat &= ~STAT_PAUSED;\n }\ndiff --git a/hw/audio/virtio-snd.c b/hw/audio/virtio-snd.c\nindex 9101560f387..47fef61af88 100644\n--- a/hw/audio/virtio-snd.c\n+++ b/hw/audio/virtio-snd.c\n@@ -463,7 +463,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id)\n stream,\n virtio_snd_pcm_out_cb,\n &as);\n- AUD_set_volume_out_lr(stream->voice.out, 0, 255, 255);\n+ AUD_set_volume_out_lr(s->audio_be, stream->voice.out, 0, 255, 255);\n } else {\n stream->voice.in = AUD_open_in(s->audio_be,\n stream->voice.in,\n@@ -471,7 +471,7 @@ static uint32_t virtio_snd_pcm_prepare(VirtIOSound *s, uint32_t stream_id)\n stream,\n virtio_snd_pcm_in_cb,\n &as);\n- AUD_set_volume_in_lr(stream->voice.in, 0, 255, 255);\n+ AUD_set_volume_in_lr(s->audio_be, stream->voice.in, 0, 255, 255);\n }\n \n return cpu_to_le32(VIRTIO_SND_S_OK);\n@@ -561,9 +561,9 @@ static void virtio_snd_handle_pcm_start_stop(VirtIOSound *s,\n stream->active = start;\n }\n if (stream->info.direction == VIRTIO_SND_D_OUTPUT) {\n- AUD_set_active_out(stream->voice.out, start);\n+ AUD_set_active_out(s->audio_be, stream->voice.out, start);\n } else {\n- AUD_set_active_in(stream->voice.in, start);\n+ AUD_set_active_in(s->audio_be, stream->voice.in, start);\n }\n } else {\n error_report(\"Invalid stream id: %\"PRIu32, stream_id);\n@@ -1166,7 +1166,8 @@ static void virtio_snd_pcm_out_cb(void *data, int available)\n buffer->populated = true;\n }\n for (;;) {\n- size = AUD_write(stream->voice.out,\n+ size = AUD_write(stream->s->audio_be,\n+ stream->voice.out,\n buffer->data + buffer->offset,\n MIN(buffer->size, available));\n assert(size <= MIN(buffer->size, available));\n@@ -1258,7 +1259,8 @@ static void virtio_snd_pcm_in_cb(void *data, int available)\n return_rx_buffer(stream, buffer);\n break;\n }\n- size = AUD_read(stream->voice.in,\n+ size = AUD_read(stream->s->audio_be,\n+ stream->voice.in,\n buffer->data + buffer->size,\n MIN(available, (stream->params.period_bytes -\n buffer->size)));\ndiff --git a/hw/audio/wm8750.c b/hw/audio/wm8750.c\nindex 336fb6d20bd..bc347fe5376 100644\n--- a/hw/audio/wm8750.c\n+++ b/hw/audio/wm8750.c\n@@ -72,7 +72,7 @@ static inline void wm8750_in_load(WM8750State *s)\n if (s->idx_in + s->req_in <= sizeof(s->data_in))\n return;\n s->idx_in = MAX(0, (int) sizeof(s->data_in) - s->req_in);\n- AUD_read(*s->in[0], s->data_in + s->idx_in,\n+ AUD_read(s->audio_be, *s->in[0], s->data_in + s->idx_in,\n sizeof(s->data_in) - s->idx_in);\n }\n \n@@ -80,7 +80,7 @@ static inline void wm8750_out_flush(WM8750State *s)\n {\n int sent = 0;\n while (sent < s->idx_out)\n- sent += AUD_write(*s->out[0], s->data_out + sent, s->idx_out - sent)\n+ sent += AUD_write(s->audio_be, *s->out[0], s->data_out + sent, s->idx_out - sent)\n ?: s->idx_out;\n s->idx_out = 0;\n }\n@@ -145,30 +145,30 @@ static void wm8750_vol_update(WM8750State *s)\n {\n /* FIXME: multiply all volumes by s->invol[2], s->invol[3] */\n \n- AUD_set_volume_in_lr(s->adc_voice[0], s->mute,\n+ AUD_set_volume_in_lr(s->audio_be, s->adc_voice[0], s->mute,\n s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]),\n s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1]));\n- AUD_set_volume_in_lr(s->adc_voice[1], s->mute,\n+ AUD_set_volume_in_lr(s->audio_be, s->adc_voice[1], s->mute,\n s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]),\n s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1]));\n- AUD_set_volume_in_lr(s->adc_voice[2], s->mute,\n+ AUD_set_volume_in_lr(s->audio_be, s->adc_voice[2], s->mute,\n s->inmute[0] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[0]),\n s->inmute[1] ? 0 : WM8750_INVOL_TRANSFORM(s->invol[1]));\n \n /* FIXME: multiply all volumes by s->outvol[0], s->outvol[1] */\n \n /* Speaker: LOUT2VOL ROUT2VOL */\n- AUD_set_volume_out_lr(s->dac_voice[0], s->mute,\n+ AUD_set_volume_out_lr(s->audio_be, s->dac_voice[0], s->mute,\n s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[4]),\n s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[5]));\n \n /* Headphone: LOUT1VOL ROUT1VOL */\n- AUD_set_volume_out_lr(s->dac_voice[1], s->mute,\n+ AUD_set_volume_out_lr(s->audio_be, s->dac_voice[1], s->mute,\n s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[2]),\n s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[3]));\n \n /* MONOOUT: MONOVOL MONOVOL */\n- AUD_set_volume_out_lr(s->dac_voice[2], s->mute,\n+ AUD_set_volume_out_lr(s->audio_be, s->dac_voice[2], s->mute,\n s->outmute[0] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[6]),\n s->outmute[1] ? 0 : WM8750_OUTVOL_TRANSFORM(s->outvol[6]));\n }\n@@ -182,9 +182,9 @@ static void wm8750_set_format(WM8750State *s)\n wm8750_out_flush(s);\n \n if (s->in[0] && *s->in[0])\n- AUD_set_active_in(*s->in[0], 0);\n+ AUD_set_active_in(s->audio_be, *s->in[0], 0);\n if (s->out[0] && *s->out[0])\n- AUD_set_active_out(*s->out[0], 0);\n+ AUD_set_active_out(s->audio_be, *s->out[0], 0);\n \n for (i = 0; i < IN_PORT_N; i ++)\n if (s->adc_voice[i]) {\n@@ -235,9 +235,9 @@ static void wm8750_set_format(WM8750State *s)\n * for mixing or combining paths to different ports, so we\n * connect both channels to where the left channel is routed. */\n if (s->in[0] && *s->in[0])\n- AUD_set_active_in(*s->in[0], 1);\n+ AUD_set_active_in(s->audio_be, *s->in[0], 1);\n if (s->out[0] && *s->out[0])\n- AUD_set_active_out(*s->out[0], 1);\n+ AUD_set_active_out(s->audio_be, *s->out[0], 1);\n }\n \n static void wm8750_clk_update(WM8750State *s, int ext)\ndiff --git a/hw/display/xlnx_dp.c b/hw/display/xlnx_dp.c\nindex a24e95f0a73..deda7efe15d 100644\n--- a/hw/display/xlnx_dp.c\n+++ b/hw/display/xlnx_dp.c\n@@ -331,7 +331,7 @@ static inline void xlnx_dp_audio_activate(XlnxDPState *s)\n {\n bool activated = ((s->core_registers[DP_TX_AUDIO_CONTROL]\n & DP_TX_AUD_CTRL) != 0);\n- AUD_set_active_out(s->amixer_output_stream, activated);\n+ AUD_set_active_out(s->audio_be, s->amixer_output_stream, activated);\n xlnx_dpdma_set_host_data_location(s->dpdma, DP_AUDIO_DMA_CHANNEL(0),\n &s->audio_buffer_0);\n xlnx_dpdma_set_host_data_location(s->dpdma, DP_AUDIO_DMA_CHANNEL(1),\n@@ -401,7 +401,7 @@ static void xlnx_dp_audio_callback(void *opaque, int avail)\n /* Send the buffer through the audio. */\n if (s->byte_left <= MAX_QEMU_BUFFER_SIZE) {\n if (s->byte_left != 0) {\n- written = AUD_write(s->amixer_output_stream,\n+ written = AUD_write(s->audio_be, s->amixer_output_stream,\n &s->out_buffer[s->data_ptr], s->byte_left);\n } else {\n int len_to_copy;\n@@ -413,12 +413,12 @@ static void xlnx_dp_audio_callback(void *opaque, int avail)\n while (avail) {\n len_to_copy = MIN(AUD_CHBUF_MAX_DEPTH, avail);\n memset(s->out_buffer, 0, len_to_copy);\n- avail -= AUD_write(s->amixer_output_stream, s->out_buffer,\n+ avail -= AUD_write(s->audio_be, s->amixer_output_stream, s->out_buffer,\n len_to_copy);\n }\n }\n } else {\n- written = AUD_write(s->amixer_output_stream,\n+ written = AUD_write(s->audio_be, s->amixer_output_stream,\n &s->out_buffer[s->data_ptr], MAX_QEMU_BUFFER_SIZE);\n }\n s->byte_left -= written;\n@@ -1401,7 +1401,7 @@ static void xlnx_dp_realize(DeviceState *dev, Error **errp)\n s,\n xlnx_dp_audio_callback,\n &as);\n- AUD_set_volume_out_lr(s->amixer_output_stream, 0, 255, 255);\n+ AUD_set_volume_out_lr(s->audio_be, s->amixer_output_stream, 0, 255, 255);\n xlnx_dp_audio_activate(s);\n s->vblank = ptimer_init(vblank_hit, s, DP_VBLANK_PTIMER_POLICY);\n ptimer_transaction_begin(s->vblank);\ndiff --git a/hw/usb/dev-audio.c b/hw/usb/dev-audio.c\nindex dfda2dccc04..0f36587fc6f 100644\n--- a/hw/usb/dev-audio.c\n+++ b/hw/usb/dev-audio.c\n@@ -669,7 +669,7 @@ static void output_callback(void *opaque, int avail)\n return;\n }\n \n- written = AUD_write(s->out.voice, data, len);\n+ written = AUD_write(s->audio_be, s->out.voice, data, len);\n avail -= written;\n s->out.buf.cons += written;\n \n@@ -683,7 +683,7 @@ static int usb_audio_set_output_altset(USBAudioState *s, int altset)\n {\n switch (altset) {\n case ALTSET_OFF:\n- AUD_set_active_out(s->out.voice, false);\n+ AUD_set_active_out(s->audio_be, s->out.voice, false);\n break;\n case ALTSET_STEREO:\n case ALTSET_51:\n@@ -692,7 +692,7 @@ static int usb_audio_set_output_altset(USBAudioState *s, int altset)\n usb_audio_reinit(USB_DEVICE(s), altset_channels[altset]);\n }\n streambuf_init(&s->out.buf, s->buffer, s->out.channels);\n- AUD_set_active_out(s->out.voice, true);\n+ AUD_set_active_out(s->audio_be, s->out.voice, true);\n break;\n default:\n return -1;\n@@ -805,7 +805,7 @@ static int usb_audio_set_control(USBAudioState *s, uint8_t attrib,\n }\n fprintf(stderr, \"\\n\");\n }\n- AUD_set_volume_out(s->out.voice, &s->out.vol);\n+ AUD_set_volume_out(s->audio_be, s->out.voice, &s->out.vol);\n }\n \n return ret;\n@@ -980,8 +980,8 @@ static void usb_audio_reinit(USBDevice *dev, unsigned channels)\n \n s->out.voice = AUD_open_out(s->audio_be, s->out.voice, TYPE_USB_AUDIO,\n s, output_callback, &s->out.as);\n- AUD_set_volume_out(s->out.voice, &s->out.vol);\n- AUD_set_active_out(s->out.voice, 0);\n+ AUD_set_volume_out(s->audio_be, s->out.voice, &s->out.vol);\n+ AUD_set_active_out(s->audio_be, s->out.voice, 0);\n }\n \n static const VMStateDescription vmstate_usb_audio = {\ndiff --git a/tests/audio/test-audio.c b/tests/audio/test-audio.c\nindex 66693f0fbfd..6c182ee7c60 100644\n--- a/tests/audio/test-audio.c\n+++ b/tests/audio/test-audio.c\n@@ -142,7 +142,7 @@ static void test_sine_callback(void *opaque, int avail)\n \n generate_sine_samples(buffer, frames_to_write, s->frames_written);\n \n- bytes_written = AUD_write(s->voice, buffer,\n+ bytes_written = AUD_write(s->be, s->voice, buffer,\n frames_to_write * sizeof(int16_t) * CHANNELS);\n s->frames_written += bytes_written / (sizeof(int16_t) * CHANNELS);\n }\n@@ -163,7 +163,7 @@ static void test_audio_out_sine_wave(void)\n &state, test_sine_callback);\n \n g_test_message(\"Playing 440Hz sine wave for %d seconds...\", DURATION_SECS);\n- AUD_set_active_out(state.voice, true);\n+ AUD_set_active_out(state.be, state.voice, true);\n \n /*\n * Run the audio subsystem until all frames are written or timeout.\n@@ -188,7 +188,7 @@ static void test_audio_out_sine_wave(void)\n \n g_assert_cmpint(state.frames_written, ==, state.total_frames);\n \n- AUD_set_active_out(state.voice, false);\n+ AUD_set_active_out(state.be, state.voice, false);\n AUD_close_out(state.be, state.voice);\n }\n \n@@ -224,13 +224,13 @@ static void test_audio_out_active_state(void)\n be = get_test_audio_backend();\n voice = open_test_voice_out(be, \"test-active\", NULL, dummy_audio_callback);\n \n- g_assert_false(AUD_is_active_out(voice));\n+ g_assert_false(AUD_is_active_out(be, voice));\n \n- AUD_set_active_out(voice, true);\n- g_assert_true(AUD_is_active_out(voice));\n+ AUD_set_active_out(be, voice, true);\n+ g_assert_true(AUD_is_active_out(be, voice));\n \n- AUD_set_active_out(voice, false);\n- g_assert_false(AUD_is_active_out(voice));\n+ AUD_set_active_out(be, voice, false);\n+ g_assert_false(AUD_is_active_out(be, voice));\n \n AUD_close_out(be, voice);\n }\n@@ -244,13 +244,13 @@ static void test_audio_out_buffer_size(void)\n be = get_test_audio_backend();\n voice = open_test_voice_out(be, \"test-buffer\", NULL, dummy_audio_callback);\n \n- buffer_size = AUD_get_buffer_size_out(voice);\n+ buffer_size = AUD_get_buffer_size_out(be, voice);\n g_test_message(\"Buffer size: %d bytes\", buffer_size);\n g_assert_cmpint(buffer_size, >, 0);\n \n AUD_close_out(be, voice);\n \n- g_assert_cmpint(AUD_get_buffer_size_out(NULL), ==, 0);\n+ g_assert_cmpint(AUD_get_buffer_size_out(NULL, NULL), ==, 0);\n }\n \n static void test_audio_out_volume(void)\n@@ -263,13 +263,13 @@ static void test_audio_out_volume(void)\n voice = open_test_voice_out(be, \"test-volume\", NULL, dummy_audio_callback);\n \n vol = (Volume){ .mute = false, .channels = 2, .vol = {255, 255} };\n- AUD_set_volume_out(voice, &vol);\n+ AUD_set_volume_out(be, voice, &vol);\n \n vol = (Volume){ .mute = true, .channels = 2, .vol = {255, 255} };\n- AUD_set_volume_out(voice, &vol);\n+ AUD_set_volume_out(be, voice, &vol);\n \n vol = (Volume){ .mute = false, .channels = 2, .vol = {128, 128} };\n- AUD_set_volume_out(voice, &vol);\n+ AUD_set_volume_out(be, voice, &vol);\n \n AUD_close_out(be, voice);\n }\n@@ -286,13 +286,13 @@ static void test_audio_in_active_state(void)\n return;\n }\n \n- g_assert_false(AUD_is_active_in(voice));\n+ g_assert_false(AUD_is_active_in(be, voice));\n \n- AUD_set_active_in(voice, true);\n- g_assert_true(AUD_is_active_in(voice));\n+ AUD_set_active_in(be, voice, true);\n+ g_assert_true(AUD_is_active_in(be, voice));\n \n- AUD_set_active_in(voice, false);\n- g_assert_false(AUD_is_active_in(voice));\n+ AUD_set_active_in(be, voice, false);\n+ g_assert_false(AUD_is_active_in(be, voice));\n \n AUD_close_in(be, voice);\n }\n@@ -311,10 +311,10 @@ static void test_audio_in_volume(void)\n }\n \n vol = (Volume){ .mute = false, .channels = 2, .vol = {255, 255} };\n- AUD_set_volume_in(voice, &vol);\n+ AUD_set_volume_in(be, voice, &vol);\n \n vol = (Volume){ .mute = true, .channels = 2, .vol = {255, 255} };\n- AUD_set_volume_in(voice, &vol);\n+ AUD_set_volume_in(be, voice, &vol);\n \n AUD_close_in(be, voice);\n }\n@@ -427,7 +427,7 @@ static void test_audio_capture(void)\n &sine_state, test_sine_callback);\n sine_state.voice = voice;\n \n- AUD_set_active_out(voice, true);\n+ AUD_set_active_out(be, voice, true);\n \n start_time = g_get_monotonic_time();\n while (sine_state.frames_written < sine_state.total_frames ||\n@@ -472,10 +472,10 @@ static void test_audio_capture(void)\n g_assert_cmpfloat(match_ratio, >=, 0.9);\n }\n \n- AUD_set_active_out(voice, false);\n+ AUD_set_active_out(be, voice, false);\n AUD_close_out(be, voice);\n \n- AUD_del_capture(cap, &state);\n+ AUD_del_capture(be, cap, &state);\n g_assert_true(state.destroy_called);\n \n g_free(state.captured_samples);\n@@ -483,26 +483,27 @@ static void test_audio_capture(void)\n \n static void test_audio_null_handling(void)\n {\n+ AudioBackend *be = get_test_audio_backend();\n uint8_t buffer[64];\n \n /* AUD_is_active_out/in(NULL) should return false */\n- g_assert_false(AUD_is_active_out(NULL));\n- g_assert_false(AUD_is_active_in(NULL));\n+ g_assert_false(AUD_is_active_out(be, NULL));\n+ g_assert_false(AUD_is_active_in(be, NULL));\n \n /* AUD_get_buffer_size_out(NULL) should return 0 */\n- g_assert_cmpint(AUD_get_buffer_size_out(NULL), ==, 0);\n+ g_assert_cmpint(AUD_get_buffer_size_out(be, NULL), ==, 0);\n \n /* AUD_write/read(NULL, ...) should return size (no-op) */\n- g_assert_cmpuint(AUD_write(NULL, buffer, sizeof(buffer)), ==,\n+ g_assert_cmpuint(AUD_write(be, NULL, buffer, sizeof(buffer)), ==,\n sizeof(buffer));\n- g_assert_cmpuint(AUD_read(NULL, buffer, sizeof(buffer)), ==,\n+ g_assert_cmpuint(AUD_read(be, NULL, buffer, sizeof(buffer)), ==,\n sizeof(buffer));\n \n /* These should not crash */\n- AUD_set_active_out(NULL, true);\n- AUD_set_active_out(NULL, false);\n- AUD_set_active_in(NULL, true);\n- AUD_set_active_in(NULL, false);\n+ AUD_set_active_out(be, NULL, true);\n+ AUD_set_active_out(be, NULL, false);\n+ AUD_set_active_in(be, NULL, true);\n+ AUD_set_active_in(be, NULL, false);\n }\n \n static void test_audio_multiple_voices(void)\n@@ -516,19 +517,19 @@ static void test_audio_multiple_voices(void)\n out2 = open_test_voice_out(be, \"test-multi-out2\", NULL, dummy_audio_callback);\n in1 = open_test_voice_in(be, \"test-multi-in1\", NULL, dummy_audio_callback);\n \n- AUD_set_active_out(out1, true);\n- AUD_set_active_out(out2, true);\n- AUD_set_active_in(in1, true);\n+ AUD_set_active_out(be, out1, true);\n+ AUD_set_active_out(be, out2, true);\n+ AUD_set_active_in(be, in1, true);\n \n- g_assert_true(AUD_is_active_out(out1));\n- g_assert_true(AUD_is_active_out(out2));\n+ g_assert_true(AUD_is_active_out(be, out1));\n+ g_assert_true(AUD_is_active_out(be, out2));\n if (in1) {\n- g_assert_true(AUD_is_active_in(in1));\n+ g_assert_true(AUD_is_active_in(be, in1));\n }\n \n- AUD_set_active_out(out1, false);\n- AUD_set_active_out(out2, false);\n- AUD_set_active_in(in1, false);\n+ AUD_set_active_out(be, out1, false);\n+ AUD_set_active_out(be, out2, false);\n+ AUD_set_active_in(be, in1, false);\n \n AUD_close_in(be, in1);\n AUD_close_out(be, out2);\ndiff --git a/ui/vnc.c b/ui/vnc.c\nindex a61a4f937d6..c142d9fc7c0 100644\n--- a/ui/vnc.c\n+++ b/ui/vnc.c\n@@ -1289,7 +1289,7 @@ static void audio_add(VncState *vs)\n static void audio_del(VncState *vs)\n {\n if (vs->audio_cap) {\n- AUD_del_capture(vs->audio_cap, vs);\n+ AUD_del_capture(vs->vd->audio_be, vs->audio_cap, vs);\n vs->audio_cap = NULL;\n }\n }\n", "prefixes": [ "34/85" ] }