modules: use gmodule-export.
audio: add driver registry, enable module builds. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQIcBAABAgAGBQJaplmLAAoJEEy22O7T6HE4SQEP/18a0Vqk0ejx3HLzt0NPCiGG nQVPJlZFzEaMf6llMqyNyIQBuwrJJWSpXBF+k70adK984BuE4QoTiJ1ZNDxvRyID Lag3VsIHfmM8v3Nu2SKzy6icIGS4gQOda0G4kwwOXHyHJPmr/OY+JaiFZU8Qz0sb ZXATjoQuJh8PXD8P9k62T5BuTjXA/Hah1dWYn5KzNG8cPTc5dqMvA2KdFlFKcmvT s0isuQ7tDEr1IG+X5LCgFfbNUwjppodc3cxpF9qy+FhbC0RSlovakuFLG7T/PJAs yoDEEAbE3MmuCWWGN7eJ1iyHtz4B/kPl5cYYOiCUQ3rPNxuaTCjO9LXAcX9kBxg2 ZM6FAmOKrMPTFVDsmsJi1eUn5d/batsE3aMgUNVlK+3pJwGr7J/B1LdKN0pU3zic rWcyLGU8SWfhmjiWEG20iL6kHhcKjW1Y9NtiBhICmR/3+Y3DHCSPSxbvzIW/ECaN 9PEdjPukMHMfZD1yY1sSGNNtFNj+3rRXThfQJktzkHU+RnaRouimfOzPZT58c3HR vwQu6pBYJydpUY8g7WzCfY7l+jVanuXNOPIWzlQNB8l0gjL0Xyq9sxrBAT8TghCX Y3JeN/WIeMM4+QTeQHoR8A9xmqZ2IcUmE6mT5Wj/eXE/SiO6/2KGUArn4dQSnPMF 9ufxaJvtr+YDNcExCbSL =CjTD -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/kraxel/tags/audio-20180312-pull-request' into staging modules: use gmodule-export. audio: add driver registry, enable module builds. # gpg: Signature made Mon 12 Mar 2018 10:42:19 GMT # gpg: using RSA key 4CB6D8EED3E87138 # gpg: Good signature from "Gerd Hoffmann (work) <kraxel@redhat.com>" # gpg: aka "Gerd Hoffmann <gerd@kraxel.org>" # gpg: aka "Gerd Hoffmann (private) <kraxel@gmail.com>" # Primary key fingerprint: A032 8CFF B93A 17A7 9901 FE7D 4CB6 D8EE D3E8 7138 * remotes/kraxel/tags/audio-20180312-pull-request: audio/sdl: build as module audio/pulseaudio: build as module audio/oss: build as module audio/alsa: build as module build: enable audio modules audio: add module loading support audio: add driver registry modules: use gmodule-export Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
		
						commit
						6ceb1b51f0
					
				
							
								
								
									
										4
									
								
								Makefile
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								Makefile
									
									
									
									
									
								
							| @ -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 | ||||
|  | ||||
| @ -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/ | ||||
|  | ||||
| @ -1,19 +1,31 @@ | ||||
| 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_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 | ||||
| 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) | ||||
| 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) | ||||
| 
 | ||||
| # oss module
 | ||||
| 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) | ||||
| 
 | ||||
| # sdl module
 | ||||
| common-obj-$(CONFIG_AUDIO_SDL) += sdl.mo | ||||
| sdl.mo-objs = sdlaudio.o | ||||
| sdl.mo-cflags := $(SDL_CFLAGS) | ||||
| sdl.mo-libs := $(SDL_LIBS) | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -45,15 +45,49 @@ | ||||
|    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; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     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; | ||||
| @ -1656,11 +1690,13 @@ static void audio_pp_nb_voices (const char *typ, int nb) | ||||
| 
 | ||||
| void AUD_help (void) | ||||
| { | ||||
|     size_t i; | ||||
|     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); | ||||
|     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 +1708,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 +1842,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 +1878,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"); | ||||
|     } | ||||
|  | ||||
| @ -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); | ||||
| 
 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
							
								
								
									
										9
									
								
								configure
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										9
									
								
								configure
									
									
									
									
										vendored
									
									
								
							| @ -3354,7 +3354,7 @@ else | ||||
| fi | ||||
| glib_modules=gthread-2.0 | ||||
| if test "$modules" = yes; then | ||||
|     glib_modules="$glib_modules gmodule-2.0" | ||||
|     glib_modules="$glib_modules gmodule-export-2.0" | ||||
| fi | ||||
| 
 | ||||
| # This workaround is required due to a bug in pkg-config file for glib as it | ||||
| @ -5974,7 +5974,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 | oss | pa | sdl) | ||||
| 	    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 | ||||
|  | ||||
| @ -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); | ||||
|  | ||||
| @ -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 "" | ||||
|     ;; | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Peter Maydell
						Peter Maydell