get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2196818/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "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"
    ]
}