From patchwork Thu Jan 14 13:45:32 2016 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: 567454 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 A2152140297 for ; Fri, 15 Jan 2016 00:57:57 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=gmail.com header.i=@gmail.com header.b=wIitPzMb; dkim-atps=neutral Received: from localhost ([::1]:42624 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJiPT-0003Os-K7 for incoming@patchwork.ozlabs.org; Thu, 14 Jan 2016 08:57:55 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:35550) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJiEM-0001M7-Vy for qemu-devel@nongnu.org; Thu, 14 Jan 2016 08:46:31 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1aJiEL-0003SF-C7 for qemu-devel@nongnu.org; Thu, 14 Jan 2016 08:46:26 -0500 Received: from mail-wm0-x244.google.com ([2a00:1450:400c:c09::244]:33166) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1aJiEL-0003S8-3q for qemu-devel@nongnu.org; Thu, 14 Jan 2016 08:46:25 -0500 Received: by mail-wm0-x244.google.com with SMTP id u188so43609510wmu.0 for ; Thu, 14 Jan 2016 05:46:24 -0800 (PST) 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=Cz0HpAcEHuK0rFR11/SzUt4q60tFPVS3PDzRjkYfSyo=; b=wIitPzMb+b3qIv/hO3CEkWWDu0JJ04uHQjqdtGNZSjNWeSgdscbdgtujxbqsO5LqrQ CTvnLkaPc7dj06wYaerjdKMtrekZU9Wl/8QTPlwgghadLi+slLxVR+/2Ua17uSiSYTbD zUq39nX/mvb6gh2dfC6OOShklxNAICHdTUDTWYWKxNUII4i50f00rNBk3hVrnZ8+TrYR aJoa8MlhDzUACICMUO5JB/k1QaCfzHybTgRoRK/q5eywpfXynu34bCiBt1nn2KV+eSda Vcuzx4gPFuqky26QVVGrtHIiVZMxrdI9/vo2vQzjM+TVOp/u/i00JCJjHyvhPaheY8RI QNzQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references:mime-version:content-type:content-transfer-encoding; bh=Cz0HpAcEHuK0rFR11/SzUt4q60tFPVS3PDzRjkYfSyo=; b=V1i9VrigNueklEtyUUVBplOAWxpne8QrsMFu9hkLFav1V/TcFqoR1gfjkLy6tZ5HS3 Y+b4THjSgxNc8GbJ9TG6JJAkWRJOsiCM4oS3MEuXfnUL2GN8HPtXP/GZliYoOc7q7ZeW NRYHj+vY2GX2r77Gt8KyqXFv/7MkAjpgFMN9VH5PEavK//9qNXwMcWkW1pzdxp/HZ9qA WfiEpAdcc9YIF3MeCZNjaClbF9zBeWPxCTo0HD1RRaIydL+TZ/kvDh6B3pVYVHRsCC91 A2drQhnef5x9sl60TE3MD9EWahQA26qT7LqwpPyccu6ypkJhcOIkj71BNQAQf0SBWyV6 zW0A== X-Gm-Message-State: AG10YORyHlJ1NFnSgDkO8YGINrJdUO0/LZrebAXQlpFCZ8vAVCpNZCqHXvceYVIwU72wBw== X-Received: by 10.194.174.129 with SMTP id bs1mr2078197wjc.13.1452779184613; Thu, 14 Jan 2016 05:46:24 -0800 (PST) Received: from nullptr.home.dirty-ice.org (188-143-126-18.pool.digikabel.hu. [188.143.126.18]) by smtp.gmail.com with ESMTPSA id 79sm7398061wmo.7.2016.01.14.05.46.23 (version=TLSv1/SSLv3 cipher=OTHER); Thu, 14 Jan 2016 05:46:24 -0800 (PST) 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, 14 Jan 2016 14:45:32 +0100 Message-Id: <1cf4eded76d4a0cd67c864baebd501faf72ded04.1452776884.git.DirtY.iCE.hu@gmail.com> X-Mailer: git-send-email 2.7.0 In-Reply-To: References: MIME-Version: 1.0 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a00:1450:400c:c09::244 Cc: Michael Walle , Gerd Hoffmann Subject: [Qemu-devel] [PATCH 19/51] 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 Reviewed-by: Marc-André Lureau Signed-off-by: Kővágó, Zoltán --- 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 ca8de05..b5202f9 100644 --- a/hw/audio/adlib.c +++ b/hw/audio/adlib.c @@ -347,6 +347,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 a1c21b8..614ff19 100644 --- a/hw/audio/es1370.c +++ b/hw/audio/es1370.c @@ -1042,6 +1042,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); @@ -1056,6 +1061,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 = { @@ -1072,4 +1078,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 0e1d15f..e25a033 100644 --- a/hw/audio/gus.c +++ b/hw/audio/gus.c @@ -279,6 +279,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 163ced0..92318c7 100644 --- a/hw/audio/sb16.c +++ b/hw/audio/sb16.c @@ -1386,6 +1386,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 921e799..9dd1a7b 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 9a60569..deb9032 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, 32 * 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() \ {}