audio: add help option for -audio and -audiodev

add a simple help option for -audio and -audiodev
to show the list of available drivers, and document them.

Signed-off-by: Claudio Fontana <cfontana@suse.de>
Message-Id: <20220908081441.7111-1-cfontana@suse.de>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Claudio Fontana 2022-09-08 10:14:41 +02:00 committed by Paolo Bonzini
parent e121d7606b
commit 5e03b6daf6
4 changed files with 33 additions and 6 deletions

View File

@ -32,6 +32,7 @@
#include "qapi/qapi-visit-audio.h" #include "qapi/qapi-visit-audio.h"
#include "qemu/cutils.h" #include "qemu/cutils.h"
#include "qemu/module.h" #include "qemu/module.h"
#include "qemu/help_option.h"
#include "sysemu/sysemu.h" #include "sysemu/sysemu.h"
#include "sysemu/replay.h" #include "sysemu/replay.h"
#include "sysemu/runstate.h" #include "sysemu/runstate.h"
@ -2101,10 +2102,28 @@ static void audio_validate_opts(Audiodev *dev, Error **errp)
} }
} }
void audio_help(void)
{
int i;
printf("Available audio drivers:\n");
for (i = 0; i < AUDIODEV_DRIVER__MAX; i++) {
audio_driver *driver = audio_driver_lookup(AudiodevDriver_str(i));
if (driver) {
printf("%s\n", driver->name);
}
}
}
void audio_parse_option(const char *opt) void audio_parse_option(const char *opt)
{ {
Audiodev *dev = NULL; Audiodev *dev = NULL;
if (is_help_option(opt)) {
audio_help();
exit(EXIT_SUCCESS);
}
Visitor *v = qobject_input_visitor_new_str(opt, "driver", &error_fatal); Visitor *v = qobject_input_visitor_new_str(opt, "driver", &error_fatal);
visit_type_Audiodev(v, NULL, &dev, &error_fatal); visit_type_Audiodev(v, NULL, &dev, &error_fatal);
visit_free(v); visit_free(v);

View File

@ -171,6 +171,7 @@ void audio_sample_from_uint64(void *samples, int pos,
void audio_define(Audiodev *audio); void audio_define(Audiodev *audio);
void audio_parse_option(const char *opt); void audio_parse_option(const char *opt);
bool audio_init_audiodevs(void); bool audio_init_audiodevs(void);
void audio_help(void);
void audio_legacy_help(void); void audio_legacy_help(void);
AudioState *audio_state_by_name(const char *name); AudioState *audio_state_by_name(const char *name);

View File

@ -704,10 +704,11 @@ 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 This option is a shortcut for configuring both the guest audio
hardware and the host audio backend in one go. hardware and the host audio backend in one go.
The host backend options are the same as with the corresponding The driver option is the same as with the corresponding ``-audiodev`` option below.
``-audiodev`` options below. 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:
@ -721,6 +722,7 @@ ERST
DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev, DEF("audiodev", HAS_ARG, QEMU_OPTION_audiodev,
"-audiodev [driver=]driver,id=id[,prop[=value][,...]]\n" "-audiodev [driver=]driver,id=id[,prop[=value][,...]]\n"
" specifies the audio backend to use\n" " specifies the audio backend to use\n"
" Use ``-audiodev help`` to list the available drivers\n"
" id= identifier of the backend\n" " id= identifier of the backend\n"
" timer-period= timer period in microseconds\n" " timer-period= timer period in microseconds\n"
" in|out.mixing-engine= use mixing engine to mix streams inside QEMU\n" " in|out.mixing-engine= use mixing engine to mix streams inside QEMU\n"

View File

@ -2842,11 +2842,16 @@ void qemu_init(int argc, char **argv, char **envp)
audio_parse_option(optarg); audio_parse_option(optarg);
break; break;
case QEMU_OPTION_audio: { case QEMU_OPTION_audio: {
QDict *dict = keyval_parse(optarg, "driver", NULL, &error_fatal); bool help;
char *model; char *model;
Audiodev *dev = NULL; Audiodev *dev = NULL;
Visitor *v; Visitor *v;
QDict *dict = keyval_parse(optarg, "driver", &help, &error_fatal);
if (help || (qdict_haskey(dict, "driver") &&
is_help_option(qdict_get_str(dict, "driver")))) {
audio_help();
exit(EXIT_SUCCESS);
}
if (!qdict_haskey(dict, "id")) { if (!qdict_haskey(dict, "id")) {
qdict_put_str(dict, "id", "audiodev0"); qdict_put_str(dict, "id", "audiodev0");
} }