audio: modularize
cover audio: modularize
Add audio driver (host backend) registry. Add audio module support. Enable module builds for alsa, oss, pulse and sdl.
Gerd Hoffmann (7):
audio: add driver registry
audio: add module loading support
build: enable audio modules
audio/alsa: build as module
audio/oss: build as module
audio/pulseaudio: build as module
audio/sdl: build as module
configure | 7 ++++- Makefile | 4 +++ Makefile.objs | 1 + audio/audio_int.h | 14 ++++----- include/qemu/module.h | 1 + audio/alsaaudio.c | 8 ++++- audio/audio.c | 83 +++++++++++++++++++++++++++++++++++---------------- 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 ++++- audio/Makefile.objs | 30 +++++++++++++------ scripts/create_config | 2 +- 17 files changed, 159 insertions(+), 55 deletions(-)
Signature · 1 line
2.9.3
PATCH 1/7 audio: add driver registry
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.
--- 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(-)
audio/audio_int.h +5 -9
@@ -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);
audio/alsaaudio.c +7 -1
@@ -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);
audio/audio.c +37 -26
109 lines not on this page · raw message
audio/coreaudio.c +7 -1
@@ -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);
audio/dsoundaudio.c +7 -1
@@ -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);
audio/noaudio.c +7 -1
@@ -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);
audio/ossaudio.c +7 -1
@@ -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);
audio/paaudio.c +7 -1
@@ -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);
audio/sdlaudio.c +7 -1
@@ -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);
audio/spiceaudio.c +7 -1
@@ -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);
audio/wavaudio.c +7 -1
@@ -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);
scripts/create_config +1 -1
@@ -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 "" ;;
Signature · 1 line
2.9.3
Re: [Qemu-devel] [PATCH 1/7] audio: add driver registry
Quoted 6 lines · Gerd Hoffmann
Add registry for audio drivers, using the existing
audio_driverstruct. Make all drivers register themself. The old list ofaudio_driverstruct 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 <[email protected]>
Quoted 398 lines
--- 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(-)audio/audio_int.h +5
-9@@ -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);audio/alsaaudio.c +7
-1@@ -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);audio/audio.c +37
-26@@ -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" ); }audio/coreaudio.c +7
-1@@ -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);audio/dsoundaudio.c +7
-1@@ -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);audio/noaudio.c +7
-1@@ -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);audio/ossaudio.c +7
-1@@ -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);audio/paaudio.c +7
-1@@ -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);audio/sdlaudio.c +7
-1@@ -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);audio/spiceaudio.c +7
-1@@ -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);audio/wavaudio.c +7
-1@@ -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);scripts/create_config +1
-2@@ -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
Signature · 1 line
Marc-André Lureau
PATCH 2/7 audio: add module loading support
In reply to Gerd HoffmannMake audio_driver_lookup() try load the module in case it doesn't find the driver in the registry. Also load all modules for -audio-help, so the help output includes the help text for modular audio drivers.
--- include/qemu/module.h | 1 + audio/audio.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+)
include/qemu/module.h +1 -0
@@ -54,6 +54,7 @@ typedef enum {#define block_module_load_one (lib) module_load_one("block-", lib)#define ui_module_load_one (lib) module_load_one("ui-", lib) +#define audio_module_load_one (lib) module_load_one("audio-", lib)void register_module_init (void (*fn)(void ),module_init_type type);void register_dso_module_init (void (*fn)(void ),module_init_type type);
audio/audio.c +20 -0
@@ -68,9 +68,26 @@ audio_driver *audio_driver_lookup(const char *name)return d; } } + +audio_module_load_one (name); + QLIST_FOREACH(d, &audio_drivers, next) { +if (strcmp (name, d->name) ==0 ) { +return d; + } + } +return NULL ; } +static void audio_module_load_all (void ) +{ +int i; + +for (i =0 ; i <ARRAY_SIZE (audio_prio_list); i++) { +audio_driver_lookup (audio_prio_list[i]); + } +} +struct fixed_settings {int enabled;int nb_voices;
@@ -1675,6 +1692,9 @@ void AUD_help (void) {struct audio_driver *d; +/* make sure we print the help text for modular drivers too */ +audio_module_load_all (); +audio_process_options ("AUDIO" , audio_options); QLIST_FOREACH(d, &audio_drivers, next) {if (d->options) {
Signature · 1 line
2.9.3
Re: [Qemu-devel] [PATCH 2/7] audio: add module loading support
Quoted 5 lines · Gerd Hoffmann
Make
audio_driver_lookup()try load the module in case it doesn't find the driver in the registry. Also load all modules for -audio-help, so the help output includes the help text for modular audio drivers.Signed-off-by Gerd Hoffmann <[email protected]>
Quoted 62 lines
--- include/qemu/module.h | 1 + audio/audio.c | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+)include/qemu/module.h +1
-0@@ -54,6 +54,7 @@ typedef enum {#define block_module_load_one (lib) module_load_one("block-", lib)#define ui_module_load_one (lib) module_load_one("ui-", lib) +#define audio_module_load_one (lib) module_load_one("audio-", lib)void register_module_init (void (*fn)(void ),module_init_type type);void register_dso_module_init (void (*fn)(void ),module_init_type type);audio/audio.c +20
-1@@ -68,9 +68,26 @@ audio_driver *audio_driver_lookup(const char *name)return d; } } + +audio_module_load_one (name); + QLIST_FOREACH(d, &audio_drivers, next) { +if (strcmp (name, d->name) ==0 ) { +return d; + } + } +return NULL ; } +static void audio_module_load_all (void ) +{ +int i; + +for (i =0 ; i <ARRAY_SIZE (audio_prio_list); i++) { +audio_driver_lookup (audio_prio_list[i]); + } +} +struct fixed_settings {int enabled;int nb_voices;@@ -1675,6 +1692,9 @@ void AUD_help (void) {struct audio_driver *d; +/* make sure we print the help text for modular drivers too */ +audio_module_load_all (); +audio_process_options ("AUDIO" , audio_options); QLIST_FOREACH(d, &audio_drivers, next) {if (d->options) { --2.9.3
Signature · 1 line
Marc-André Lureau
PATCH 3/7 build: enable audio modules
In reply to Gerd HoffmannAdd audio/ to common-obj-m variable.
Also run both audio and ui variables through unnest-vars. This avoids sdl.mo (exists in both audio/ and ui/) name clashes.
--- Makefile | 4 ++++ Makefile.objs | 1 + 2 files changed, 5 insertions(+)
Makefile +4 -0
@@ -425,6 +425,10 @@ dummy := $(call unnest-vars,, \ io-obj-y \ common-obj-y \ common-obj-m \ + ui-obj-y \ + ui-obj-m \ + audio-obj-y \ + audio-obj-m \ trace-obj-y) include $(SRC_PATH)/tests/Makefile.include
Makefile.objs +1 -0
@@ -104,6 +104,7 @@ common-obj-$(CONFIG_LINUX) += fsdev/ common-obj-y += migration/ common-obj-y += audio/ +common-obj-m += audio/ common-obj-y += hw/ common-obj-y += replay/
Signature · 1 line
2.9.3
PATCH 4/7 audio/alsa: build as module
In reply to Gerd Hoffmann--- configure | 7 ++++++- audio/Makefile.objs | 7 +++++-- 2 files changed, 11 insertions(+), 3 deletions(-)
configure +6 -1
@@ -5982,7 +5982,12 @@ fi echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak for drv in $audio_drv_list; do def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]') - echo "$def=y" >> $config_host_mak + case "$drv" in + alsa) + echo "$def=m" >> $config_host_mak ;; + *) + echo "$def=y" >> $config_host_mak ;; + esac done echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak
audio/Makefile.objs +5 -2
@@ -3,7 +3,6 @@ common-obj-$(CONFIG_AUDIO_SDL) += sdlaudio.o common-obj-$(CONFIG_AUDIO_OSS) += ossaudio.o common-obj-$(CONFIG_SPICE) += spiceaudio.o common-obj-$(CONFIG_AUDIO_COREAUDIO) += coreaudio.o -common-obj-$(CONFIG_AUDIO_ALSA) += alsaaudio.o common-obj-$(CONFIG_AUDIO_DSOUND) += dsoundaudio.o common-obj-$(CONFIG_AUDIO_PA) += paaudio.o common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o
@@ -12,8 +11,12 @@ common-obj-y += wavcapture.o sdlaudio.o-cflags := $(SDL_CFLAGS) sdlaudio.o-libs := $(SDL_LIBS) -alsaaudio.o-libs := $(ALSA_LIBS) paaudio.o-libs := $(PULSE_LIBS) coreaudio.o-libs := $(COREAUDIO_LIBS) dsoundaudio.o-libs := $(DSOUND_LIBS) ossaudio.o-libs := $(OSS_LIBS) + +# alsa module +common-obj-$(CONFIG_AUDIO_ALSA) += alsa.mo +alsa.mo-objs = alsaaudio.o +alsa.mo-libs := $(ALSA_LIBS)
Signature · 1 line
2.9.3
PATCH 5/7 audio/oss: build as module
In reply to Gerd Hoffmann--- configure | 2 +- audio/Makefile.objs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-)
configure +1 -1
@@ -5983,7 +5983,7 @@ echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak for drv in $audio_drv_list; do def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]') case "$drv" in - alsa) + alsa | oss) echo "$def=m" >> $config_host_mak ;; *) echo "$def=y" >> $config_host_mak ;;
audio/Makefile.objs +5 -2
@@ -1,6 +1,5 @@ common-obj-y = audio.o noaudio.o wavaudio.o mixeng.o common-obj-$(CONFIG_AUDIO_SDL) += sdlaudio.o -common-obj-$(CONFIG_AUDIO_OSS) += ossaudio.o common-obj-$(CONFIG_SPICE) += spiceaudio.o common-obj-$(CONFIG_AUDIO_COREAUDIO) += coreaudio.o common-obj-$(CONFIG_AUDIO_DSOUND) += dsoundaudio.o
@@ -14,9 +13,13 @@ sdlaudio.o-libs := $(SDL_LIBS) paaudio.o-libs := $(PULSE_LIBS) coreaudio.o-libs := $(COREAUDIO_LIBS) dsoundaudio.o-libs := $(DSOUND_LIBS) -ossaudio.o-libs := $(OSS_LIBS) # alsa module common-obj-$(CONFIG_AUDIO_ALSA) += alsa.mo alsa.mo-objs = alsaaudio.o alsa.mo-libs := $(ALSA_LIBS) + +# oss module +common-obj-$(CONFIG_AUDIO_OSS) += oss.mo +oss.mo-objs = ossaudio.o +oss.mo-libs := $(OSS_LIBS)
Signature · 1 line
2.9.3
PATCH 6/7 audio/pulseaudio: build as module
In reply to Gerd Hoffmann--- configure | 2 +- audio/Makefile.objs | 7 +++++-- 2 files changed, 6 insertions(+), 3 deletions(-)
configure +1 -1
@@ -5983,7 +5983,7 @@ echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak for drv in $audio_drv_list; do def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]') case "$drv" in - alsa | oss) + alsa | oss | pa) echo "$def=m" >> $config_host_mak ;; *) echo "$def=y" >> $config_host_mak ;;
audio/Makefile.objs +5 -2
@@ -3,14 +3,12 @@ common-obj-$(CONFIG_AUDIO_SDL) += sdlaudio.o common-obj-$(CONFIG_SPICE) += spiceaudio.o common-obj-$(CONFIG_AUDIO_COREAUDIO) += coreaudio.o common-obj-$(CONFIG_AUDIO_DSOUND) += dsoundaudio.o -common-obj-$(CONFIG_AUDIO_PA) += paaudio.o common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o common-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o common-obj-y += wavcapture.o sdlaudio.o-cflags := $(SDL_CFLAGS) sdlaudio.o-libs := $(SDL_LIBS) -paaudio.o-libs := $(PULSE_LIBS) coreaudio.o-libs := $(COREAUDIO_LIBS) dsoundaudio.o-libs := $(DSOUND_LIBS)
@@ -23,3 +21,8 @@ alsa.mo-libs := $(ALSA_LIBS) common-obj-$(CONFIG_AUDIO_OSS) += oss.mo oss.mo-objs = ossaudio.o oss.mo-libs := $(OSS_LIBS) + +# pulseaudio module +common-obj-$(CONFIG_AUDIO_PA) += pa.mo +pa.mo-objs = paaudio.o +pa.mo-libs := $(PULSE_LIBS)
Signature · 1 line
2.9.3
PATCH 7/7 audio/sdl: build as module
In reply to Gerd Hoffmann--- configure | 2 +- audio/Makefile.objs | 9 ++++++--- 2 files changed, 7 insertions(+), 4 deletions(-)
configure +1 -1
@@ -5983,7 +5983,7 @@ echo "CONFIG_AUDIO_DRIVERS=$audio_drv_list" >> $config_host_mak for drv in $audio_drv_list; do def=CONFIG_AUDIO_$(echo $drv | LC_ALL=C tr '[a-z]' '[A-Z]') case "$drv" in - alsa | oss | pa) + alsa | oss | pa | sdl) echo "$def=m" >> $config_host_mak ;; *) echo "$def=y" >> $config_host_mak ;;
audio/Makefile.objs +6 -3
@@ -1,5 +1,4 @@ common-obj-y = audio.o noaudio.o wavaudio.o mixeng.o -common-obj-$(CONFIG_AUDIO_SDL) += sdlaudio.o common-obj-$(CONFIG_SPICE) += spiceaudio.o common-obj-$(CONFIG_AUDIO_COREAUDIO) += coreaudio.o common-obj-$(CONFIG_AUDIO_DSOUND) += dsoundaudio.o
@@ -7,8 +6,6 @@ common-obj-$(CONFIG_AUDIO_PT_INT) += audio_pt_int.o common-obj-$(CONFIG_AUDIO_WIN_INT) += audio_win_int.o common-obj-y += wavcapture.o -sdlaudio.o-cflags := $(SDL_CFLAGS) -sdlaudio.o-libs := $(SDL_LIBS) coreaudio.o-libs := $(COREAUDIO_LIBS) dsoundaudio.o-libs := $(DSOUND_LIBS)
@@ -26,3 +23,9 @@ oss.mo-libs := $(OSS_LIBS) common-obj-$(CONFIG_AUDIO_PA) += pa.mo pa.mo-objs = paaudio.o pa.mo-libs := $(PULSE_LIBS) + +# sdl module +common-obj-$(CONFIG_AUDIO_SDL) += sdl.mo +sdl.mo-objs = sdlaudio.o +sdl.mo-cflags := $(SDL_CFLAGS) +sdl.mo-libs := $(SDL_LIBS)
Signature · 1 line
2.9.3
Hi
Quoted 12 lines · Gerd Hoffmann
Add audio driver (host backend) registry. Add audio module support. Enable module builds for alsa, oss, pulse and sdl.
Gerd Hoffmann (7):
audio: add driver registry
audio: add module loading support
build: enable audio modules
audio/alsa: build as module
audio/oss: build as module
audio/pulseaudio: build as module
audio/sdl: build as module
Is this a problem on my side? (configure '--audio-drv-list=oss,alsa,pa,sdl' '--enable-modules')
elmarco@boraha:~/src/qemu/build (master %)$ x86_64-softmmu/qemu-system-x86_64 -audio-help
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-oss.so: undefined
symbol: _TRACE_OSS_INVALID_AVAILABLE_SIZE_DSTATE
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-alsa.so:
undefined symbol: _TRACE_ALSA_XRUN_OUT_DSTATE
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-pa.so: undefined
symbol: audio_pt_unlock_and_signal
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-sdl.so: undefined
symbol: audio_pcm_sw_write
Quoted 23 lines
configure | 7 ++++- Makefile | 4 +++ Makefile.objs | 1 + audio/audio_int.h | 14 ++++----- include/qemu/module.h | 1 + audio/alsaaudio.c | 8 ++++- audio/audio.c | 83 +++++++++++++++++++++++++++++++++++---------------- 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 ++++- audio/Makefile.objs | 30 +++++++++++++------ scripts/create_config | 2 +- 17 files changed, 159 insertions(+), 55 deletions(-)--
2.9.3
Signature · 1 line
Marc-André Lureau
Quoted 19 lines · Marc-André Lureau
Hi
Quoted 12 lines · Gerd Hoffmann
Add audio driver (host backend) registry. Add audio module support. Enable module builds for alsa, oss, pulse and sdl.
Gerd Hoffmann (7):
audio: add driver registry
audio: add module loading support
build: enable audio modules
audio/alsa: build as module
audio/oss: build as module
audio/pulseaudio: build as module
audio/sdl: build as moduleIs this a problem on my side? (configure '--audio-drv-list=oss,alsa,pa,sdl' '--enable-modules')
Quoted 14 lines
elmarco@boraha:~/src/qemu/build (master %)$ x86_64-softmmu/qemu-system-x86_64 -audio-help
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-oss.so: undefined
symbol:_TRACE_OSS_INVALID_AVAILABLE_SIZE_DSTATE
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-alsa.so:
undefined symbol:_TRACE_ALSA_XRUN_OUT_DSTATE
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-pa.so: undefined
symbol:audio_pt_unlock_and_signal
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-sdl.so: undefined
symbol:audio_pcm_sw_write
Works fine here. Tried "make clean && make"?
Qemu build system seems to not rebuild object files when the compiler flags change. So you can't switch between --enable-modules and --disable-modules without "make clean" inbetween. Same issue when patches switch code from compiled-in to modular and you try an incremental build.
I've seen only build failues due to this, not module load errors. But possibly only because I stopped doing incremental builds when working on module patches ...
cheers,
Gerd
Hi
Quoted 35 lines · Gerd Hoffmann
Quoted 19 lines · Marc-André Lureau
Hi
Quoted 12 lines · Gerd Hoffmann
Add audio driver (host backend) registry. Add audio module support. Enable module builds for alsa, oss, pulse and sdl.
Gerd Hoffmann (7):
audio: add driver registry
audio: add module loading support
build: enable audio modules
audio/alsa: build as module
audio/oss: build as module
audio/pulseaudio: build as module
audio/sdl: build as moduleIs this a problem on my side? (configure '--audio-drv-list=oss,alsa,pa,sdl' '--enable-modules')
Quoted 14 lines
elmarco@boraha:~/src/qemu/build (master %)$ x86_64-softmmu/qemu-system-x86_64 -audio-help
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-oss.so: undefined
symbol:_TRACE_OSS_INVALID_AVAILABLE_SIZE_DSTATE
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-alsa.so:
undefined symbol:_TRACE_ALSA_XRUN_OUT_DSTATE
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-pa.so: undefined
symbol:audio_pt_unlock_and_signal
Failed to open module:/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-sdl.so: undefined
symbol:audio_pcm_sw_write
Quoted 7 lines
Works fine here. Tried "make clean && make"?
Qemu build system seems to not rebuild object files when the compiler flags change. So you can't switch between --enable-modules and --disable-modules without "make clean" inbetween. Same issue when patches switch code from compiled-in to modular and you try an incremental build.
Fresh directory, cleaned ccache. That didn't help. fwiw, I am compiling on f27, gcc (GCC) 7.3.1 20180130. I'll investigate further if you can't reproduce.
Quoted 7 lines
I've seen only build failues due to this, not module load errors. But possibly only because I stopped doing incremental builds when working on module patches ...
cheers,
Gerd
Signature · 1 line
Marc-André Lureau
Quoted 6 lines
Quoted 2 lines
Quoted 2 lines
/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-pa.so: undefined
symbol:audio_pt_unlock_and_signalFresh directory, cleaned ccache. That didn't help. fwiw, I am compiling on f27, gcc (GCC) 7.3.1 20180130. I'll investigate further if you can't reproduce.
Hmm, working fine here (both rhel-7 and fedora-27 testbuild container, default build flags).
The symbol in question should be provided by qemu:
kraxel@fedora-64bit ~/projects/qemu/build/fedora# objdump -x audio-pa.so | grep audio_pt_unlock_and_signal
0000000000000000 *UND* 0000000000000000 audio_pt_unlock_and_signal
kraxel@fedora-64bit ~/projects/qemu/build/fedora# objdump -x x86_64-softmmu/qemu-system-x86_64 | grep audio_pt_unlock_and_signal00000000004735f0 g F .text 0000000000000067 audio_pt_unlock_and_signal
Possibly your linker throws it away, thinking there is no user because of the modular drivers?
cheers,
Gerd
Hi
Quoted 12 lines · Gerd Hoffmann
Quoted 6 lines
Quoted 2 lines
Quoted 2 lines
/home/elmarco/src/qemu/build/x86_64-softmmu/../audio-pa.so: undefined
symbol:audio_pt_unlock_and_signalFresh directory, cleaned ccache. That didn't help. fwiw, I am compiling on f27, gcc (GCC) 7.3.1 20180130. I'll investigate further if you can't reproduce.
Hmm, working fine here (both rhel-7 and fedora-27 testbuild container, default build flags).
The symbol in question should be provided by qemu:
Quoted 7 lines
kraxel@fedora-64bit ~/projects/qemu/build/fedora# objdump -x audio-pa.so | grep
audio_pt_unlock_and_signal
0000000000000000 *UND* 0000000000000000audio_pt_unlock_and_signal
kraxel@fedora-64bit ~/projects/qemu/build/fedora# objdump -x x86_64-softmmu/qemu-system-x86_64 | grepaudio_pt_unlock_and_signal00000000004735f0g F .text 0000000000000067audio_pt_unlock_and_signalPossibly your linker throws it away, thinking there is no user because of the modular drivers?
It's not that, but it works if I build qemu with -rdynamic. dlopen(3):
External references in the shared object are resolved using the shared objects in that object's dependency list and any other objects previously opened with the RTLD_GLOBAL flag. If the executable
was linked with the flag "-rdynamic" (or, synonymously,
"--export-dynamic"), then the global symbols in the executable will also be used to resolve references in a dynamically loaded shared object.
(If I understand right, there is some magic rules.mk process-archive-undefs to make sure the used symbols from modules are always linked in)
Could it be that -rdynamic / --export-dynamic is assumed in our build system since modules have been added?
yes, it's pulled from /usr/lib64/pkgconfig/gmodule-2.0.pc, but glib upstream built with meson doesn't have the flag anymore. That's probably worth fixing in glib:
https://bugzilla.gnome.org/show_bug.cgi?id=794123
We should switch to using gmodule-export-2.0.pc (since 2.6), which is also broken in meson build. I'll send a patch for that.
Signature · 1 line
Marc-André Lureau