1
0
mirror of https://gitlab.com/qemu-project/qemu synced 2024-07-08 20:17:27 +00:00

audio: extend -audio to allow creating a default backend

If "-audio BACKEND" is used without a model, the resulting backend
will be used whenever the audiodev property is not specified.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Paolo Bonzini 2023-09-21 10:23:58 +02:00
parent 8f527a3c0d
commit 1ebdbff4c3
3 changed files with 37 additions and 21 deletions

View File

@ -1820,7 +1820,7 @@ bool AUD_register_card (const char *name, QEMUSoundCard *card, Error **errp)
card->state = audio_init(NULL, errp); card->state = audio_init(NULL, errp);
if (!card->state) { if (!card->state) {
if (!QSIMPLEQ_EMPTY(&audiodevs)) { if (!QSIMPLEQ_EMPTY(&audiodevs)) {
error_append_hint(errp, "Perhaps you wanted to set audiodev=%s?\n", error_append_hint(errp, "Perhaps you wanted to use -audio or set audiodev=%s?\n",
QSIMPLEQ_FIRST(&audiodevs)->dev->id); QSIMPLEQ_FIRST(&audiodevs)->dev->id);
} }
return false; return false;

View File

@ -728,20 +728,22 @@ ERST
DEF("audio", HAS_ARG, QEMU_OPTION_audio, DEF("audio", HAS_ARG, QEMU_OPTION_audio,
"-audio [driver=]driver[,prop[=value][,...]]\n"
" specifies default audio backend when `audiodev` is not\n"
" used to create a machine or sound device;"
" options are the same as for -audiodev\n"
"-audio [driver=]driver,model=value[,prop[=value][,...]]\n" "-audio [driver=]driver,model=value[,prop[=value][,...]]\n"
" specifies the audio backend and device to use;\n" " specifies the audio backend and device to use;\n"
" apart from 'model', options are the same as for -audiodev.\n" " apart from 'model', options are the same as for -audiodev.\n"
" use '-audio model=help' to show possible devices.\n", " use '-audio model=help' to show possible devices.\n",
QEMU_ARCH_ALL) QEMU_ARCH_ALL)
SRST SRST
``-audio [driver=]driver,model=value[,prop[=value][,...]]`` ``-audio [driver=]driver[,model=value][,prop[=value][,...]]``
This option is a shortcut for configuring both the guest audio If the ``model`` option is specified, ``-audio`` is a shortcut
hardware and the host audio backend in one go. for configuring both the guest audio hardware and the host audio
The driver option is the same as with the corresponding ``-audiodev`` option below. backend in one go. The guest hardware model can be set with
The guest hardware model can be set with ``model=modelname``. ``model=modelname``. Use ``model=help`` to list the available
device types.
Use ``driver=help`` to list the available drivers,
and ``model=help`` to list the available device types.
The following two example do exactly the same, to show how ``-audio`` The following two example do exactly the same, to show how ``-audio``
can be used to shorten the command line length: can be used to shorten the command line length:
@ -750,6 +752,17 @@ SRST
|qemu_system| -audiodev pa,id=pa -device sb16,audiodev=pa |qemu_system| -audiodev pa,id=pa -device sb16,audiodev=pa
|qemu_system| -audio pa,model=sb16 |qemu_system| -audio pa,model=sb16
If the ``model`` option is not specified, ``-audio`` is used to
configure a default audio backend that will be used whenever the
``audiodev`` property is not set on a device or machine. In
particular, ``-audio none`` ensures that no audio is produced even
for machines that have embedded sound hardware.
In both cases, the driver option is the same as with the corresponding
``-audiodev`` option below. Use ``driver=help`` to list the available
drivers.
ERST ERST
DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev, DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev,

View File

@ -2935,7 +2935,7 @@ void qemu_init(int argc, char **argv)
break; break;
case QEMU_OPTION_audio: { case QEMU_OPTION_audio: {
bool help; bool help;
char *model; char *model = NULL;
Audiodev *dev = NULL; Audiodev *dev = NULL;
Visitor *v; Visitor *v;
QDict *dict = keyval_parse(optarg, "driver", &help, &error_fatal); QDict *dict = keyval_parse(optarg, "driver", &help, &error_fatal);
@ -2948,22 +2948,25 @@ void qemu_init(int argc, char **argv)
if (!qdict_haskey(dict, "id")) { if (!qdict_haskey(dict, "id")) {
qdict_put_str(dict, "id", "audiodev0"); qdict_put_str(dict, "id", "audiodev0");
} }
if (!qdict_haskey(dict, "model")) { if (qdict_haskey(dict, "model")) {
error_setg(&error_fatal, "Parameter 'model' is missing"); model = g_strdup(qdict_get_str(dict, "model"));
} qdict_del(dict, "model");
model = g_strdup(qdict_get_str(dict, "model")); if (is_help_option(model)) {
qdict_del(dict, "model"); show_valid_soundhw();
if (is_help_option(model)) { exit(0);
show_valid_soundhw(); }
exit(0);
} }
v = qobject_input_visitor_new_keyval(QOBJECT(dict)); v = qobject_input_visitor_new_keyval(QOBJECT(dict));
qobject_unref(dict); qobject_unref(dict);
visit_type_Audiodev(v, NULL, &dev, &error_fatal); visit_type_Audiodev(v, NULL, &dev, &error_fatal);
visit_free(v); visit_free(v);
audio_define(dev); if (model) {
select_soundhw(model, dev->id); audio_define(dev);
g_free(model); select_soundhw(model, dev->id);
g_free(model);
} else {
audio_define_default(dev, &error_fatal);
}
break; break;
} }
case QEMU_OPTION_h: case QEMU_OPTION_h: