master
c 470 lines 12.1 KB
Raw
1 /* SPDX-License-Identifier: MIT */
2
3 #include "qemu/osdep.h"
4 #include "qemu/audio.h"
5 #include "qemu/help_option.h"
6 #include "qapi/clone-visitor.h"
7 #include "qapi/qobject-input-visitor.h"
8 #include "qapi/qapi-visit-audio.h"
9 #include "qapi/qapi-commands-audio.h"
10 #include "qobject/qdict.h"
11 #include "system/system.h"
12
13 /* Order of CONFIG_AUDIO_DRIVERS is import.
14 The 1st one is the one used by default, that is the reason
15 that we generate the list.
16 */
17 const char *audio_prio_list[] = {
18 #ifdef CONFIG_GIO
19 "dbus",
20 #endif
21 "spice",
22 CONFIG_AUDIO_DRIVERS
23 "none",
24 NULL
25 };
26
27 typedef struct AudiodevListEntry {
28 Audiodev *dev;
29 QSIMPLEQ_ENTRY(AudiodevListEntry) next;
30 } AudiodevListEntry;
31
32 typedef QSIMPLEQ_HEAD(, AudiodevListEntry) AudiodevListHead;
33
34 static AudiodevListHead audiodevs =
35 QSIMPLEQ_HEAD_INITIALIZER(audiodevs);
36 static AudiodevListHead default_audiodevs =
37 QSIMPLEQ_HEAD_INITIALIZER(default_audiodevs);
38
39 static AudioBackendClass *audio_be_class_by_name(const char *name)
40 {
41 g_autofree char *tname = g_strconcat("audio-", name, NULL);
42 ObjectClass *oc = module_object_class_by_name(tname);
43
44 if (!oc || !object_class_dynamic_cast(oc, TYPE_AUDIO_BACKEND)) {
45 return NULL;
46 }
47
48 return AUDIO_BACKEND_CLASS(oc);
49 }
50
51 static AudioBackend *default_audio_be;
52
53 static Object *get_audiodevs_root(void)
54 {
55 return object_get_container("audiodevs");
56 }
57
58 void audio_cleanup(void)
59 {
60 default_audio_be = NULL;
61
62 object_unparent(get_audiodevs_root());
63 }
64
65 void audio_create_default_audiodevs(void)
66 {
67 for (int i = 0; audio_prio_list[i]; i++) {
68 if (audio_be_class_by_name(audio_prio_list[i]) != NULL) {
69 QDict *dict = qdict_new();
70 Audiodev *dev = NULL;
71 Visitor *v;
72
73 qdict_put_str(dict, "driver", audio_prio_list[i]);
74 qdict_put_str(dict, "id", "#default");
75
76 v = qobject_input_visitor_new_keyval(QOBJECT(dict));
77 qobject_unref(dict);
78 visit_type_Audiodev(v, NULL, &dev, &error_fatal);
79 visit_free(v);
80
81 audio_add_default_audiodev(dev, &error_abort);
82 }
83 }
84 }
85
86 /*
87 * if we have dev, this function was called because of an -audiodev argument =>
88 * initialize a new state with it
89 * if dev == NULL => legacy implicit initialization, return the already created
90 * state or create a new one
91 */
92 static AudioBackend *audio_init(Audiodev *dev, Error **errp)
93 {
94 AudioBackend *be;
95
96 if (dev) {
97 be = audio_be_new(dev, errp);
98 if (!be) {
99 return NULL;
100 }
101 } else {
102 assert(!default_audio_be);
103 for (;;) {
104 AudiodevListEntry *e = QSIMPLEQ_FIRST(&default_audiodevs);
105 if (!e) {
106 error_setg(errp, "no default audio driver available");
107 return NULL;
108 }
109 QSIMPLEQ_REMOVE_HEAD(&default_audiodevs, next);
110 be = audio_be_new(e->dev, NULL);
111 g_free(e);
112 if (be) {
113 break;
114 }
115 }
116 }
117
118 if (!object_property_try_add_child(get_audiodevs_root(),
119 audio_be_get_id(be), OBJECT(be), errp)) {
120 object_unref(be);
121 return NULL;
122 }
123 object_unref(be);
124 return be;
125 }
126
127 AudioBackend *audio_get_default_audio_be(Error **errp)
128 {
129 if (!default_audio_be) {
130 default_audio_be = audio_init(NULL, errp);
131 if (!default_audio_be) {
132 if (!QSIMPLEQ_EMPTY(&audiodevs)) {
133 error_append_hint(errp, "Perhaps you wanted to use -audio or set audiodev=%s?\n",
134 QSIMPLEQ_FIRST(&audiodevs)->dev->id);
135 }
136 }
137 }
138
139 return default_audio_be;
140 }
141
142 void audio_help(void)
143 {
144 int i;
145
146 printf("Available audio drivers:\n");
147
148 for (i = 0; i < AUDIODEV_DRIVER__MAX; i++) {
149 const char *name = AudiodevDriver_str(i);
150 AudioBackendClass *be = audio_be_class_by_name(name);
151
152 if (be) {
153 printf("%s\n", name);
154 }
155 }
156 }
157
158 void audio_parse_option(const char *opt)
159 {
160 Audiodev *dev = NULL;
161
162 if (is_help_option(opt)) {
163 audio_help();
164 exit(EXIT_SUCCESS);
165 }
166 Visitor *v = qobject_input_visitor_new_str(opt, "driver", &error_fatal);
167 visit_type_Audiodev(v, NULL, &dev, &error_fatal);
168 visit_free(v);
169
170 audio_add_audiodev(dev);
171 }
172
173 static void audio_create_pdos(Audiodev *dev)
174 {
175 switch (dev->driver) {
176 #define CASE(DRIVER, driver, pdo_name) \
177 case AUDIODEV_DRIVER_##DRIVER: \
178 if (!dev->u.driver.in) { \
179 dev->u.driver.in = g_malloc0( \
180 sizeof(Audiodev##pdo_name##PerDirectionOptions)); \
181 } \
182 if (!dev->u.driver.out) { \
183 dev->u.driver.out = g_malloc0( \
184 sizeof(Audiodev##pdo_name##PerDirectionOptions)); \
185 } \
186 break
187
188 CASE(NONE, none, );
189 #ifdef CONFIG_AUDIO_ALSA
190 CASE(ALSA, alsa, Alsa);
191 #endif
192 #ifdef CONFIG_AUDIO_COREAUDIO
193 CASE(COREAUDIO, coreaudio, Coreaudio);
194 #endif
195 #ifdef CONFIG_DBUS_DISPLAY
196 CASE(DBUS, dbus, );
197 #endif
198 #ifdef CONFIG_AUDIO_DSOUND
199 CASE(DSOUND, dsound, );
200 #endif
201 #ifdef CONFIG_AUDIO_JACK
202 CASE(JACK, jack, Jack);
203 #endif
204 #ifdef CONFIG_AUDIO_OSS
205 CASE(OSS, oss, Oss);
206 #endif
207 #ifdef CONFIG_AUDIO_PA
208 CASE(PA, pa, Pa);
209 #endif
210 #ifdef CONFIG_AUDIO_PIPEWIRE
211 CASE(PIPEWIRE, pipewire, Pipewire);
212 #endif
213 #ifdef CONFIG_AUDIO_SDL
214 CASE(SDL, sdl, Sdl);
215 #endif
216 #ifdef CONFIG_AUDIO_SNDIO
217 CASE(SNDIO, sndio, );
218 #endif
219 #ifdef CONFIG_SPICE
220 CASE(SPICE, spice, );
221 #endif
222 CASE(WAV, wav, );
223
224 case AUDIODEV_DRIVER__MAX:
225 abort();
226 };
227 }
228
229 static void audio_validate_per_direction_opts(
230 AudiodevPerDirectionOptions *pdo, Error **errp)
231 {
232 if (!pdo->has_mixing_engine) {
233 pdo->has_mixing_engine = true;
234 pdo->mixing_engine = true;
235 }
236 if (!pdo->has_fixed_settings) {
237 pdo->has_fixed_settings = true;
238 pdo->fixed_settings = pdo->mixing_engine;
239 }
240 if (!pdo->fixed_settings &&
241 (pdo->has_frequency || pdo->has_channels || pdo->has_format)) {
242 error_setg(errp,
243 "You can't use frequency, channels or format with fixed-settings=off");
244 return;
245 }
246 if (!pdo->mixing_engine && pdo->fixed_settings) {
247 error_setg(errp, "You can't use fixed-settings without mixeng");
248 return;
249 }
250
251 if (!pdo->has_frequency) {
252 pdo->has_frequency = true;
253 pdo->frequency = 44100;
254 }
255 if (!pdo->has_channels) {
256 pdo->has_channels = true;
257 pdo->channels = 2;
258 }
259 if (!pdo->has_voices) {
260 pdo->has_voices = true;
261 pdo->voices = pdo->mixing_engine ? 1 : INT_MAX;
262 }
263 if (!pdo->has_format) {
264 pdo->has_format = true;
265 pdo->format = AUDIO_FORMAT_S16;
266 }
267 }
268
269 static AudiodevPerDirectionOptions *audio_get_pdo_out(Audiodev *dev)
270 {
271 switch (dev->driver) {
272 case AUDIODEV_DRIVER_NONE:
273 return dev->u.none.out;
274 #ifdef CONFIG_AUDIO_ALSA
275 case AUDIODEV_DRIVER_ALSA:
276 return qapi_AudiodevAlsaPerDirectionOptions_base(dev->u.alsa.out);
277 #endif
278 #ifdef CONFIG_AUDIO_COREAUDIO
279 case AUDIODEV_DRIVER_COREAUDIO:
280 return qapi_AudiodevCoreaudioPerDirectionOptions_base(
281 dev->u.coreaudio.out);
282 #endif
283 #ifdef CONFIG_DBUS_DISPLAY
284 case AUDIODEV_DRIVER_DBUS:
285 return dev->u.dbus.out;
286 #endif
287 #ifdef CONFIG_AUDIO_DSOUND
288 case AUDIODEV_DRIVER_DSOUND:
289 return dev->u.dsound.out;
290 #endif
291 #ifdef CONFIG_AUDIO_JACK
292 case AUDIODEV_DRIVER_JACK:
293 return qapi_AudiodevJackPerDirectionOptions_base(dev->u.jack.out);
294 #endif
295 #ifdef CONFIG_AUDIO_OSS
296 case AUDIODEV_DRIVER_OSS:
297 return qapi_AudiodevOssPerDirectionOptions_base(dev->u.oss.out);
298 #endif
299 #ifdef CONFIG_AUDIO_PA
300 case AUDIODEV_DRIVER_PA:
301 return qapi_AudiodevPaPerDirectionOptions_base(dev->u.pa.out);
302 #endif
303 #ifdef CONFIG_AUDIO_PIPEWIRE
304 case AUDIODEV_DRIVER_PIPEWIRE:
305 return qapi_AudiodevPipewirePerDirectionOptions_base(dev->u.pipewire.out);
306 #endif
307 #ifdef CONFIG_AUDIO_SDL
308 case AUDIODEV_DRIVER_SDL:
309 return qapi_AudiodevSdlPerDirectionOptions_base(dev->u.sdl.out);
310 #endif
311 #ifdef CONFIG_AUDIO_SNDIO
312 case AUDIODEV_DRIVER_SNDIO:
313 return dev->u.sndio.out;
314 #endif
315 #ifdef CONFIG_SPICE
316 case AUDIODEV_DRIVER_SPICE:
317 return dev->u.spice.out;
318 #endif
319 case AUDIODEV_DRIVER_WAV:
320 return dev->u.wav.out;
321
322 case AUDIODEV_DRIVER__MAX:
323 break;
324 }
325 abort();
326 }
327
328 static AudiodevPerDirectionOptions *audio_get_pdo_in(Audiodev *dev)
329 {
330 switch (dev->driver) {
331 case AUDIODEV_DRIVER_NONE:
332 return dev->u.none.in;
333 #ifdef CONFIG_AUDIO_ALSA
334 case AUDIODEV_DRIVER_ALSA:
335 return qapi_AudiodevAlsaPerDirectionOptions_base(dev->u.alsa.in);
336 #endif
337 #ifdef CONFIG_AUDIO_COREAUDIO
338 case AUDIODEV_DRIVER_COREAUDIO:
339 return qapi_AudiodevCoreaudioPerDirectionOptions_base(
340 dev->u.coreaudio.in);
341 #endif
342 #ifdef CONFIG_DBUS_DISPLAY
343 case AUDIODEV_DRIVER_DBUS:
344 return dev->u.dbus.in;
345 #endif
346 #ifdef CONFIG_AUDIO_DSOUND
347 case AUDIODEV_DRIVER_DSOUND:
348 return dev->u.dsound.in;
349 #endif
350 #ifdef CONFIG_AUDIO_JACK
351 case AUDIODEV_DRIVER_JACK:
352 return qapi_AudiodevJackPerDirectionOptions_base(dev->u.jack.in);
353 #endif
354 #ifdef CONFIG_AUDIO_OSS
355 case AUDIODEV_DRIVER_OSS:
356 return qapi_AudiodevOssPerDirectionOptions_base(dev->u.oss.in);
357 #endif
358 #ifdef CONFIG_AUDIO_PA
359 case AUDIODEV_DRIVER_PA:
360 return qapi_AudiodevPaPerDirectionOptions_base(dev->u.pa.in);
361 #endif
362 #ifdef CONFIG_AUDIO_PIPEWIRE
363 case AUDIODEV_DRIVER_PIPEWIRE:
364 return qapi_AudiodevPipewirePerDirectionOptions_base(dev->u.pipewire.in);
365 #endif
366 #ifdef CONFIG_AUDIO_SDL
367 case AUDIODEV_DRIVER_SDL:
368 return qapi_AudiodevSdlPerDirectionOptions_base(dev->u.sdl.in);
369 #endif
370 #ifdef CONFIG_AUDIO_SNDIO
371 case AUDIODEV_DRIVER_SNDIO:
372 return dev->u.sndio.in;
373 #endif
374 #ifdef CONFIG_SPICE
375 case AUDIODEV_DRIVER_SPICE:
376 return dev->u.spice.in;
377 #endif
378 case AUDIODEV_DRIVER_WAV:
379 return dev->u.wav.in;
380
381 case AUDIODEV_DRIVER__MAX:
382 break;
383 }
384 abort();
385 }
386
387 static void audio_validate_opts(Audiodev *dev, Error **errp)
388 {
389 Error *err = NULL;
390
391 audio_create_pdos(dev);
392
393 audio_validate_per_direction_opts(audio_get_pdo_in(dev), &err);
394 if (err) {
395 error_propagate(errp, err);
396 return;
397 }
398
399 audio_validate_per_direction_opts(audio_get_pdo_out(dev), &err);
400 if (err) {
401 error_propagate(errp, err);
402 return;
403 }
404
405 if (!dev->has_timer_period) {
406 dev->has_timer_period = true;
407 dev->timer_period = 10000; /* 100Hz -> 10ms */
408 }
409 }
410
411 void audio_add_audiodev(Audiodev *dev)
412 {
413 AudiodevListEntry *e;
414
415 audio_validate_opts(dev, &error_fatal);
416
417 e = g_new0(AudiodevListEntry, 1);
418 e->dev = dev;
419 QSIMPLEQ_INSERT_TAIL(&audiodevs, e, next);
420 }
421
422 void audio_add_default_audiodev(Audiodev *dev, Error **errp)
423 {
424 AudiodevListEntry *e;
425
426 audio_validate_opts(dev, errp);
427
428 e = g_new0(AudiodevListEntry, 1);
429 e->dev = dev;
430 QSIMPLEQ_INSERT_TAIL(&default_audiodevs, e, next);
431 }
432
433 void audio_init_audiodevs(void)
434 {
435 AudiodevListEntry *e;
436
437 QSIMPLEQ_FOREACH(e, &audiodevs, next) {
438 audio_init(QAPI_CLONE(Audiodev, e->dev), &error_fatal);
439 }
440 }
441
442 AudioBackend *audio_be_by_name(const char *name, Error **errp)
443 {
444 Object *obj = object_resolve_path_component(get_audiodevs_root(), name);
445
446 if (!obj) {
447 error_setg(errp, "audiodev '%s' not found", name);
448 return NULL;
449 } else {
450 return AUDIO_BACKEND(obj);
451 }
452 }
453
454 const char *audio_application_name(void)
455 {
456 const char *vm_name;
457
458 vm_name = qemu_get_vm_name();
459 return vm_name ? vm_name : "qemu";
460 }
461
462 AudiodevList *qmp_query_audiodevs(Error **errp)
463 {
464 AudiodevList *ret = NULL;
465 AudiodevListEntry *e;
466 QSIMPLEQ_FOREACH(e, &audiodevs, next) {
467 QAPI_LIST_PREPEND(ret, QAPI_CLONE(Audiodev, e->dev));
468 }
469 return ret;
470 }