[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v2 25/49] audio: add audiodev properties to frontend
From: |
Kővágó, Zoltán |
Subject: |
[Qemu-devel] [PATCH v2 25/49] audio: add audiodev properties to frontends |
Date: |
Fri, 21 Aug 2015 17:37:21 +0200 |
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 <address@hidden>
Signed-off-by: Kővágó, Zoltán <address@hidden>
---
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() \
{}
--
2.5.0
- [Qemu-devel] [PATCH v2 13/49] alsaaudio: port to -audiodev config, (continued)
- [Qemu-devel] [PATCH v2 13/49] alsaaudio: port to -audiodev config, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 10/49] audio: use qapi AudioFormat instead of audfmt_e, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 20/49] spiceaudio: port to -audiodev config, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 17/49] ossaudio: port to -audiodev config, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 19/49] sdlaudio: port to -audiodev config, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 12/49] audio: -audiodev command line option basic implementation, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 21/49] wavaudio: port to -audiodev config, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 22/49] audio: -audiodev command line option: cleanup, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 23/49] audio: reduce glob_audio_state usage, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 18/49] paaudio: port to -audiodev config, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 25/49] audio: add audiodev properties to frontends,
Kővágó, Zoltán <=
- [Qemu-devel] [PATCH v2 24/49] audio: basic support for multi backend audio, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 29/49] paaudio: properly disconnect streams in fini_*, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 27/49] paaudio: do not create multiple connections to the same server, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 28/49] paaudio: do not move stream when sink/source name is specified, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 31/49] audio: do not run each backend in audio_run, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 32/49] paaudio: fix playback glitches, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 33/49] audio: remove read and write pcm_ops, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 26/49] audio: audiodev= parameters no longer optional when -audiodev present, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 30/49] audio: remove audio_MIN, audio_MAX, Kővágó, Zoltán, 2015/08/21
- [Qemu-devel] [PATCH v2 35/49] audio: api for mixeng code free backends, Kővágó, Zoltán, 2015/08/21