|
@@ -11,6 +11,7 @@
|
|
*/
|
|
*/
|
|
|
|
|
|
#include "qemu/osdep.h"
|
|
#include "qemu/osdep.h"
|
|
|
|
+#include "audio/audio.h"
|
|
#include "net/net.h"
|
|
#include "net/net.h"
|
|
#include "hw/qdev-properties.h"
|
|
#include "hw/qdev-properties.h"
|
|
#include "qapi/error.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,
|
|
void qdev_prop_set_drive(DeviceState *dev, const char *name,
|
|
BlockBackend *value, Error **errp)
|
|
BlockBackend *value, Error **errp)
|
|
{
|
|
{
|