@samitouri / QOSamiQemu / commits / cc66d140a9

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 {