[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-devel] [PATCH 1/7] audio: add driver registry
From: |
Marc-André Lureau |
Subject: |
Re: [Qemu-devel] [PATCH 1/7] audio: add driver registry |
Date: |
Tue, 6 Mar 2018 11:58:45 +0100 |
On Tue, Mar 6, 2018 at 8:40 AM, Gerd Hoffmann <address@hidden> wrote:
> Add registry for audio drivers, using the existing audio_driver struct.
> Make all drivers register themself. The old list of audio_driver struct
> pointers is now a list of audio driver names, specifying the priority
> (aka probe order) in case no driver is explicitly asked for.
>
> Signed-off-by: Gerd Hoffmann <address@hidden>
Reviewed-by: Marc-André Lureau <address@hidden>
> ---
> audio/audio_int.h | 14 ++++--------
> audio/alsaaudio.c | 8 ++++++-
> audio/audio.c | 63
> ++++++++++++++++++++++++++++++---------------------
> audio/coreaudio.c | 8 ++++++-
> audio/dsoundaudio.c | 8 ++++++-
> audio/noaudio.c | 8 ++++++-
> audio/ossaudio.c | 8 ++++++-
> audio/paaudio.c | 8 ++++++-
> audio/sdlaudio.c | 8 ++++++-
> audio/spiceaudio.c | 8 ++++++-
> audio/wavaudio.c | 8 ++++++-
> scripts/create_config | 2 +-
> 12 files changed, 106 insertions(+), 45 deletions(-)
>
> diff --git a/audio/audio_int.h b/audio/audio_int.h
> index 700bd43143..244b454012 100644
> --- a/audio/audio_int.h
> +++ b/audio/audio_int.h
> @@ -141,6 +141,7 @@ struct SWVoiceIn {
> QLIST_ENTRY (SWVoiceIn) entries;
> };
>
> +typedef struct audio_driver audio_driver;
> struct audio_driver {
> const char *name;
> const char *descr;
> @@ -154,6 +155,7 @@ struct audio_driver {
> int voice_size_out;
> int voice_size_in;
> int ctl_caps;
> + QLIST_ENTRY(audio_driver) next;
> };
>
> struct audio_pcm_ops {
> @@ -203,17 +205,11 @@ struct AudioState {
> int vm_running;
> };
>
> -extern struct audio_driver no_audio_driver;
> -extern struct audio_driver oss_audio_driver;
> -extern struct audio_driver sdl_audio_driver;
> -extern struct audio_driver wav_audio_driver;
> -extern struct audio_driver alsa_audio_driver;
> -extern struct audio_driver coreaudio_audio_driver;
> -extern struct audio_driver dsound_audio_driver;
> -extern struct audio_driver pa_audio_driver;
> -extern struct audio_driver spice_audio_driver;
> extern const struct mixeng_volume nominal_volume;
>
> +void audio_driver_register(audio_driver *drv);
> +audio_driver *audio_driver_lookup(const char *name);
> +
> void audio_pcm_init_info (struct audio_pcm_info *info, struct audsettings
> *as);
> void audio_pcm_info_clear_buf (struct audio_pcm_info *info, void *buf, int
> len);
>
> diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c
> index 92a96f8b2b..362a2276fd 100644
> --- a/audio/alsaaudio.c
> +++ b/audio/alsaaudio.c
> @@ -1213,7 +1213,7 @@ static struct audio_pcm_ops alsa_pcm_ops = {
> .ctl_in = alsa_ctl_in,
> };
>
> -struct audio_driver alsa_audio_driver = {
> +static struct audio_driver alsa_audio_driver = {
> .name = "alsa",
> .descr = "ALSA http://www.alsa-project.org",
> .options = alsa_options,
> @@ -1226,3 +1226,9 @@ struct audio_driver alsa_audio_driver = {
> .voice_size_out = sizeof (ALSAVoiceOut),
> .voice_size_in = sizeof (ALSAVoiceIn)
> };
> +
> +static void register_audio_alsa(void)
> +{
> + audio_driver_register(&alsa_audio_driver);
> +}
> +type_init(register_audio_alsa);
> diff --git a/audio/audio.c b/audio/audio.c
> index 7658d2af66..2384612b87 100644
> --- a/audio/audio.c
> +++ b/audio/audio.c
> @@ -45,15 +45,32 @@
> The 1st one is the one used by default, that is the reason
> that we generate the list.
> */
> -static struct audio_driver *drvtab[] = {
> -#ifdef CONFIG_SPICE
> - &spice_audio_driver,
> -#endif
> +static const char *audio_prio_list[] = {
> + "spice",
> CONFIG_AUDIO_DRIVERS
> - &no_audio_driver,
> - &wav_audio_driver
> + "none",
> + "wav",
> };
>
> +static QLIST_HEAD(, audio_driver) audio_drivers;
> +
> +void audio_driver_register(audio_driver *drv)
> +{
> + QLIST_INSERT_HEAD(&audio_drivers, drv, next);
> +}
> +
> +audio_driver *audio_driver_lookup(const char *name)
> +{
> + struct audio_driver *d;
> +
> + QLIST_FOREACH(d, &audio_drivers, next) {
> + if (strcmp(name, d->name) == 0) {
> + return d;
> + }
> + }
> + return NULL;
> +}
> +
> struct fixed_settings {
> int enabled;
> int nb_voices;
> @@ -1656,11 +1673,10 @@ static void audio_pp_nb_voices (const char *typ, int
> nb)
>
> void AUD_help (void)
> {
> - size_t i;
> + struct audio_driver *d;
>
> audio_process_options ("AUDIO", audio_options);
> - for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
> - struct audio_driver *d = drvtab[i];
> + QLIST_FOREACH(d, &audio_drivers, next) {
> if (d->options) {
> audio_process_options (d->name, d->options);
> }
> @@ -1672,8 +1688,7 @@ void AUD_help (void)
>
> printf ("Available drivers:\n");
>
> - for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
> - struct audio_driver *d = drvtab[i];
> + QLIST_FOREACH(d, &audio_drivers, next) {
>
> printf ("Name: %s\n", d->name);
> printf ("Description: %s\n", d->descr);
> @@ -1807,6 +1822,7 @@ static void audio_init (void)
> const char *drvname;
> VMChangeStateEntry *e;
> AudioState *s = &glob_audio_state;
> + struct audio_driver *driver;
>
> if (s->drv) {
> return;
> @@ -1842,32 +1858,27 @@ static void audio_init (void)
> }
>
> if (drvname) {
> - int found = 0;
> -
> - for (i = 0; i < ARRAY_SIZE (drvtab); i++) {
> - if (!strcmp (drvname, drvtab[i]->name)) {
> - done = !audio_driver_init (s, drvtab[i]);
> - found = 1;
> - break;
> - }
> - }
> -
> - if (!found) {
> + driver = audio_driver_lookup(drvname);
> + if (driver) {
> + done = !audio_driver_init(s, driver);
> + } else {
> dolog ("Unknown audio driver `%s'\n", drvname);
> dolog ("Run with -audio-help to list available drivers\n");
> }
> }
>
> if (!done) {
> - for (i = 0; !done && i < ARRAY_SIZE (drvtab); i++) {
> - if (drvtab[i]->can_be_default) {
> - done = !audio_driver_init (s, drvtab[i]);
> + for (i = 0; !done && i < ARRAY_SIZE(audio_prio_list); i++) {
> + driver = audio_driver_lookup(audio_prio_list[i]);
> + if (driver && driver->can_be_default) {
> + done = !audio_driver_init(s, driver);
> }
> }
> }
>
> if (!done) {
> - done = !audio_driver_init (s, &no_audio_driver);
> + driver = audio_driver_lookup("none");
> + done = !audio_driver_init(s, driver);
> assert(done);
> dolog("warning: Using timer based audio emulation\n");
> }
> diff --git a/audio/coreaudio.c b/audio/coreaudio.c
> index c75142084f..638c60b300 100644
> --- a/audio/coreaudio.c
> +++ b/audio/coreaudio.c
> @@ -722,7 +722,7 @@ static struct audio_pcm_ops coreaudio_pcm_ops = {
> .ctl_out = coreaudio_ctl_out
> };
>
> -struct audio_driver coreaudio_audio_driver = {
> +static struct audio_driver coreaudio_audio_driver = {
> .name = "coreaudio",
> .descr = "CoreAudio
> http://developer.apple.com/audio/coreaudio.html",
> .options = coreaudio_options,
> @@ -735,3 +735,9 @@ struct audio_driver coreaudio_audio_driver = {
> .voice_size_out = sizeof (coreaudioVoiceOut),
> .voice_size_in = 0
> };
> +
> +static void register_audio_coreaudio(void)
> +{
> + audio_driver_register(&coreaudio_audio_driver);
> +}
> +type_init(register_audio_coreaudio);
> diff --git a/audio/dsoundaudio.c b/audio/dsoundaudio.c
> index bc39cb9b4d..3ed73a30d1 100644
> --- a/audio/dsoundaudio.c
> +++ b/audio/dsoundaudio.c
> @@ -890,7 +890,7 @@ static struct audio_pcm_ops dsound_pcm_ops = {
> .ctl_in = dsound_ctl_in
> };
>
> -struct audio_driver dsound_audio_driver = {
> +static struct audio_driver dsound_audio_driver = {
> .name = "dsound",
> .descr = "DirectSound http://wikipedia.org/wiki/DirectSound",
> .options = dsound_options,
> @@ -903,3 +903,9 @@ struct audio_driver dsound_audio_driver = {
> .voice_size_out = sizeof (DSoundVoiceOut),
> .voice_size_in = sizeof (DSoundVoiceIn)
> };
> +
> +static void register_audio_dsound(void)
> +{
> + audio_driver_register(&dsound_audio_driver);
> +}
> +type_init(register_audio_dsound);
> diff --git a/audio/noaudio.c b/audio/noaudio.c
> index 9ca9eaf01f..1bfebeca7d 100644
> --- a/audio/noaudio.c
> +++ b/audio/noaudio.c
> @@ -160,7 +160,7 @@ static struct audio_pcm_ops no_pcm_ops = {
> .ctl_in = no_ctl_in
> };
>
> -struct audio_driver no_audio_driver = {
> +static struct audio_driver no_audio_driver = {
> .name = "none",
> .descr = "Timer based audio emulation",
> .options = NULL,
> @@ -173,3 +173,9 @@ struct audio_driver no_audio_driver = {
> .voice_size_out = sizeof (NoVoiceOut),
> .voice_size_in = sizeof (NoVoiceIn)
> };
> +
> +static void register_audio_none(void)
> +{
> + audio_driver_register(&no_audio_driver);
> +}
> +type_init(register_audio_none);
> diff --git a/audio/ossaudio.c b/audio/ossaudio.c
> index a0428881c2..6c69622b4c 100644
> --- a/audio/ossaudio.c
> +++ b/audio/ossaudio.c
> @@ -922,7 +922,7 @@ static struct audio_pcm_ops oss_pcm_ops = {
> .ctl_in = oss_ctl_in
> };
>
> -struct audio_driver oss_audio_driver = {
> +static struct audio_driver oss_audio_driver = {
> .name = "oss",
> .descr = "OSS http://www.opensound.com",
> .options = oss_options,
> @@ -935,3 +935,9 @@ struct audio_driver oss_audio_driver = {
> .voice_size_out = sizeof (OSSVoiceOut),
> .voice_size_in = sizeof (OSSVoiceIn)
> };
> +
> +static void register_audio_oss(void)
> +{
> + audio_driver_register(&oss_audio_driver);
> +}
> +type_init(register_audio_oss);
> diff --git a/audio/paaudio.c b/audio/paaudio.c
> index aa0a7477d3..949769774d 100644
> --- a/audio/paaudio.c
> +++ b/audio/paaudio.c
> @@ -937,7 +937,7 @@ static struct audio_pcm_ops qpa_pcm_ops = {
> .ctl_in = qpa_ctl_in
> };
>
> -struct audio_driver pa_audio_driver = {
> +static struct audio_driver pa_audio_driver = {
> .name = "pa",
> .descr = "http://www.pulseaudio.org/",
> .options = qpa_options,
> @@ -951,3 +951,9 @@ struct audio_driver pa_audio_driver = {
> .voice_size_in = sizeof (PAVoiceIn),
> .ctl_caps = VOICE_VOLUME_CAP
> };
> +
> +static void register_audio_pa(void)
> +{
> + audio_driver_register(&pa_audio_driver);
> +}
> +type_init(register_audio_pa);
> diff --git a/audio/sdlaudio.c b/audio/sdlaudio.c
> index e92135bd2f..9db5ac92bc 100644
> --- a/audio/sdlaudio.c
> +++ b/audio/sdlaudio.c
> @@ -500,7 +500,7 @@ static struct audio_pcm_ops sdl_pcm_ops = {
> .ctl_out = sdl_ctl_out,
> };
>
> -struct audio_driver sdl_audio_driver = {
> +static struct audio_driver sdl_audio_driver = {
> .name = "sdl",
> .descr = "SDL http://www.libsdl.org",
> .options = sdl_options,
> @@ -513,3 +513,9 @@ struct audio_driver sdl_audio_driver = {
> .voice_size_out = sizeof (SDLVoiceOut),
> .voice_size_in = 0
> };
> +
> +static void register_audio_sdl(void)
> +{
> + audio_driver_register(&sdl_audio_driver);
> +}
> +type_init(register_audio_sdl);
> diff --git a/audio/spiceaudio.c b/audio/spiceaudio.c
> index 5580e76307..6ad0eafbc6 100644
> --- a/audio/spiceaudio.c
> +++ b/audio/spiceaudio.c
> @@ -391,7 +391,7 @@ static struct audio_pcm_ops audio_callbacks = {
> .ctl_in = line_in_ctl,
> };
>
> -struct audio_driver spice_audio_driver = {
> +static struct audio_driver spice_audio_driver = {
> .name = "spice",
> .descr = "spice audio driver",
> .options = audio_options,
> @@ -411,3 +411,9 @@ void qemu_spice_audio_init (void)
> {
> spice_audio_driver.can_be_default = 1;
> }
> +
> +static void register_audio_spice(void)
> +{
> + audio_driver_register(&spice_audio_driver);
> +}
> +type_init(register_audio_spice);
> diff --git a/audio/wavaudio.c b/audio/wavaudio.c
> index 068a595732..40adfa30c3 100644
> --- a/audio/wavaudio.c
> +++ b/audio/wavaudio.c
> @@ -278,7 +278,7 @@ static struct audio_pcm_ops wav_pcm_ops = {
> .ctl_out = wav_ctl_out,
> };
>
> -struct audio_driver wav_audio_driver = {
> +static struct audio_driver wav_audio_driver = {
> .name = "wav",
> .descr = "WAV renderer http://wikipedia.org/wiki/WAV",
> .options = wav_options,
> @@ -291,3 +291,9 @@ struct audio_driver wav_audio_driver = {
> .voice_size_out = sizeof (WAVVoiceOut),
> .voice_size_in = 0
> };
> +
> +static void register_audio_wav(void)
> +{
> + audio_driver_register(&wav_audio_driver);
> +}
> +type_init(register_audio_wav);
> diff --git a/scripts/create_config b/scripts/create_config
> index 603b826886..d727e5e36e 100755
> --- a/scripts/create_config
> +++ b/scripts/create_config
> @@ -36,7 +36,7 @@ case $line in
> drivers=${line#*=}
> echo "#define CONFIG_AUDIO_DRIVERS \\"
> for drv in $drivers; do
> - echo " &${drv}_audio_driver,\\"
> + echo " \"${drv}\",\\"
> done
> echo ""
> ;;
> --
> 2.9.3
>
>
--
Marc-André Lureau
- [Qemu-devel] [PATCH 0/7] audio: modularize, Gerd Hoffmann, 2018/03/06
- [Qemu-devel] [PATCH 5/7] audio/oss: build as module, Gerd Hoffmann, 2018/03/06
- [Qemu-devel] [PATCH 6/7] audio/pulseaudio: build as module, Gerd Hoffmann, 2018/03/06
- [Qemu-devel] [PATCH 7/7] audio/sdl: build as module, Gerd Hoffmann, 2018/03/06
- [Qemu-devel] [PATCH 4/7] audio/alsa: build as module, Gerd Hoffmann, 2018/03/06
- [Qemu-devel] [PATCH 2/7] audio: add module loading support, Gerd Hoffmann, 2018/03/06
- [Qemu-devel] [PATCH 1/7] audio: add driver registry, Gerd Hoffmann, 2018/03/06
- Re: [Qemu-devel] [PATCH 1/7] audio: add driver registry,
Marc-André Lureau <=
- [Qemu-devel] [PATCH 3/7] build: enable audio modules, Gerd Hoffmann, 2018/03/06
- Re: [Qemu-devel] [PATCH 0/7] audio: modularize, Marc-André Lureau, 2018/03/06