mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-12-11 16:00:50 -07:00
audio: add audiodev properties to frontends
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 <DirtY.iCE.hu@gmail.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com> Message-id: d64db52dda2d0e9d97bc5ab1dd9adf724280fea1.1566168923.git.DirtY.iCE.hu@gmail.com Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
parent
f0b9f36d71
commit
88e47b9a45
15 changed files with 91 additions and 1 deletions
|
|
@ -11,6 +11,7 @@
|
|||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "audio/audio.h"
|
||||
#include "net/net.h"
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "qapi/error.h"
|
||||
|
|
@ -353,6 +354,62 @@ const PropertyInfo qdev_prop_netdev = {
|
|||
};
|
||||
|
||||
|
||||
/* --- audiodev --- */
|
||||
static void get_audiodev(Object *obj, Visitor *v, const char* name,
|
||||
void *opaque, 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, name, &p, errp);
|
||||
g_free(p);
|
||||
}
|
||||
|
||||
static void set_audiodev(Object *obj, Visitor *v, const char* name,
|
||||
void *opaque, 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, name, &str, &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);
|
||||
}
|
||||
|
||||
const 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)
|
||||
{
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue