From patchwork Thu Aug 6 18:28:25 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?UTF-8?B?Wm9sdMOhbiBLxZF2w6Fnw7M=?= X-Patchwork-Id: 504912 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id E5DB11402B7 for ; Fri, 7 Aug 2015 07:11:04 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=kcb3PrfE; dkim-atps=neutral Received: from localhost ([::1]:46712 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNSRK-0007ko-W9 for incoming@patchwork.ozlabs.org; Thu, 06 Aug 2015 17:11:03 -0400 Received: from eggs.gnu.org ([2001:4830:134:3::10]:48994) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNPuB-000829-2w for qemu-devel@nongnu.org; Thu, 06 Aug 2015 14:28:42 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ZNPu8-0001Bg-Sz for qemu-devel@nongnu.org; Thu, 06 Aug 2015 14:28:39 -0400 Received: from mail-wi0-x22f.google.com ([2a00:1450:400c:c05::22f]:33053) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ZNPu8-0001BS-IT for qemu-devel@nongnu.org; Thu, 06 Aug 2015 14:28:36 -0400 Received: by wijp15 with SMTP id p15so33067514wij.0 for ; Thu, 06 Aug 2015 11:28:36 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:cc:subject:date:message-id:in-reply-to:references :mime-version:content-type:content-transfer-encoding; bh=doBHmsoylQ7kjTPKbV0gVEywigpeiCfEzTH2a1o8iJY=; b=kcb3PrfE2DBpsWdgpfc5Ec/Flr8yAZyBsDmZxFSrqMZjJESPRV6N5h4I8oF4+Yn/G6 OGGWRCh8+kvFBxXmcineq3mfSUrYTP1cXkwPuHY5lxZvLF0H0ZKqLssORUOgpgc1tLl9 TUo/iUh4/KzT0nSwQuZKX3n2yodzTH5aK+3nXXWQjZQVsI5gVBjwSVrZaVMDiOUrdZsP +y/WeltxG1BIvhRFrcJCJtsLMXu9HvT8YqcR4hyz0uKLuAMaQWbbNQv1bNVX8MeXKmun UGJWgTjIm5DEItlCMnR/6D7FKtEuRW+I2HNHiGs6fh0U//s+2R/FALzZv4WPouWpJjSn ehnA== X-Received: by 10.180.186.34 with SMTP id fh2mr9102764wic.94.1438885716021; Thu, 06 Aug 2015 11:28:36 -0700 (PDT) Received: from nullptr.home.dirty-ice.org (84-236-21-48.pool.digikabel.hu. [84.236.21.48]) by smtp.gmail.com with ESMTPSA id i6sm10726509wje.33.2015.08.06.11.28.34 (version=TLSv1.2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Thu, 06 Aug 2015 11:28:35 -0700 (PDT) From: "=?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?=" X-Google-Original-From: =?UTF-8?q?K=C5=91v=C3=A1g=C3=B3=2C=20Zolt=C3=A1n?= To: qemu-devel@nongnu.org Date: Thu, 6 Aug 2015 20:28:25 +0200 Message-Id: X-Mailer: git-send-email 2.4.5 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: Error: Malformed IPv6 address (bad octet value). X-Received-From: 2a00:1450:400c:c05::22f Cc: Michael Walle , Gerd Hoffmann Subject: [Qemu-devel] [PATCH 13/25] audio: add audiodev properties to frontends X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Finally add audiodev= options to audio frontends so users can specify which backend to use when multiple backends exist. Not specifying an audiodev= option currently causes the first audiodev to be used, this is fixed in the next commit. Example usage: -audiodev pa,id=foo -device AC97,audiodev=foo Signed-off-by: Kővágó, Zoltán Reviewed-by: Marc-André Lureau --- audio/audio.h | 3 +++ hw/audio/ac97.c | 1 + hw/audio/adlib.c | 1 + hw/audio/cs4231a.c | 1 + hw/audio/es1370.c | 7 ++++- hw/audio/gus.c | 1 + hw/audio/hda-codec.c | 1 + hw/audio/milkymist-ac97.c | 6 +++++ hw/audio/pcspk.c | 1 + hw/audio/pl041.c | 1 + hw/audio/sb16.c | 1 + hw/audio/wm8750.c | 6 +++++ hw/core/qdev-properties-system.c | 57 ++++++++++++++++++++++++++++++++++++++++ hw/usb/dev-audio.c | 1 + include/hw/qdev-properties.h | 3 +++ 15 files changed, 90 insertions(+), 1 deletion(-) diff --git a/audio/audio.h b/audio/audio.h index 0085a07..68545b6 100644 --- a/audio/audio.h +++ b/audio/audio.h @@ -177,4 +177,7 @@ void audio_legacy_help(void); AudioState *audio_state_by_name(const char *name); const char *audio_get_id(QEMUSoundCard *card); +#define DEFINE_AUDIO_PROPERTIES(_s, _f) \ + DEFINE_PROP_AUDIODEV("audiodev", _s, _f) + #endif /* audio.h */ diff --git a/hw/audio/ac97.c b/hw/audio/ac97.c index fa75f33..a835cb6 100644 --- a/hw/audio/ac97.c +++ b/hw/audio/ac97.c @@ -1393,6 +1393,7 @@ static int ac97_init (PCIBus *bus) } static Property ac97_properties[] = { + DEFINE_AUDIO_PROPERTIES(AC97LinkState, card), DEFINE_PROP_UINT32 ("use_broken_id", AC97LinkState, use_broken_id, 0), DEFINE_PROP_END_OF_LIST (), }; diff --git a/hw/audio/adlib.c b/hw/audio/adlib.c index f8f0f55..58de8b0 100644 --- a/hw/audio/adlib.c +++ b/hw/audio/adlib.c @@ -352,6 +352,7 @@ static void adlib_realizefn (DeviceState *dev, Error **errp) } static Property adlib_properties[] = { + DEFINE_AUDIO_PROPERTIES(AdlibState, card), DEFINE_PROP_UINT32 ("iobase", AdlibState, port, 0x220), DEFINE_PROP_UINT32 ("freq", AdlibState, freq, 44100), DEFINE_PROP_END_OF_LIST (), diff --git a/hw/audio/cs4231a.c b/hw/audio/cs4231a.c index 626a173..43a1a39 100644 --- a/hw/audio/cs4231a.c +++ b/hw/audio/cs4231a.c @@ -672,6 +672,7 @@ static int cs4231a_init (ISABus *bus) } static Property cs4231a_properties[] = { + DEFINE_AUDIO_PROPERTIES(CSState, card), DEFINE_PROP_UINT32 ("iobase", CSState, port, 0x534), DEFINE_PROP_UINT32 ("irq", CSState, irq, 9), DEFINE_PROP_UINT32 ("dma", CSState, dma, 3), diff --git a/hw/audio/es1370.c b/hw/audio/es1370.c index f6e74cb..fe6110d 100644 --- a/hw/audio/es1370.c +++ b/hw/audio/es1370.c @@ -1047,6 +1047,11 @@ static int es1370_init (PCIBus *bus) return 0; } +static Property es1370_properties[] = { + DEFINE_AUDIO_PROPERTIES(ES1370State, card), + DEFINE_PROP_END_OF_LIST(), +}; + static void es1370_class_init (ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS (klass); @@ -1061,6 +1066,7 @@ static void es1370_class_init (ObjectClass *klass, void *data) set_bit(DEVICE_CATEGORY_SOUND, dc->categories); dc->desc = "ENSONIQ AudioPCI ES1370"; dc->vmsd = &vmstate_es1370; + dc->props = es1370_properties; } static const TypeInfo es1370_info = { @@ -1077,4 +1083,3 @@ static void es1370_register_types (void) } type_init (es1370_register_types) - diff --git a/hw/audio/gus.c b/hw/audio/gus.c index 6107824..ee08d50 100644 --- a/hw/audio/gus.c +++ b/hw/audio/gus.c @@ -284,6 +284,7 @@ static int GUS_init (ISABus *bus) } static Property gus_properties[] = { + DEFINE_AUDIO_PROPERTIES(GUSState, card), DEFINE_PROP_UINT32 ("freq", GUSState, freq, 44100), DEFINE_PROP_UINT32 ("iobase", GUSState, port, 0x240), DEFINE_PROP_UINT32 ("irq", GUSState, emu.gusirq, 7), diff --git a/hw/audio/hda-codec.c b/hw/audio/hda-codec.c index 8693b7a..dba3331 100644 --- a/hw/audio/hda-codec.c +++ b/hw/audio/hda-codec.c @@ -613,6 +613,7 @@ static const VMStateDescription vmstate_hda_audio = { }; static Property hda_audio_properties[] = { + DEFINE_AUDIO_PROPERTIES(HDAAudioState, card), DEFINE_PROP_UINT32("debug", HDAAudioState, debug, 0), DEFINE_PROP_BOOL("mixer", HDAAudioState, mixer, true), DEFINE_PROP_END_OF_LIST(), diff --git a/hw/audio/milkymist-ac97.c b/hw/audio/milkymist-ac97.c index 15169e2..b63fd6f 100644 --- a/hw/audio/milkymist-ac97.c +++ b/hw/audio/milkymist-ac97.c @@ -323,6 +323,11 @@ static const VMStateDescription vmstate_milkymist_ac97 = { } }; +static Property milkymist_ac97_properties[] = { + DEFINE_AUDIO_PROPERTIES(MilkymistAC97State, card), + DEFINE_PROP_END_OF_LIST(), +}; + static void milkymist_ac97_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -331,6 +336,7 @@ static void milkymist_ac97_class_init(ObjectClass *klass, void *data) k->init = milkymist_ac97_init; dc->reset = milkymist_ac97_reset; dc->vmsd = &vmstate_milkymist_ac97; + dc->props = milkymist_ac97_properties; } static const TypeInfo milkymist_ac97_info = { diff --git a/hw/audio/pcspk.c b/hw/audio/pcspk.c index 302debf..85d6d00 100644 --- a/hw/audio/pcspk.c +++ b/hw/audio/pcspk.c @@ -181,6 +181,7 @@ static void pcspk_realizefn(DeviceState *dev, Error **errp) } static Property pcspk_properties[] = { + DEFINE_AUDIO_PROPERTIES(PCSpkState, card), DEFINE_PROP_UINT32("iobase", PCSpkState, iobase, -1), DEFINE_PROP_PTR("pit", PCSpkState, pit), DEFINE_PROP_END_OF_LIST(), diff --git a/hw/audio/pl041.c b/hw/audio/pl041.c index 19982f2..c003b26 100644 --- a/hw/audio/pl041.c +++ b/hw/audio/pl041.c @@ -616,6 +616,7 @@ static const VMStateDescription vmstate_pl041 = { }; static Property pl041_device_properties[] = { + DEFINE_AUDIO_PROPERTIES(PL041State, codec.card), /* Non-compact FIFO depth property */ DEFINE_PROP_UINT32("nc_fifo_depth", PL041State, fifo_depth, DEFAULT_FIFO_DEPTH), diff --git a/hw/audio/sb16.c b/hw/audio/sb16.c index a159dcc..4bbb718 100644 --- a/hw/audio/sb16.c +++ b/hw/audio/sb16.c @@ -1391,6 +1391,7 @@ static int SB16_init (ISABus *bus) } static Property sb16_properties[] = { + DEFINE_AUDIO_PROPERTIES(SB16State, card), DEFINE_PROP_UINT32 ("version", SB16State, ver, 0x0405), /* 4.5 */ DEFINE_PROP_UINT32 ("iobase", SB16State, port, 0x220), DEFINE_PROP_UINT32 ("irq", SB16State, irq, 5), diff --git a/hw/audio/wm8750.c b/hw/audio/wm8750.c index 4c4333c..049ddf9 100644 --- a/hw/audio/wm8750.c +++ b/hw/audio/wm8750.c @@ -695,6 +695,11 @@ void wm8750_set_bclk_in(void *opaque, int new_hz) wm8750_clk_update(s, 1); } +static Property wm8750_properties[] = { + DEFINE_AUDIO_PROPERTIES(WM8750State, card), + DEFINE_PROP_END_OF_LIST(), +}; + static void wm8750_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -705,6 +710,7 @@ static void wm8750_class_init(ObjectClass *klass, void *data) sc->recv = wm8750_rx; sc->send = wm8750_tx; dc->vmsd = &vmstate_wm8750; + dc->props = wm8750_properties; } static const TypeInfo wm8750_info = { diff --git a/hw/core/qdev-properties-system.c b/hw/core/qdev-properties-system.c index 249976e..3807c86 100644 --- a/hw/core/qdev-properties-system.c +++ b/hw/core/qdev-properties-system.c @@ -10,6 +10,7 @@ * See the COPYING file in the top-level directory. */ +#include "audio/audio.h" #include "net/net.h" #include "hw/qdev.h" #include "qapi/qmp/qerror.h" @@ -357,6 +358,62 @@ PropertyInfo qdev_prop_vlan = { .set = set_vlan, }; +/* --- audiodev --- */ +static void get_audiodev(Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + Property *prop = opaque; + QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop); + char *p = g_strdup(audio_get_id(card)); + + visit_type_str(v, &p, name, errp); + g_free(p); +} + +static void set_audiodev(Object *obj, Visitor *v, void *opaque, + const char *name, Error **errp) +{ + DeviceState *dev = DEVICE(obj); + Property *prop = opaque; + QEMUSoundCard *card = qdev_get_prop_ptr(dev, prop); + AudioState *state; + Error *local_err = NULL; + int err = 0; + char *str; + + if (dev->realized) { + qdev_prop_set_after_realize(dev, name, errp); + return; + } + + visit_type_str(v, &str, name, &local_err); + if (local_err) { + error_propagate(errp, local_err); + return; + } + + state = audio_state_by_name(str); + + if (!state) { + err = -ENOENT; + goto out; + } + card->state = state; + +out: + error_set_from_qdev_prop_error(errp, err, dev, prop, str); + g_free(str); +} + +PropertyInfo qdev_prop_audiodev = { + .name = "str", + .description = "ID of an audiodev to use as a backend", + /* release done on shutdown */ + .get = get_audiodev, + .set = set_audiodev, +}; + void qdev_prop_set_drive(DeviceState *dev, const char *name, BlockBackend *value, Error **errp) { diff --git a/hw/usb/dev-audio.c b/hw/usb/dev-audio.c index 0171579..48ac992 100644 --- a/hw/usb/dev-audio.c +++ b/hw/usb/dev-audio.c @@ -662,6 +662,7 @@ static const VMStateDescription vmstate_usb_audio = { }; static Property usb_audio_properties[] = { + DEFINE_AUDIO_PROPERTIES(USBAudioState, card), DEFINE_PROP_UINT32("debug", USBAudioState, debug, 0), DEFINE_PROP_UINT32("buffer", USBAudioState, buffer, 8 * USBAUDIO_PACKET_SIZE), diff --git a/include/hw/qdev-properties.h b/include/hw/qdev-properties.h index 77538a8..edebcfa 100644 --- a/include/hw/qdev-properties.h +++ b/include/hw/qdev-properties.h @@ -26,6 +26,7 @@ extern PropertyInfo qdev_prop_vlan; extern PropertyInfo qdev_prop_pci_devfn; extern PropertyInfo qdev_prop_blocksize; extern PropertyInfo qdev_prop_pci_host_devaddr; +extern PropertyInfo qdev_prop_audiodev; extern PropertyInfo qdev_prop_arraylen; #define DEFINE_PROP(_name, _state, _field, _prop, _type) { \ @@ -163,6 +164,8 @@ extern PropertyInfo qdev_prop_arraylen; DEFINE_PROP_DEFAULT(_n, _s, _f, 0, qdev_prop_blocksize, uint16_t) #define DEFINE_PROP_PCI_HOST_DEVADDR(_n, _s, _f) \ DEFINE_PROP(_n, _s, _f, qdev_prop_pci_host_devaddr, PCIHostDeviceAddress) +#define DEFINE_PROP_AUDIODEV(_n, _s, _f) \ + DEFINE_PROP(_n, _s, _f, qdev_prop_audiodev, QEMUSoundCard) #define DEFINE_PROP_END_OF_LIST() \ {}