From nobody Tue Feb 10 02:55:26 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) client-ip=170.10.133.124; envelope-from=libvir-list-bounces@redhat.com; helo=us-smtp-delivery-124.mimecast.com; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass(p=none dis=none) header.from=redhat.com ARC-Seal: i=1; a=rsa-sha256; t=1636109605; cv=none; d=zohomail.com; s=zohoarc; b=IMo67c8W0nRSkpHUAFa+otDr8vFmzguxKKdnIt7rQI63joNvzihbndc9hiS11+RKwTUu+2n5ogExDpZ4NFgvqme7FtUC22KoVmZO8kT2mkQ8z8gKcutR7GzpquoULCH1h7SUZElxbdJkjTaa9z20ngdUGGyJ5P/+idkqCQS6pWA= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1636109605; h=Content-Type:Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To; bh=7Pq3XTFGjGCF4sn5PH0jHJc1jamEKe4w0F282Jk23LA=; b=FfrJP5eM5It+a85icQ+Ei1uKy4g9VmvbezM69AWCOp9kJLH5CVQFiYlWs/hDcAGSHrRW3CErBIkjx4xLbybvkD3RNpkr5swPgetTBnpWDL7MuENH+EBY8qZ7NxqdCpwuzJl6GH95PJv4McxkwvLfkCMdE70MafzH9+dADmT6WkY= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=libvir-list-bounces@redhat.com; dmarc=pass header.from= (p=none dis=none) Return-Path: Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by mx.zohomail.com with SMTPS id 1636109605766690.5725183064233; Fri, 5 Nov 2021 03:53:25 -0700 (PDT) Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-284-sZaop1FlPFObr8Jp0SibHA-1; Fri, 05 Nov 2021 06:53:22 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id 33E8E10A8E09; Fri, 5 Nov 2021 10:53:18 +0000 (UTC) Received: from colo-mx.corp.redhat.com (colo-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.20]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 18B261017CF3; Fri, 5 Nov 2021 10:53:18 +0000 (UTC) Received: from lists01.pubmisc.prod.ext.phx2.redhat.com (lists01.pubmisc.prod.ext.phx2.redhat.com [10.5.19.33]) by colo-mx.corp.redhat.com (Postfix) with ESMTP id DDE6018199EE; Fri, 5 Nov 2021 10:53:17 +0000 (UTC) Received: from smtp.corp.redhat.com (int-mx05.intmail.prod.int.phx2.redhat.com [10.5.11.15]) by lists01.pubmisc.prod.ext.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id 1A5ArHFK001914 for ; Fri, 5 Nov 2021 06:53:17 -0400 Received: by smtp.corp.redhat.com (Postfix) id 2B71F5F4EC; Fri, 5 Nov 2021 10:53:17 +0000 (UTC) Received: from localhost (unknown [10.39.208.24]) by smtp.corp.redhat.com (Postfix) with ESMTP id 21DB256A84; Fri, 5 Nov 2021 10:53:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1636109604; h=from:from:sender:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:list-id:list-help: list-unsubscribe:list-subscribe:list-post; bh=7Pq3XTFGjGCF4sn5PH0jHJc1jamEKe4w0F282Jk23LA=; b=KwKW3OqNsSsPjc7BHjan8Oa8/jbnnJEeZ9grlDrzpnqWFGRAWO6y1nDI8wClTsj1cwNj5K xMu+5FzYalnZz497OXGQEku3Jm7CQ960SgPbqpJHuxWpsR6wvKdz3V6y2HC4czGPZ+suuP sb7v30lo3sCtAJha2UBWMLT2UpxqSxA= X-MC-Unique: sZaop1FlPFObr8Jp0SibHA-1 From: marcandre.lureau@redhat.com To: libvir-list@redhat.com Subject: [libvirt PATCH 5/9] qemu: add audio type 'dbus' Date: Fri, 5 Nov 2021 14:51:15 +0400 Message-Id: <20211105105119.117552-6-marcandre.lureau@redhat.com> In-Reply-To: <20211105105119.117552-1-marcandre.lureau@redhat.com> References: <20211105105119.117552-1-marcandre.lureau@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.15 X-loop: libvir-list@redhat.com Cc: =?UTF-8?q?Marc-Andr=C3=A9=20Lureau?= X-BeenThere: libvir-list@redhat.com X-Mailman-Version: 2.1.12 Precedence: junk List-Id: Development discussions about the libvirt library & tools List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: libvir-list-bounces@redhat.com Errors-To: libvir-list-bounces@redhat.com X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 Authentication-Results: relay.mimecast.com; auth=pass smtp.auth=CUSA124A263 smtp.mailfrom=libvir-list-bounces@redhat.com X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable X-ZohoMail-DKIM: pass (identity @redhat.com) X-ZM-MESSAGEID: 1636109606916100001 From: Marc-Andr=C3=A9 Lureau Signed-off-by: Marc-Andr=C3=A9 Lureau --- docs/schemas/domaincommon.rng | 29 +++++++++++++ src/bhyve/bhyve_command.c | 1 + src/conf/domain_conf.c | 16 +++++++ src/conf/domain_conf.h | 2 + src/qemu/qemu_command.c | 17 +++++++- src/qemu/qemu_validate.c | 33 +++++++++++++- .../qemuxml2argvdata/graphics-dbus-audio.args | 32 ++++++++++++++ .../qemuxml2argvdata/graphics-dbus-audio.xml | 40 +++++++++++++++++ tests/qemuxml2argvtest.c | 2 + .../graphics-dbus-audio.xml | 43 +++++++++++++++++++ tests/qemuxml2xmltest.c | 4 ++ 11 files changed, 217 insertions(+), 2 deletions(-) create mode 100644 tests/qemuxml2argvdata/graphics-dbus-audio.args create mode 100644 tests/qemuxml2argvdata/graphics-dbus-audio.xml create mode 100644 tests/qemuxml2xmloutdata/graphics-dbus-audio.xml diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng index 1dba199db7ec..fcd14162bc9a 100644 --- a/docs/schemas/domaincommon.rng +++ b/docs/schemas/domaincommon.rng @@ -4027,6 +4027,13 @@ + + + + + + + @@ -4839,6 +4846,11 @@ =20 + + + + + @@ -4867,6 +4879,23 @@ + + + dbus + + + + + + + + + + + + + + alsa diff --git a/src/bhyve/bhyve_command.c b/src/bhyve/bhyve_command.c index ab9d3026cc8c..17712c1e6e69 100644 --- a/src/bhyve/bhyve_command.c +++ b/src/bhyve/bhyve_command.c @@ -551,6 +551,7 @@ bhyveBuildSoundArgStr(const virDomainDef *def G_GNUC_UN= USED, case VIR_DOMAIN_AUDIO_TYPE_SDL: case VIR_DOMAIN_AUDIO_TYPE_SPICE: case VIR_DOMAIN_AUDIO_TYPE_FILE: + case VIR_DOMAIN_AUDIO_TYPE_DBUS: virReportError(VIR_ERR_CONFIG_UNSUPPORTED, _("unsupported audio backend '%s'"), virDomainAudioTypeTypeToString(audio->type)); diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c index 8a2f3c4115e0..82f5e44951d5 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -755,6 +755,7 @@ VIR_ENUM_IMPL(virDomainAudioType, "sdl", "spice", "file", + "dbus", ); =20 VIR_ENUM_IMPL(virDomainAudioSDLDriver, @@ -3023,6 +3024,7 @@ virDomainAudioDefFree(virDomainAudioDef *def) g_free(def->backend.file.path); break; =20 + case VIR_DOMAIN_AUDIO_TYPE_DBUS: case VIR_DOMAIN_AUDIO_TYPE_LAST: break; } @@ -12930,6 +12932,14 @@ virDomainGraphicsDefParseXMLDBus(virDomainGraphics= Def *def, return -1; } =20 + cur =3D virXPathNode("./audio", ctxt); + if (cur) { + if (virXMLPropUInt(cur, "id", 10, + VIR_XML_PROP_REQUIRED | VIR_XML_PROP_NONZERO, + &def->data.dbus.audioId) < 0) + return -1; + } + return 0; } =20 @@ -13420,6 +13430,9 @@ virDomainAudioDefParseXML(virDomainXMLOption *xmlop= t G_GNUC_UNUSED, def->backend.file.path =3D virXMLPropString(node, "path"); break; =20 + case VIR_DOMAIN_AUDIO_TYPE_DBUS: + break; + case VIR_DOMAIN_AUDIO_TYPE_LAST: default: virReportEnumRangeError(virDomainAudioType, def->type); @@ -25776,6 +25789,9 @@ virDomainAudioDefFormat(virBuffer *buf, virBufferEscapeString(&attrBuf, " path=3D'%s'", def->backend.file.= path); break; =20 + case VIR_DOMAIN_AUDIO_TYPE_DBUS: + break; + case VIR_DOMAIN_AUDIO_TYPE_LAST: default: virReportEnumRangeError(virDomainAudioType, def->type); diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index 42fe583418a6..6eec4230fab5 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -1504,6 +1504,7 @@ typedef enum { VIR_DOMAIN_AUDIO_TYPE_SDL, VIR_DOMAIN_AUDIO_TYPE_SPICE, VIR_DOMAIN_AUDIO_TYPE_FILE, + VIR_DOMAIN_AUDIO_TYPE_DBUS, =20 VIR_DOMAIN_AUDIO_TYPE_LAST } virDomainAudioType; @@ -1922,6 +1923,7 @@ struct _virDomainGraphicsDef { char *address; char *rendernode; virTristateBool gl; + unsigned int audioId; } dbus; } data; /* nListens, listens, and *port are only useful if type is vnc, diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c index 1960861015c6..20cafa1abb0e 100644 --- a/src/qemu/qemu_command.c +++ b/src/qemu/qemu_command.c @@ -152,6 +152,7 @@ VIR_ENUM_IMPL(qemuAudioDriver, "sdl", "spice", "wav", + "dbus", ); =20 =20 @@ -8010,6 +8011,9 @@ qemuBuildAudioCommandLineArg(virCommand *cmd, virBufferEscapeString(&buf, ",path=3D%s", def->backend.file.pa= th); break; =20 + case VIR_DOMAIN_AUDIO_TYPE_DBUS: + break; + case VIR_DOMAIN_AUDIO_TYPE_LAST: default: virReportEnumRangeError(virDomainAudioType, def->type); @@ -8205,6 +8209,9 @@ qemuBuildAudioCommandLineEnv(virCommand *cmd, audio->backend.file.path); break; =20 + case VIR_DOMAIN_AUDIO_TYPE_DBUS: + break; + case VIR_DOMAIN_AUDIO_TYPE_LAST: default: virReportEnumRangeError(virDomainAudioType, audio->type); @@ -8603,6 +8610,7 @@ qemuBuildGraphicsEGLHeadlessCommandLine(virQEMUDriver= Config *cfg G_GNUC_UNUSED, static int qemuBuildGraphicsDBusCommandLine(virQEMUDriver *driver, virDomainObj *vm, + virDomainDef *def, virCommand *cmd, virDomainGraphicsDef *graphics) { @@ -8630,6 +8638,13 @@ qemuBuildGraphicsDBusCommandLine(virQEMUDriver *driv= er, graphics->data.dbus.rendernode); } =20 + if (graphics->data.dbus.audioId > 0) { + g_autofree char *audioid =3D qemuGetAudioIDString(def, graphics->d= ata.dbus.audioId); + if (!audioid) + return -1; + virBufferAsprintf(&opt, ",audiodev=3D%s", audioid); + } + virCommandAddArg(cmd, "-display"); virCommandAddArgBuffer(cmd, &opt); =20 @@ -8676,7 +8691,7 @@ qemuBuildGraphicsCommandLine(virQEMUDriver *driver, =20 break; case VIR_DOMAIN_GRAPHICS_TYPE_DBUS: - if (qemuBuildGraphicsDBusCommandLine(driver, vm, cmd, + if (qemuBuildGraphicsDBusCommandLine(driver, vm, def, cmd, graphics) < 0) return -1; =20 diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c index 23c7e9f94cd0..56949775a3e6 100644 --- a/src/qemu/qemu_validate.c +++ b/src/qemu/qemu_validate.c @@ -4088,6 +4088,24 @@ qemuValidateDomainDeviceDefVNCGraphics(const virDoma= inGraphicsDef *graphics, } =20 =20 +static int +qemuValidateDomainDeviceDefDBusGraphics(const virDomainGraphicsDef *graphi= cs, + const virDomainDef *def) +{ + if (graphics->data.dbus.audioId > 0) { + virDomainAudioDef *audio =3D virDomainDefFindAudioByID(def, graphi= cs->data.dbus.audioId); + + if (audio && audio->type !=3D VIR_DOMAIN_AUDIO_TYPE_DBUS) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("The associated audio is not of 'dbus' kind."= )); + return -1; + } + } + + return 0; +} + + static int qemuValidateDomainDeviceDefGraphics(const virDomainGraphicsDef *graphics, const virDomainDef *def, @@ -4165,10 +4183,15 @@ qemuValidateDomainDeviceDefGraphics(const virDomain= GraphicsDef *graphics, =20 break; =20 + case VIR_DOMAIN_GRAPHICS_TYPE_DBUS: + if (qemuValidateDomainDeviceDefDBusGraphics(graphics, def) < 0) + return -1; + + break; + case VIR_DOMAIN_GRAPHICS_TYPE_SDL: case VIR_DOMAIN_GRAPHICS_TYPE_RDP: case VIR_DOMAIN_GRAPHICS_TYPE_DESKTOP: - case VIR_DOMAIN_GRAPHICS_TYPE_DBUS: case VIR_DOMAIN_GRAPHICS_TYPE_LAST: break; } @@ -4415,6 +4438,14 @@ qemuValidateDomainDeviceDefAudio(virDomainAudioDef *= audio, case VIR_DOMAIN_AUDIO_TYPE_FILE: break; =20 + case VIR_DOMAIN_AUDIO_TYPE_DBUS: + if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_DISPLAY_DBUS)) { + virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s", + _("D-Bus audio is not supported with this QEMU"= )); + return -1; + } + break; + case VIR_DOMAIN_AUDIO_TYPE_LAST: default: virReportEnumRangeError(virDomainAudioType, audio->type); diff --git a/tests/qemuxml2argvdata/graphics-dbus-audio.args b/tests/qemuxm= l2argvdata/graphics-dbus-audio.args new file mode 100644 index 000000000000..83f7d3f6a5a9 --- /dev/null +++ b/tests/qemuxml2argvdata/graphics-dbus-audio.args @@ -0,0 +1,32 @@ +LC_ALL=3DC \ +PATH=3D/bin \ +HOME=3D/tmp/lib/domain--1-QEMUGuest1 \ +USER=3Dtest \ +LOGNAME=3Dtest \ +XDG_DATA_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.local/share \ +XDG_CACHE_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.cache \ +XDG_CONFIG_HOME=3D/tmp/lib/domain--1-QEMUGuest1/.config \ +/usr/bin/qemu-system-i386 \ +-name guest=3DQEMUGuest1,debug-threads=3Don \ +-S \ +-object secret,id=3DmasterKey0,format=3Draw,file=3D/tmp/lib/domain--1-QEMU= Guest1/master-key.aes \ +-machine pc,accel=3Dtcg,usb=3Doff,dump-guest-core=3Doff \ +-m 214 \ +-realtime mlock=3Doff \ +-smp 1,sockets=3D1,cores=3D1,threads=3D1 \ +-uuid c7a5fdbd-edaf-9455-926a-d65c16db1809 \ +-no-user-config \ +-nodefaults \ +-chardev socket,id=3Dcharmonitor,path=3D/tmp/lib/domain--1-QEMUGuest1/moni= tor.sock,server=3Don,wait=3Doff \ +-mon chardev=3Dcharmonitor,id=3Dmonitor,mode=3Dcontrol \ +-rtc base=3Dutc \ +-no-shutdown \ +-no-acpi \ +-boot strict=3Don \ +-usb \ +-drive file=3D/dev/HostVG/QEMUGuest1,format=3Draw,if=3Dnone,id=3Ddrive-ide= 0-0-0 \ +-device ide-hd,bus=3Dide.0,unit=3D0,drive=3Ddrive-ide0-0-0,id=3Dide0-0-0,b= ootindex=3D1 \ +-audiodev id=3Daudio1,driver=3Ddbus,in.mixing-engine=3Doff,out.mixing-engi= ne=3Doff \ +-display dbus,p2p=3Don,audiodev=3Daudio1 \ +-device cirrus-vga,id=3Dvideo0,bus=3Dpci.0,addr=3D0x2 \ +-msg timestamp=3Don diff --git a/tests/qemuxml2argvdata/graphics-dbus-audio.xml b/tests/qemuxml= 2argvdata/graphics-dbus-audio.xml new file mode 100644 index 000000000000..592e3d535d91 --- /dev/null +++ b/tests/qemuxml2argvdata/graphics-dbus-audio.xml @@ -0,0 +1,40 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-i386 + + + + +
+ + + + + + + + + + + + + diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c index 4345ab47e053..e5454f03eccf 100644 --- a/tests/qemuxml2argvtest.c +++ b/tests/qemuxml2argvtest.c @@ -1524,6 +1524,8 @@ mymain(void) QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DISPLAY_DBUS); DO_TEST("graphics-dbus-p2p", QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DISPLAY_DBUS); + DO_TEST("graphics-dbus-audio", + QEMU_CAPS_DEVICE_CIRRUS_VGA, QEMU_CAPS_DISPLAY_DBUS, QEMU_CAPS= _AUDIODEV); =20 DO_TEST_NOCAPS("input-usbmouse"); DO_TEST_NOCAPS("input-usbtablet"); diff --git a/tests/qemuxml2xmloutdata/graphics-dbus-audio.xml b/tests/qemux= ml2xmloutdata/graphics-dbus-audio.xml new file mode 100644 index 000000000000..16c37a34c6d5 --- /dev/null +++ b/tests/qemuxml2xmloutdata/graphics-dbus-audio.xml @@ -0,0 +1,43 @@ + + QEMUGuest1 + c7a5fdbd-edaf-9455-926a-d65c16db1809 + 219100 + 219100 + 1 + + hvm + + + + destroy + restart + destroy + + /usr/bin/qemu-system-i386 + + + + +
+ + +
+ + +
+ + + + + + +