37
#include "qemu/log.h"
38
#include "qemu/module.h"
39
#include "qemu/help_option.h"
40
+#include "qom/object.h"
41
#include "system/system.h"
42
#include "system/replay.h"
43
#include "system/runstate.h"
385
/*
386
* Capture
387
*/
387
-static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioBackend *s,
388
+static CaptureVoiceOut *audio_pcm_capture_find_specific(AudioMixengBackend *s,
389
struct audsettings *as)
390
{
391
CaptureVoiceOut *cap;
465
466
static int audio_attach_capture (HWVoiceOut *hw)
467
{
467
- AudioBackend *s = hw->s;
468
+ AudioMixengBackend *s = hw->s;
469
CaptureVoiceOut *cap;
470
471
audio_detach_capture (hw);
803
/*
804
* Timer
805
*/
805
-static int audio_is_timer_needed(AudioBackend *s)
806
+static int audio_is_timer_needed(AudioMixengBackend *s)
807
{
808
HWVoiceIn *hwi = NULL;
809
HWVoiceOut *hwo = NULL;
821
return 0;
822
}
823
823
-static void audio_reset_timer(AudioBackend *s)
824
+static void audio_reset_timer(AudioMixengBackend *s)
825
{
826
if (audio_is_timer_needed(s)) {
827
timer_mod_anticipate_ns(s->ts,
843
static void audio_timer (void *opaque)
844
{
845
int64_t now, diff;
845
- AudioBackend *s = opaque;
846
+ AudioMixengBackend *s = opaque;
847
848
now = qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
849
diff = now - s->timer_last;
926
927
hw = sw->hw;
928
if (sw->active != on) {
928
- AudioBackend *s = sw->s;
929
+ AudioMixengBackend *s = sw->s;
930
SWVoiceOut *temp_sw;
931
SWVoiceCap *sc;
932
974
975
hw = sw->hw;
976
if (sw->active != on) {
976
- AudioBackend *s = sw->s;
977
+ AudioMixengBackend *s = sw->s;
978
SWVoiceIn *temp_sw;
979
980
if (on) {
1142
return clipped;
1143
}
1144
1144
-static void audio_run_out(AudioBackend *s)
1145
+static void audio_run_out(AudioMixengBackend *s)
1146
{
1147
HWVoiceOut *hw = NULL;
1148
SWVoiceOut *sw;
1295
return conv;
1296
}
1297
1297
-static void audio_run_in(AudioBackend *s)
1298
+static void audio_run_in(AudioMixengBackend *s)
1299
{
1300
HWVoiceIn *hw = NULL;
1301
1342
}
1343
}
1344
1344
-static void audio_run_capture(AudioBackend *s)
1345
+static void audio_run_capture(AudioMixengBackend *s)
1346
{
1347
CaptureVoiceOut *cap;
1348
1389
}
1390
}
1391
1391
-void audio_run(AudioBackend *s, const char *msg)
1392
+void audio_run(AudioMixengBackend *s, const char *msg)
1393
{
1394
audio_run_out(s);
1395
audio_run_in(s);
1562
return total;
1563
}
1564
1564
-static bool audio_driver_init(AudioBackend *s, struct audio_driver *drv,
1565
- Audiodev *dev, Error **errp)
1565
+static bool audio_driver_do_init(AudioMixengBackend *s, struct audio_driver *drv,
1566
+ Audiodev *dev, Error **errp)
1567
{
1568
s->drv_opaque = drv->init(dev, errp);
1569
if (!s->drv_opaque) {
1595
static void audio_vm_change_state_handler (void *opaque, bool running,
1596
RunState state)
1597
{
1597
- AudioBackend *s = opaque;
1598
+ AudioMixengBackend *s = opaque;
1599
HWVoiceOut *hwo = NULL;
1600
HWVoiceIn *hwi = NULL;
1601
1617
1618
static void audio_be_init(Object *obj)
1619
{
1619
- AudioBackend *s = AUDIO_BACKEND(obj);
1620
+}
1621
+
1622
+static void audio_be_finalize(Object *obj)
1623
+{
1624
+}
1625
+
1626
+static const char *audio_mixeng_backend_get_id(AudioBackend *be)
1627
+{
1628
+ return AUDIO_MIXENG_BACKEND(be)->dev->id;
1629
+}
1630
+
1631
+#ifdef CONFIG_GIO
1632
+static bool audio_mixeng_backend_set_dbus_server(AudioBackend *be,
1633
+ GDBusObjectManagerServer *manager,
1634
+ bool p2p,
1635
+ Error **errp)
1636
+{
1637
+ AudioMixengBackend *d = AUDIO_MIXENG_BACKEND(be);
1638
+
1639
+ if (!d->drv->set_dbus_server) {
1640
+ return false;
1641
+ }
1642
+
1643
+ return d->drv->set_dbus_server(be, manager, p2p, errp);
1644
+}
1645
+
1646
+#endif
1647
+
1648
+static void audio_mixeng_backend_class_init(ObjectClass *klass, const void *data)
1649
+{
1650
+ AudioBackendClass *be = AUDIO_BACKEND_CLASS(klass);
1651
+
1652
+ be->get_id = audio_mixeng_backend_get_id;
1653
+#ifdef CONFIG_GIO
1654
+ be->set_dbus_server = audio_mixeng_backend_set_dbus_server;
1655
+#endif
1656
+}
1657
+
1658
+static void audio_mixeng_backend_init(Object *obj)
1659
+{
1660
+ AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(obj);
1661
1662
QLIST_INIT(&s->hw_head_out);
1663
QLIST_INIT(&s->hw_head_in);
1670
vmstate_register_any(NULL, &vmstate_audio, s);
1671
}
1672
1632
-static void audio_be_finalize(Object *obj)
1673
+static void audio_mixeng_backend_finalize(Object *obj)
1674
{
1634
- AudioBackend *s = AUDIO_BACKEND(obj);
1675
+ AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(obj);
1676
HWVoiceOut *hwo, *hwon;
1677
HWVoiceIn *hwi, *hwin;
1678
1788
{
1789
int done = 0;
1790
const char *drvname;
1750
- AudioBackend *s;
1791
+ AudioMixengBackend *s;
1792
struct audio_driver *driver;
1793
1753
- s = AUDIO_BACKEND(object_new(TYPE_AUDIO_BACKEND));
1794
+ s = AUDIO_MIXENG_BACKEND(object_new(TYPE_AUDIO_MIXENG_BACKEND));
1795
1796
if (dev) {
1797
/* -audiodev option */
1799
drvname = AudiodevDriver_str(dev->driver);
1800
driver = audio_driver_lookup(drvname);
1801
if (driver) {
1761
- done = audio_driver_init(s, driver, dev, errp);
1802
+ done = audio_driver_do_init(s, driver, dev, errp);
1803
} else {
1804
error_setg(errp, "Unknown audio driver `%s'", drvname);
1805
}
1819
g_free(e);
1820
drvname = AudiodevDriver_str(dev->driver);
1821
driver = audio_driver_lookup(drvname);
1781
- if (audio_driver_init(s, driver, dev, NULL)) {
1822
+ if (audio_driver_do_init(s, driver, dev, NULL)) {
1823
break;
1824
}
1825
qapi_free_Audiodev(dev);
1831
goto out;
1832
}
1833
object_unref(s);
1793
- return s;
1834
+ return AUDIO_BACKEND(s);
1835
1836
out:
1837
object_unref(s);
1870
static struct audio_pcm_ops capture_pcm_ops;
1871
1872
CaptureVoiceOut *AUD_add_capture(
1832
- AudioBackend *s,
1873
+ AudioBackend *be,
1874
struct audsettings *as,
1875
struct audio_capture_ops *ops,
1876
void *cb_opaque
1877
)
1878
{
1879
+ AudioMixengBackend *s = AUDIO_MIXENG_BACKEND(be);
1880
CaptureVoiceOut *cap;
1881
struct capture_callback *cb;
1882
2267
}
2268
2269
#ifdef CONFIG_GIO
2270
+bool audio_be_can_set_dbus_server(AudioBackend *be)
2271
+{
2272
+ /*
2273
+ * TODO:
2274
+ * AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
2275
+ * return klass->set_dbus_server != NULL;
2276
+ */
2277
+ return AUDIO_MIXENG_BACKEND(be)->drv->set_dbus_server != NULL;
2278
+}
2279
+
2280
bool audio_be_set_dbus_server(AudioBackend *be,
2281
GDBusObjectManagerServer *server,
2282
bool p2p,
2283
Error **errp)
2284
{
2233
- assert(be != NULL);
2285
+ AudioBackendClass *klass = AUDIO_BACKEND_GET_CLASS(be);
2286
2235
- if (!be->drv->set_dbus_server) {
2236
- error_setg(errp, "Audiodev '%s' is not compatible with DBus", be->dev->id);
2287
+ if (!audio_be_can_set_dbus_server(be)) {
2288
+ error_setg(errp, "Audiodev '%s' is not compatible with DBus",
2289
+ audio_be_get_id(be));
2290
return false;
2291
}
2292
2240
- return be->drv->set_dbus_server(be, server, p2p, errp);
2293
+ return klass->set_dbus_server(be, server, p2p, errp);
2294
}
2295
#endif
2296
2297
const char *audio_be_get_id(AudioBackend *be)
2298
{
2299
if (be) {
2247
- assert(be->dev);
2248
- return be->dev->id;
2300
+ return AUDIO_BACKEND_GET_CLASS(be)->get_id(be);
2301
} else {
2302
return "";
2303
}
2372
.instance_size = sizeof(AudioBackend),
2373
.instance_init = audio_be_init,
2374
.instance_finalize = audio_be_finalize,
2323
- .abstract = false, /* TODO: subclass drivers and make it abstract */
2375
+ .abstract = true,
2376
.class_size = sizeof(AudioBackendClass),
2377
};
2378
2379
+static const TypeInfo audio_mixeng_backend_info = {
2380
+ .name = TYPE_AUDIO_MIXENG_BACKEND,
2381
+ .parent = TYPE_AUDIO_BACKEND,
2382
+ .instance_size = sizeof(AudioMixengBackend),
2383
+ .instance_init = audio_mixeng_backend_init,
2384
+ .instance_finalize = audio_mixeng_backend_finalize,
2385
+ .class_size = sizeof(AudioMixengBackendClass),
2386
+ .class_init = audio_mixeng_backend_class_init,
2387
+};
2388
+
2389
static void register_types(void)
2390
{
2391
type_register_static(&audio_be_info);
2392
+ type_register_static(&audio_mixeng_backend_info);
2393
}
2394
2395
type_init(register_types);