audio: remove audio_driver
Move all fields from audio_driver directly into AudioMixengBackendClass, eliminating an unnecessary extra struct. Drivers now set class fields directly in class_init instead of creating a static audio_driver instance. Signed-off-by: Marc-André Lureau <marcandre.lureau@redhat.com> Reviewed-by: Mark Cave-Ayland <mark.caveayland@nutanix.com> Reviewed-by: Akihiko Odaki <odaki@rsg.ci.i.u-tokyo.ac.jp>
Marc-André Lureau committed
Jan 17, 2026 at 00:09 UTC
cc66d140a9e70d8ef46a3dd91dd7a87c9778374b
16 files changed
+149
-230
audio/alsaaudio.c
+6
-11
@@ -46,7 +46,6 @@ struct AudioALSA {
46
AudioMixengBackend parent_obj;
47
};
48
49
-static struct audio_driver alsa_audio_driver;
49
50
struct pollhlp {
51
snd_pcm_t *handle;
@@ -938,15 +937,6 @@ static struct audio_pcm_ops alsa_pcm_ops = {
937
.enable_in = alsa_enable_in,
938
};
939
941
-static struct audio_driver alsa_audio_driver = {
942
- .name = "alsa",
943
- .pcm_ops = &alsa_pcm_ops,
944
- .max_voices_out = INT_MAX,
945
- .max_voices_in = INT_MAX,
946
- .voice_size_out = sizeof (ALSAVoiceOut),
947
- .voice_size_in = sizeof (ALSAVoiceIn)
948
-};
949
-
940
static void audio_alsa_class_init(ObjectClass *klass, const void *data)
941
{
942
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -955,7 +945,12 @@ static void audio_alsa_class_init(ObjectClass *klass, const void *data)
945
audio_alsa_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
946
947
b->realize = audio_alsa_realize;
958
- k->driver = &alsa_audio_driver;
948
+ k->name = "alsa";
949
+ k->pcm_ops = &alsa_pcm_ops;
950
+ k->max_voices_out = INT_MAX;
951
+ k->max_voices_in = INT_MAX;
952
+ k->voice_size_out = sizeof(ALSAVoiceOut);
953
+ k->voice_size_in = sizeof(ALSAVoiceIn);
954
}
955
956
static const TypeInfo audio_types[] = {
audio/audio-mixeng-be.c
+9
-11
@@ -1518,21 +1518,20 @@ static bool audio_mixeng_backend_realize(AudioBackend *abe,
1518
Audiodev *dev, Error **errp)
1519
{
1520
AudioMixengBackend *be = AUDIO_MIXENG_BACKEND(abe);
1521
- audio_driver *drv = AUDIO_MIXENG_BACKEND_GET_CLASS(be)->driver;
1521
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_GET_CLASS(be);
1522
1523
be->dev = dev;
1524
- if (!drv->pcm_ops->get_buffer_in) {
1525
- drv->pcm_ops->get_buffer_in = audio_generic_get_buffer_in;
1526
- drv->pcm_ops->put_buffer_in = audio_generic_put_buffer_in;
1524
+ if (!k->pcm_ops->get_buffer_in) {
1525
+ k->pcm_ops->get_buffer_in = audio_generic_get_buffer_in;
1526
+ k->pcm_ops->put_buffer_in = audio_generic_put_buffer_in;
1527
}
1528
- if (!drv->pcm_ops->get_buffer_out) {
1529
- drv->pcm_ops->get_buffer_out = audio_generic_get_buffer_out;
1530
- drv->pcm_ops->put_buffer_out = audio_generic_put_buffer_out;
1528
+ if (!k->pcm_ops->get_buffer_out) {
1529
+ k->pcm_ops->get_buffer_out = audio_generic_get_buffer_out;
1530
+ k->pcm_ops->put_buffer_out = audio_generic_put_buffer_out;
1531
}
1532
1533
- audio_init_nb_voices_out(be, drv, 1);
1534
- audio_init_nb_voices_in(be, drv, 0);
1535
- be->drv = drv;
1533
+ audio_init_nb_voices_out(be, k, 1);
1534
+ audio_init_nb_voices_in(be, k, 0);
1535
1536
if (be->dev->timer_period <= 0) {
1537
be->period_ticks = 1;
@@ -1658,7 +1657,6 @@ static void audio_mixeng_backend_finalize(Object *obj)
1657
QLIST_REMOVE(hwi, entries);
1658
}
1659
1661
- s->drv = NULL;
1660
if (s->dev) {
1661
qapi_free_Audiodev(s->dev);
1662
s->dev = NULL;
audio/audio_int.h
+6
-12
@@ -136,16 +136,6 @@ struct SWVoiceIn {
136
QLIST_ENTRY (SWVoiceIn) entries;
137
};
138
139
-typedef struct audio_driver audio_driver;
140
-struct audio_driver {
141
- const char *name;
142
- struct audio_pcm_ops *pcm_ops;
143
- int max_voices_out;
144
- int max_voices_in;
145
- size_t voice_size_out;
146
- size_t voice_size_in;
147
-};
148
-
139
struct audio_pcm_ops {
140
int (*init_out)(HWVoiceOut *hw, audsettings *as);
141
void (*fini_out)(HWVoiceOut *hw);
@@ -229,13 +219,17 @@ struct SWVoiceCap {
219
struct AudioMixengBackendClass {
220
AudioBackendClass parent_class;
221
232
- audio_driver *driver;
222
+ const char *name;
223
+ struct audio_pcm_ops *pcm_ops;
224
+ int max_voices_out;
225
+ int max_voices_in;
226
+ size_t voice_size_out;
227
+ size_t voice_size_in;
228
};
229
230
struct AudioMixengBackend {
231
AudioBackend parent_obj;
232
238
- struct audio_driver *drv;
233
Audiodev *dev;
234
235
QEMUTimer *ts;
audio/audio_template.h
+27
-31
@@ -37,41 +37,42 @@
37
#endif
38
39
static void glue(audio_init_nb_voices_, TYPE)(AudioMixengBackend *s,
40
- struct audio_driver *drv, int min_voices)
40
+ AudioMixengBackendClass *k,
41
+ int min_voices)
42
{
42
- int max_voices = glue (drv->max_voices_, TYPE);
43
- size_t voice_size = glue(drv->voice_size_, TYPE);
43
+ int max_voices = glue(k->max_voices_, TYPE);
44
+ size_t voice_size = glue(k->voice_size_, TYPE);
45
45
- glue (s->nb_hw_voices_, TYPE) = glue(audio_get_pdo_, TYPE)(s->dev)->voices;
46
- if (glue (s->nb_hw_voices_, TYPE) > max_voices) {
46
+ glue(s->nb_hw_voices_, TYPE) = glue(audio_get_pdo_, TYPE)(s->dev)->voices;
47
+ if (glue(s->nb_hw_voices_, TYPE) > max_voices) {
48
if (!max_voices) {
49
#ifdef DAC
49
- dolog ("Driver `%s' does not support " NAME "\n", drv->name);
50
+ dolog("Driver `%s' does not support " NAME "\n", k->name);
51
#endif
52
} else {
52
- dolog ("Driver `%s' does not support %d " NAME " voices, max %d\n",
53
- drv->name,
54
- glue (s->nb_hw_voices_, TYPE),
53
+ dolog("Driver `%s' does not support %d " NAME " voices, max %d\n",
54
+ k->name,
55
+ glue(s->nb_hw_voices_, TYPE),
56
max_voices);
57
}
57
- glue (s->nb_hw_voices_, TYPE) = max_voices;
58
+ glue(s->nb_hw_voices_, TYPE) = max_voices;
59
}
60
60
- if (glue (s->nb_hw_voices_, TYPE) < min_voices) {
61
- dolog ("Bogus number of " NAME " voices %d, setting to %d\n",
62
- glue (s->nb_hw_voices_, TYPE),
61
+ if (glue(s->nb_hw_voices_, TYPE) < min_voices) {
62
+ dolog("Bogus number of " NAME " voices %d, setting to %d\n",
63
+ glue(s->nb_hw_voices_, TYPE),
64
min_voices);
65
}
66
67
if (audio_bug(__func__, !voice_size && max_voices)) {
67
- dolog ("drv=`%s' voice_size=0 max_voices=%d\n",
68
- drv->name, max_voices);
69
- glue (s->nb_hw_voices_, TYPE) = 0;
68
+ dolog("drv=`%s' voice_size=0 max_voices=%d\n",
69
+ k->name, max_voices);
70
+ glue(s->nb_hw_voices_, TYPE) = 0;
71
}
72
73
if (audio_bug(__func__, voice_size && !max_voices)) {
74
dolog("drv=`%s' voice_size=%zu max_voices=0\n",
74
- drv->name, voice_size);
75
+ k->name, voice_size);
76
}
77
}
78
@@ -267,29 +268,24 @@ static HW *glue(audio_pcm_hw_add_new_, TYPE)(AudioMixengBackend *s,
268
struct audsettings *as)
269
{
270
HW *hw;
270
- struct audio_driver *drv = s->drv;
271
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_GET_CLASS(s);
272
272
- if (!glue (s->nb_hw_voices_, TYPE)) {
273
+ if (!glue(s->nb_hw_voices_, TYPE)) {
274
return NULL;
275
}
276
276
- if (audio_bug(__func__, !drv)) {
277
- dolog ("No host audio driver\n");
278
- return NULL;
279
- }
280
-
281
- if (audio_bug(__func__, !drv->pcm_ops)) {
282
- dolog ("Host audio driver without pcm_ops\n");
277
+ if (audio_bug(__func__, !k->pcm_ops)) {
278
+ dolog("No host audio driver or missing pcm_ops\n");
279
return NULL;
280
}
281
282
/*
287
- * Since glue(s->nb_hw_voices_, TYPE) is != 0, glue(drv->voice_size_, TYPE)
283
+ * Since glue(s->nb_hw_voices_, TYPE) is != 0, glue(k->voice_size_, TYPE)
284
* is guaranteed to be != 0. See the audio_init_nb_voices_* functions.
285
*/
290
- hw = g_malloc0(glue(drv->voice_size_, TYPE));
286
+ hw = g_malloc0(glue(k->voice_size_, TYPE));
287
hw->s = AUDIO_MIXENG_BACKEND(object_ref(s));
292
- hw->pcm_ops = drv->pcm_ops;
288
+ hw->pcm_ops = k->pcm_ops;
289
290
QLIST_INIT (&hw->sw_head);
291
#ifdef DAC
@@ -517,8 +513,8 @@ static SW *glue(audio_mixeng_backend_open_, TYPE) (
513
goto fail;
514
}
515
520
- if (audio_bug(__func__, !s->drv)) {
521
- dolog ("Can not open `%s' (no host audio driver)\n", name);
516
+ if (audio_bug(__func__, !AUDIO_MIXENG_BACKEND_GET_CLASS(s)->pcm_ops)) {
517
+ dolog("Can not open `%s' (no host audio driver)\n", name);
518
goto fail;
519
}
520
audio/coreaudio.m
+11
-17
@@ -41,15 +41,6 @@ struct AudioCoreaudio {
41
AudioMixengBackend parent_obj;
42
};
43
44
-static struct audio_driver coreaudio_audio_driver;
45
-
46
-static void audio_coreaudio_class_init(ObjectClass *klass, const void *data)
47
-{
48
- AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
49
-
50
- k->driver = &coreaudio_audio_driver;
51
-}
52
-
44
typedef struct coreaudioVoiceOut {
45
HWVoiceOut hw;
46
pthread_mutex_t buf_mutex;
@@ -669,14 +660,17 @@ static struct audio_pcm_ops coreaudio_pcm_ops = {
660
.enable_out = coreaudio_enable_out
661
};
662
672
-static struct audio_driver coreaudio_audio_driver = {
673
- .name = "coreaudio",
674
- .pcm_ops = &coreaudio_pcm_ops,
675
- .max_voices_out = 1,
676
- .max_voices_in = 0,
677
- .voice_size_out = sizeof (coreaudioVoiceOut),
678
- .voice_size_in = 0
679
-};
663
+static void audio_coreaudio_class_init(ObjectClass *klass, const void *data)
664
+{
665
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
666
+
667
+ k->name = "coreaudio";
668
+ k->pcm_ops = &coreaudio_pcm_ops;
669
+ k->max_voices_out = 1;
670
+ k->max_voices_in = 0;
671
+ k->voice_size_out = sizeof(coreaudioVoiceOut);
672
+ k->voice_size_in = 0;
673
+}
674
675
static const TypeInfo audio_types[] = {
676
{
audio/dbusaudio.c
+6
-11
@@ -61,7 +61,6 @@ struct AudioDbus {
61
GHashTable *in_listeners;
62
};
63
64
-static struct audio_driver dbus_audio_driver;
64
65
typedef struct DBusVoiceOut {
66
HWVoiceOut hw;
@@ -709,15 +708,6 @@ static struct audio_pcm_ops dbus_pcm_ops = {
708
.volume_in = dbus_volume_in,
709
};
710
712
-static struct audio_driver dbus_audio_driver = {
713
- .name = "dbus",
714
- .pcm_ops = &dbus_pcm_ops,
715
- .max_voices_out = INT_MAX,
716
- .max_voices_in = INT_MAX,
717
- .voice_size_out = sizeof(DBusVoiceOut),
718
- .voice_size_in = sizeof(DBusVoiceIn)
719
-};
720
-
711
static void audio_dbus_class_init(ObjectClass *klass, const void *data)
712
{
713
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -727,7 +717,12 @@ static void audio_dbus_class_init(ObjectClass *klass, const void *data)
717
718
b->realize = audio_dbus_realize;
719
b->set_dbus_server = dbus_audio_set_server;
730
- k->driver = &dbus_audio_driver;
720
+ k->name = "dbus";
721
+ k->pcm_ops = &dbus_pcm_ops;
722
+ k->max_voices_out = INT_MAX;
723
+ k->max_voices_in = INT_MAX;
724
+ k->voice_size_out = sizeof(DBusVoiceOut);
725
+ k->voice_size_in = sizeof(DBusVoiceIn);
726
}
727
728
static const TypeInfo audio_types[] = {
audio/dsoundaudio.c
+6
-11
@@ -55,7 +55,6 @@ struct AudioDsound {
55
struct audsettings settings;
56
};
57
58
-static struct audio_driver dsound_audio_driver;
58
59
/* #define DEBUG_DSOUND */
60
@@ -685,15 +684,6 @@ static struct audio_pcm_ops dsound_pcm_ops = {
684
.enable_in = dsound_enable_in,
685
};
686
688
-static struct audio_driver dsound_audio_driver = {
689
- .name = "dsound",
690
- .pcm_ops = &dsound_pcm_ops,
691
- .max_voices_out = INT_MAX,
692
- .max_voices_in = 1,
693
- .voice_size_out = sizeof (DSoundVoiceOut),
694
- .voice_size_in = sizeof (DSoundVoiceIn)
695
-};
696
-
687
static void audio_dsound_class_init(ObjectClass *klass, const void *data)
688
{
689
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -702,7 +692,12 @@ static void audio_dsound_class_init(ObjectClass *klass, const void *data)
692
audio_dsound_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
693
694
b->realize = audio_dsound_realize;
705
- k->driver = &dsound_audio_driver;
695
+ k->name = "dsound";
696
+ k->pcm_ops = &dsound_pcm_ops;
697
+ k->max_voices_out = INT_MAX;
698
+ k->max_voices_in = 1;
699
+ k->voice_size_out = sizeof(DSoundVoiceOut);
700
+ k->voice_size_in = sizeof(DSoundVoiceIn);
701
}
702
703
static const TypeInfo audio_types[] = {
audio/jackaudio.c
+6
-11
@@ -42,7 +42,6 @@ struct AudioJack {
42
AudioMixengBackend parent_obj;
43
};
44
45
-static struct audio_driver jack_driver;
45
46
struct QJack;
47
@@ -668,15 +667,6 @@ static struct audio_pcm_ops jack_pcm_ops = {
667
.enable_in = qjack_enable_in
668
};
669
671
-static struct audio_driver jack_driver = {
672
- .name = "jack",
673
- .pcm_ops = &jack_pcm_ops,
674
- .max_voices_out = INT_MAX,
675
- .max_voices_in = INT_MAX,
676
- .voice_size_out = sizeof(QJackOut),
677
- .voice_size_in = sizeof(QJackIn)
678
-};
679
-
670
static void qjack_error(const char *msg)
671
{
672
dolog("E: %s\n", msg);
@@ -691,7 +681,12 @@ static void audio_jack_class_init(ObjectClass *klass, const void *data)
681
{
682
AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
683
694
- k->driver = &jack_driver;
684
+ k->name = "jack";
685
+ k->pcm_ops = &jack_pcm_ops;
686
+ k->max_voices_out = INT_MAX;
687
+ k->max_voices_in = INT_MAX;
688
+ k->voice_size_out = sizeof(QJackOut);
689
+ k->voice_size_in = sizeof(QJackIn);
690
}
691
692
static const TypeInfo audio_types[] = {
audio/noaudio.c
+11
-17
@@ -37,15 +37,6 @@ struct AudioNone {
37
AudioMixengBackend parent_obj;
38
};
39
40
-static struct audio_driver no_audio_driver;
41
-
42
-static void audio_none_class_init(ObjectClass *klass, const void *data)
43
-{
44
- AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
45
-
46
- k->driver = &no_audio_driver;
47
-}
48
-
40
typedef struct NoVoiceOut {
41
HWVoiceOut hw;
42
RateCtl rate;
@@ -134,14 +125,17 @@ static struct audio_pcm_ops no_pcm_ops = {
125
.enable_in = no_enable_in
126
};
127
137
-static struct audio_driver no_audio_driver = {
138
- .name = "none",
139
- .pcm_ops = &no_pcm_ops,
140
- .max_voices_out = INT_MAX,
141
- .max_voices_in = INT_MAX,
142
- .voice_size_out = sizeof (NoVoiceOut),
143
- .voice_size_in = sizeof (NoVoiceIn)
144
-};
128
+static void audio_none_class_init(ObjectClass *klass, const void *data)
129
+{
130
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
131
+
132
+ k->name = "none";
133
+ k->pcm_ops = &no_pcm_ops;
134
+ k->max_voices_out = INT_MAX;
135
+ k->max_voices_in = INT_MAX;
136
+ k->voice_size_out = sizeof(NoVoiceOut);
137
+ k->voice_size_in = sizeof(NoVoiceIn);
138
+}
139
140
static const TypeInfo audio_types[] = {
141
{
audio/ossaudio.c
+6
-11
@@ -46,7 +46,6 @@ struct AudioOss {
46
AudioMixengBackend parent_obj;
47
};
48
49
-static struct audio_driver oss_audio_driver;
49
50
#if defined OSS_GETVERSION && defined SNDCTL_DSP_POLICY
51
#define USE_DSP_POLICY
@@ -773,15 +772,6 @@ static struct audio_pcm_ops oss_pcm_ops = {
772
.enable_in = oss_enable_in
773
};
774
776
-static struct audio_driver oss_audio_driver = {
777
- .name = "oss",
778
- .pcm_ops = &oss_pcm_ops,
779
- .max_voices_out = INT_MAX,
780
- .max_voices_in = INT_MAX,
781
- .voice_size_out = sizeof (OSSVoiceOut),
782
- .voice_size_in = sizeof (OSSVoiceIn)
783
-};
784
-
775
static void audio_oss_class_init(ObjectClass *klass, const void *data)
776
{
777
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -790,7 +780,12 @@ static void audio_oss_class_init(ObjectClass *klass, const void *data)
780
audio_oss_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
781
782
b->realize = audio_oss_realize;
793
- k->driver = &oss_audio_driver;
783
+ k->name = "oss";
784
+ k->pcm_ops = &oss_pcm_ops;
785
+ k->max_voices_out = INT_MAX;
786
+ k->max_voices_in = INT_MAX;
787
+ k->voice_size_out = sizeof(OSSVoiceOut);
788
+ k->voice_size_in = sizeof(OSSVoiceIn);
789
}
790
791
static const TypeInfo audio_types[] = {
audio/paaudio.c
+6
-11
@@ -16,7 +16,6 @@ OBJECT_DECLARE_SIMPLE_TYPE(AudioPa, AUDIO_PA)
16
17
static AudioBackendClass *audio_pa_parent_class;
18
19
-static struct audio_driver pa_audio_driver;
19
20
typedef struct PAConnection {
21
char *server;
@@ -931,15 +930,6 @@ static struct audio_pcm_ops qpa_pcm_ops = {
930
.volume_in = qpa_volume_in
931
};
932
934
-static struct audio_driver pa_audio_driver = {
935
- .name = "pa",
936
- .pcm_ops = &qpa_pcm_ops,
937
- .max_voices_out = INT_MAX,
938
- .max_voices_in = INT_MAX,
939
- .voice_size_out = sizeof (PAVoiceOut),
940
- .voice_size_in = sizeof (PAVoiceIn),
941
-};
942
-
933
static void audio_pa_class_init(ObjectClass *klass, const void *data)
934
{
935
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -948,7 +938,12 @@ static void audio_pa_class_init(ObjectClass *klass, const void *data)
938
audio_pa_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
939
940
b->realize = audio_pa_realize;
951
- k->driver = &pa_audio_driver;
941
+ k->name = "pa";
942
+ k->pcm_ops = &qpa_pcm_ops;
943
+ k->max_voices_out = INT_MAX;
944
+ k->max_voices_in = INT_MAX;
945
+ k->voice_size_out = sizeof(PAVoiceOut);
946
+ k->voice_size_in = sizeof(PAVoiceIn);
947
}
948
949
static const TypeInfo audio_types[] = {
audio/pwaudio.c
+6
-11
@@ -44,7 +44,6 @@ struct AudioPw {
44
int last_seq, pending_seq, error;
45
};
46
47
-static struct audio_driver pw_audio_driver;
47
48
typedef struct pwvolume {
49
uint32_t channels;
@@ -840,15 +839,6 @@ static struct audio_pcm_ops qpw_pcm_ops = {
839
.enable_in = qpw_enable_in
840
};
841
843
-static struct audio_driver pw_audio_driver = {
844
- .name = "pipewire",
845
- .pcm_ops = &qpw_pcm_ops,
846
- .max_voices_out = INT_MAX,
847
- .max_voices_in = INT_MAX,
848
- .voice_size_out = sizeof(PWVoiceOut),
849
- .voice_size_in = sizeof(PWVoiceIn),
850
-};
851
-
842
static void audio_pw_class_init(ObjectClass *klass, const void *data)
843
{
844
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -857,7 +847,12 @@ static void audio_pw_class_init(ObjectClass *klass, const void *data)
847
audio_pw_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
848
849
b->realize = audio_pw_realize;
860
- k->driver = &pw_audio_driver;
850
+ k->name = "pipewire";
851
+ k->pcm_ops = &qpw_pcm_ops;
852
+ k->max_voices_out = INT_MAX;
853
+ k->max_voices_in = INT_MAX;
854
+ k->voice_size_out = sizeof(PWVoiceOut);
855
+ k->voice_size_in = sizeof(PWVoiceIn);
856
}
857
858
static const TypeInfo audio_types[] = {
audio/sdlaudio.c
+6
-11
@@ -50,7 +50,6 @@ struct AudioSdl {
50
AudioMixengBackend parent_obj;
51
};
52
53
-static struct audio_driver sdl_audio_driver;
53
54
typedef struct SDLVoiceOut {
55
HWVoiceOut hw;
@@ -492,15 +491,6 @@ static struct audio_pcm_ops sdl_pcm_ops = {
491
.enable_in = sdl_enable_in,
492
};
493
495
-static struct audio_driver sdl_audio_driver = {
496
- .name = "sdl",
497
- .pcm_ops = &sdl_pcm_ops,
498
- .max_voices_out = INT_MAX,
499
- .max_voices_in = INT_MAX,
500
- .voice_size_out = sizeof(SDLVoiceOut),
501
- .voice_size_in = sizeof(SDLVoiceIn),
502
-};
503
-
494
static void audio_sdl_class_init(ObjectClass *klass, const void *data)
495
{
496
AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
@@ -509,7 +499,12 @@ static void audio_sdl_class_init(ObjectClass *klass, const void *data)
499
audio_sdl_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
500
501
b->realize = audio_sdl_realize;
512
- k->driver = &sdl_audio_driver;
502
+ k->name = "sdl";
503
+ k->pcm_ops = &sdl_pcm_ops;
504
+ k->max_voices_out = INT_MAX;
505
+ k->max_voices_in = INT_MAX;
506
+ k->voice_size_out = sizeof(SDLVoiceOut);
507
+ k->voice_size_in = sizeof(SDLVoiceIn);
508
}
509
510
static const TypeInfo audio_types[] = {
audio/sndioaudio.c
+11
-16
@@ -32,14 +32,6 @@ struct AudioSndio {
32
AudioMixengBackend parent_obj;
33
};
34
35
-static struct audio_driver sndio_audio_driver;
36
-
37
-static void audio_sndio_class_init(ObjectClass *klass, const void *data)
38
-{
39
- AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
40
-
41
- k->driver = &sndio_audio_driver;
42
-}
35
36
/* default latency in microseconds if no option is set */
37
#define SNDIO_LATENCY_US 50000
@@ -551,14 +543,17 @@ static struct audio_pcm_ops sndio_pcm_ops = {
543
.put_buffer_in = sndio_put_buffer_in,
544
};
545
554
-static struct audio_driver sndio_audio_driver = {
555
- .name = "sndio",
556
- .pcm_ops = &sndio_pcm_ops,
557
- .max_voices_out = INT_MAX,
558
- .max_voices_in = INT_MAX,
559
- .voice_size_out = sizeof(SndioVoice),
560
- .voice_size_in = sizeof(SndioVoice)
561
-};
546
+static void audio_sndio_class_init(ObjectClass *klass, const void *data)
547
+{
548
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
549
+
550
+ k->name = "sndio";
551
+ k->pcm_ops = &sndio_pcm_ops;
552
+ k->max_voices_out = INT_MAX;
553
+ k->max_voices_in = INT_MAX;
554
+ k->voice_size_out = sizeof(SndioVoice);
555
+ k->voice_size_in = sizeof(SndioVoice);
556
+}
557
558
static const TypeInfo audio_types[] = {
559
{
audio/spiceaudio.c
+15
-21
@@ -39,8 +39,6 @@ struct AudioSpice {
39
AudioMixengBackend parent_obj;
40
};
41
42
-static struct audio_driver spice_audio_driver;
43
-
42
static bool spice_audio_realize(AudioBackend *abe, Audiodev *dev, Error **errp)
43
{
44
if (!using_spice) {
@@ -52,17 +50,6 @@ static bool spice_audio_realize(AudioBackend *abe, Audiodev *dev, Error **errp)
50
return audio_spice_parent_class->realize(abe, dev, errp);
51
}
52
55
-static void audio_spice_class_init(ObjectClass *klass, const void *data)
56
-{
57
- AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
58
- AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
59
-
60
- audio_spice_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
61
-
62
- b->realize = spice_audio_realize;
63
- k->driver = &spice_audio_driver;
64
-}
65
-
53
#if SPICE_INTERFACE_PLAYBACK_MAJOR > 1 || SPICE_INTERFACE_PLAYBACK_MINOR >= 3
54
#define LINE_OUT_SAMPLES (480 * 4)
55
#else
@@ -332,14 +319,21 @@ static struct audio_pcm_ops audio_callbacks = {
319
#endif
320
};
321
335
-static struct audio_driver spice_audio_driver = {
336
- .name = "spice",
337
- .pcm_ops = &audio_callbacks,
338
- .max_voices_out = 1,
339
- .max_voices_in = 1,
340
- .voice_size_out = sizeof (SpiceVoiceOut),
341
- .voice_size_in = sizeof (SpiceVoiceIn),
342
-};
322
+static void audio_spice_class_init(ObjectClass *klass, const void *data)
323
+{
324
+ AudioBackendClass *b = AUDIO_BACKEND_CLASS(klass);
325
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
326
+
327
+ audio_spice_parent_class = AUDIO_BACKEND_CLASS(object_class_get_parent(klass));
328
+
329
+ b->realize = spice_audio_realize;
330
+ k->name = "spice";
331
+ k->pcm_ops = &audio_callbacks;
332
+ k->max_voices_out = 1;
333
+ k->max_voices_in = 1;
334
+ k->voice_size_out = sizeof(SpiceVoiceOut);
335
+ k->voice_size_in = sizeof(SpiceVoiceIn);
336
+}
337
338
static const TypeInfo audio_types[] = {
339
{
audio/wavaudio.c
+11
-17
@@ -37,15 +37,6 @@ struct AudioWav {
37
AudioMixengBackend parent_obj;
38
};
39
40
-static struct audio_driver wav_audio_driver;
41
-
42
-static void audio_wav_class_init(ObjectClass *klass, const void *data)
43
-{
44
- AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
45
-
46
- k->driver = &wav_audio_driver;
47
-}
48
-
40
typedef struct WAVVoiceOut {
41
HWVoiceOut hw;
42
FILE *f;
@@ -208,14 +199,17 @@ static struct audio_pcm_ops wav_pcm_ops = {
199
.enable_out = wav_enable_out,
200
};
201
211
-static struct audio_driver wav_audio_driver = {
212
- .name = "wav",
213
- .pcm_ops = &wav_pcm_ops,
214
- .max_voices_out = 1,
215
- .max_voices_in = 0,
216
- .voice_size_out = sizeof (WAVVoiceOut),
217
- .voice_size_in = 0
218
-};
202
+static void audio_wav_class_init(ObjectClass *klass, const void *data)
203
+{
204
+ AudioMixengBackendClass *k = AUDIO_MIXENG_BACKEND_CLASS(klass);
205
+
206
+ k->name = "wav";
207
+ k->pcm_ops = &wav_pcm_ops;
208
+ k->max_voices_out = 1;
209
+ k->max_voices_in = 0;
210
+ k->voice_size_out = sizeof(WAVVoiceOut);
211
+ k->voice_size_in = 0;
212
+}
213
214
static const TypeInfo audio_types[] = {
215
{