On Thu, Oct 7, 2021 at 5:07 PM Paolo Bonzini wrote: > This brings a change that makes audio drivers more similar to all > other modules. All drivers are built by default, while > --audio-drv-list only governs the default choice of the audio driver. > > Meson options are added to disable the drivers, and the next patches > will fix the help messages and command line options, and especially > make the non-default drivers available via -audiodev. > > Cc: Gerd Hoffman > Cc: Volker Rümelin > Signed-off-by: Paolo Bonzini > tricky.. but lgtm Reviewed-by: Marc-André Lureau --- > audio/meson.build | 23 +++--- > configure | 184 +--------------------------------------------- > meson.build | 137 +++++++++++++++++++++++++++++----- > meson_options.txt | 18 ++++- > 4 files changed, 147 insertions(+), 215 deletions(-) > > diff --git a/audio/meson.build b/audio/meson.build > index 9a95c58f18..462533bb8c 100644 > --- a/audio/meson.build > +++ b/audio/meson.build > @@ -7,23 +7,22 @@ softmmu_ss.add(files( > 'wavcapture.c', > )) > > -softmmu_ss.add(when: [coreaudio, 'CONFIG_AUDIO_COREAUDIO'], if_true: > files('coreaudio.c')) > -softmmu_ss.add(when: [dsound, 'CONFIG_AUDIO_DSOUND'], > - if_true: files('dsoundaudio.c', 'audio_win_int.c')) > +softmmu_ss.add(when: coreaudio, if_true: files('coreaudio.c')) > +softmmu_ss.add(when: dsound, if_true: files('dsoundaudio.c', > 'audio_win_int.c')) > > audio_modules = {} > foreach m : [ > - ['CONFIG_AUDIO_ALSA', 'alsa', alsa, 'alsaaudio.c'], > - ['CONFIG_AUDIO_OSS', 'oss', oss, 'ossaudio.c'], > - ['CONFIG_AUDIO_PA', 'pa', pulse, 'paaudio.c'], > - ['CONFIG_AUDIO_SDL', 'sdl', sdl, 'sdlaudio.c'], > - ['CONFIG_AUDIO_JACK', 'jack', jack, 'jackaudio.c'], > - ['CONFIG_SPICE', 'spice', spice, 'spiceaudio.c'] > + ['alsa', alsa, files('alsaaudio.c')], > + ['oss', oss, files('ossaudio.c')], > + ['pa', pulse, files('paaudio.c')], > + ['sdl', sdl, files('sdlaudio.c')], > + ['jack', jack, files('jackaudio.c')], > + ['spice', spice, files('spiceaudio.c')] > ] > - if config_host.has_key(m[0]) > + if m[1].found() > module_ss = ss.source_set() > - module_ss.add(when: m[2], if_true: files(m[3])) > - audio_modules += {m[1] : module_ss} > + module_ss.add(m[1], m[2]) > + audio_modules += {m[0] : module_ss} > endif > endforeach > > diff --git a/configure b/configure > index 6a6273ce7b..fcadcf9577 100755 > --- a/configure > +++ b/configure > @@ -240,7 +240,7 @@ interp_prefix="/usr/gnemul/qemu-%M" > static="no" > cross_compile="no" > cross_prefix="" > -audio_drv_list="" > +audio_drv_list="default" > block_drv_rw_whitelist="" > block_drv_ro_whitelist="" > block_drv_whitelist_tools="no" > @@ -299,7 +299,6 @@ fdt="auto" > netmap="no" > sdl="auto" > sdl_image="auto" > -coreaudio="auto" > virtiofsd="auto" > virtfs="auto" > libudev="auto" > @@ -356,7 +355,6 @@ module_upgrades="no" > prefix="/usr/local" > qemu_suffix="qemu" > slirp="auto" > -oss_lib="" > bsd="no" > linux="no" > solaris="no" > @@ -703,54 +701,35 @@ fi > case $targetos in > MINGW32*) > mingw32="yes" > - audio_possible_drivers="dsound sdl" > - if check_include dsound.h; then > - audio_drv_list="dsound" > - else > - audio_drv_list="" > - fi > supported_os="yes" > plugins="no" > pie="no" > ;; > GNU/kFreeBSD) > bsd="yes" > - audio_drv_list="oss try-sdl" > - audio_possible_drivers="oss sdl pa" > ;; > FreeBSD) > bsd="yes" > bsd_user="yes" > make="${MAKE-gmake}" > - audio_drv_list="oss try-sdl" > - audio_possible_drivers="oss sdl pa" > # needed for kinfo_getvmmap(3) in libutil.h > netmap="" # enable netmap autodetect > ;; > DragonFly) > bsd="yes" > make="${MAKE-gmake}" > - audio_drv_list="oss try-sdl" > - audio_possible_drivers="oss sdl pa" > ;; > NetBSD) > bsd="yes" > make="${MAKE-gmake}" > - audio_drv_list="oss try-sdl" > - audio_possible_drivers="oss sdl" > - oss_lib="-lossaudio" > ;; > OpenBSD) > bsd="yes" > make="${MAKE-gmake}" > - audio_drv_list="try-sdl" > - audio_possible_drivers="sdl" > ;; > Darwin) > bsd="yes" > darwin="yes" > - audio_drv_list="try-coreaudio try-sdl" > - audio_possible_drivers="coreaudio sdl" > # Disable attempts to use ObjectiveC features in os/object.h since they > # won't work when we're compiling with gcc as a C compiler. > QEMU_CFLAGS="-DOS_OBJECT_USE_OBJC=0 $QEMU_CFLAGS" > @@ -759,10 +738,6 @@ SunOS) > solaris="yes" > make="${MAKE-gmake}" > smbd="${SMBD-/usr/sfw/sbin/smbd}" > - if test -f /usr/include/sys/soundcard.h ; then > - audio_drv_list="oss try-sdl" > - fi > - audio_possible_drivers="oss sdl" > # needed for CMSG_ macros in sys/socket.h > QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS" > # needed for TIOCWIN* defines in termios.h > @@ -774,8 +749,6 @@ Haiku) > QEMU_CFLAGS="-DB_USE_POSITIVE_POSIX_ERRORS -D_BSD_SOURCE -fPIC > $QEMU_CFLAGS" > ;; > Linux) > - audio_drv_list="try-pa oss" > - audio_possible_drivers="oss alsa sdl pa" > linux="yes" > linux_user="yes" > vhost_user=${default_feature:-yes} > @@ -1795,7 +1768,6 @@ Advanced options (experts only): > --disable-werror disable compilation abort on warning > --disable-stack-protector disable compiler-provided stack protection > --audio-drv-list=LIST set audio drivers list: > - Available drivers: $audio_possible_drivers > --block-drv-whitelist=L Same as --block-drv-rw-whitelist=L > --block-drv-rw-whitelist=L > set block driver read-write whitelist > @@ -2398,12 +2370,6 @@ if test -z "$want_tools"; then > fi > fi > > -########################################## > -# Disable features only meaningful for system-mode emulation > -if test "$softmmu" = "no"; then > - audio_drv_list="" > -fi > - > ########################################## > # L2TPV3 probe > > @@ -2982,130 +2948,6 @@ EOF > fi > fi > > -########################################## > -# detect CoreAudio > -if test "$coreaudio" != "no" ; then > - coreaudio_libs="-framework CoreAudio" > - cat > $TMPC << EOF > -#include > -int main(void) > -{ > - return (int)AudioGetCurrentHostTime(); > -} > -EOF > - if compile_prog "" "$coreaudio_libs" ; then > - coreaudio=yes > - else > - coreaudio=no > - fi > -fi > - > -########################################## > -# Sound support libraries probe > - > -audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/,/ /g') > -for drv in $audio_drv_list; do > - case $drv in > - alsa | try-alsa) > - if $pkg_config alsa --exists; then > - alsa_libs=$($pkg_config alsa --libs) > - alsa_cflags=$($pkg_config alsa --cflags) > - alsa=yes > - if test "$drv" = "try-alsa"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-alsa/alsa/') > - fi > - else > - if test "$drv" = "try-alsa"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-alsa//') > - else > - error_exit "$drv check failed" \ > - "Make sure to have the $drv libs and headers installed." > - fi > - fi > - ;; > - > - pa | try-pa) > - if $pkg_config libpulse --exists; then > - libpulse=yes > - pulse_libs=$($pkg_config libpulse --libs) > - pulse_cflags=$($pkg_config libpulse --cflags) > - if test "$drv" = "try-pa"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-pa/pa/') > - fi > - else > - if test "$drv" = "try-pa"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-pa//') > - else > - error_exit "$drv check failed" \ > - "Make sure to have the $drv libs and headers installed." > - fi > - fi > - ;; > - > - sdl) > - if test "$sdl" = "no"; then > - error_exit "sdl not found or disabled, can not use sdl audio > driver" > - fi > - ;; > - > - try-sdl) > - if test "$sdl" = "no"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl//') > - else > - audio_drv_list=$(echo "$audio_drv_list" | sed -e 's/try-sdl/sdl/') > - fi > - ;; > - > - coreaudio | try-coreaudio) > - if test "$coreaudio" = "no"; then > - if test "$drv" = "try-coreaudio"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-coreaudio//') > - else > - error_exit "$drv check failed" \ > - "Make sure to have the $drv is available." > - fi > - else > - coreaudio_libs="-framework CoreAudio" > - if test "$drv" = "try-coreaudio"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-coreaudio/coreaudio/') > - fi > - fi > - ;; > - > - dsound) > - dsound_libs="-lole32 -ldxguid" > - ;; > - > - oss) > - oss_libs="$oss_lib" > - ;; > - > - jack | try-jack) > - if $pkg_config jack --exists; then > - libjack=yes > - jack_libs=$($pkg_config jack --libs) > - if test "$drv" = "try-jack"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-jack/jack/') > - fi > - else > - if test "$drv" = "try-jack"; then > - audio_drv_list=$(echo "$audio_drv_list" | sed -e > 's/try-jack//') > - else > - error_exit "$drv check failed" \ > - "Make sure to have the $drv libs and headers installed." > - fi > - fi > - ;; > - > - *) > - echo "$audio_possible_drivers" | grep -q "\<$drv\>" || { > - error_exit "Unknown driver '$drv' selected" \ > - "Possible drivers are: $audio_possible_drivers" > - } > - ;; > - esac > -done > - > ########################################## > # plugin linker support probe > > @@ -4536,28 +4378,6 @@ fi > if test "$gprof" = "yes" ; then > echo "CONFIG_GPROF=y" >> $config_host_mak > 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 > -done > -if test "$alsa" = "yes" ; then > - echo "CONFIG_ALSA=y" >> $config_host_mak > -fi > -echo "ALSA_LIBS=$alsa_libs" >> $config_host_mak > -echo "ALSA_CFLAGS=$alsa_cflags" >> $config_host_mak > -if test "$libpulse" = "yes" ; then > - echo "CONFIG_LIBPULSE=y" >> $config_host_mak > -fi > -echo "PULSE_LIBS=$pulse_libs" >> $config_host_mak > -echo "PULSE_CFLAGS=$pulse_cflags" >> $config_host_mak > -echo "COREAUDIO_LIBS=$coreaudio_libs" >> $config_host_mak > -echo "DSOUND_LIBS=$dsound_libs" >> $config_host_mak > -echo "OSS_LIBS=$oss_libs" >> $config_host_mak > -if test "$libjack" = "yes" ; then > - echo "CONFIG_LIBJACK=y" >> $config_host_mak > -fi > -echo "JACK_LIBS=$jack_libs" >> $config_host_mak > echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> > $config_host_mak > echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> > $config_host_mak > if test "$block_drv_whitelist_tools" = "yes" ; then > @@ -5195,7 +5015,7 @@ if test "$skip_meson" = no; then > -Dvhost_user_blk_server=$vhost_user_blk_server > -Dmultiprocess=$multiprocess \ > -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek > -Dguest_agent_msi=$guest_agent_msi -Dbpf=$bpf\ > $(if test "$default_feature" = no; then echo > "-Dauto_features=disabled"; fi) \ > - -Dtcg_interpreter=$tcg_interpreter \ > + -Daudio_drv_list=$audio_drv_list > -Dtcg_interpreter=$tcg_interpreter \ > $cross_arg \ > "$PWD" "$source_path" > > diff --git a/meson.build b/meson.build > index 7b596fdcd9..13b725181a 100644 > --- a/meson.build > +++ b/meson.build > @@ -430,20 +430,23 @@ vde = not_found > if config_host.has_key('CONFIG_VDE') > vde = declare_dependency(link_args: config_host['VDE_LIBS'].split()) > endif > + > pulse = not_found > -if 'CONFIG_LIBPULSE' in config_host > - pulse = declare_dependency(compile_args: > config_host['PULSE_CFLAGS'].split(), > - link_args: config_host['PULSE_LIBS'].split()) > +if not get_option('pa').auto() or (targetos == 'linux' and have_system) > + pulse = dependency('libpulse', required: get_option('pa'), > + method: 'pkg-config', kwargs: static_kwargs) > endif > alsa = not_found > -if 'CONFIG_ALSA' in config_host > - alsa = declare_dependency(compile_args: > config_host['ALSA_CFLAGS'].split(), > - link_args: config_host['ALSA_LIBS'].split()) > +if not get_option('alsa').auto() or (targetos == 'linux' and have_system) > + alsa = dependency('alsa', required: get_option('alsa'), > + method: 'pkg-config', kwargs: static_kwargs) > endif > jack = not_found > -if 'CONFIG_LIBJACK' in config_host > - jack = declare_dependency(link_args: config_host['JACK_LIBS'].split()) > +if not get_option('jack').auto() or have_system > + jack = dependency('jack', required: get_option('jack'), > + method: 'pkg-config', kwargs: static_kwargs) > endif > + > spice = not_found > spice_headers = not_found > spice_protocol = not_found > @@ -803,16 +806,59 @@ if liblzfse.found() and not cc.links(''' > endif > > oss = not_found > -if 'CONFIG_AUDIO_OSS' in config_host > - oss = declare_dependency(link_args: config_host['OSS_LIBS'].split()) > +if not get_option('oss').auto() or have_system > + if not cc.has_header('sys/soundcard.h') > + # not found > + elif targetos == 'netbsd' > + oss = cc.find_library('ossaudio', required: get_option('oss'), > + kwargs: static_kwargs) > + else > + oss = declare_dependency() > + endif > + > + if not oss.found() > + if get_option('oss').enabled() > + error('OSS not found') > + else > + warning('OSS not found, disabling') > + endif > + endif > endif > dsound = not_found > -if 'CONFIG_AUDIO_DSOUND' in config_host > - dsound = declare_dependency(link_args: > config_host['DSOUND_LIBS'].split()) > +if not get_option('dsound').auto() or (targetos == 'windows' and > have_system) > + if cc.has_header('dsound.h') > + dsound = declare_dependency(link_args: ['-lole32', '-ldxguid']) > + endif > + > + if not dsound.found() > + if get_option('dsound').enabled() > + error('DirectSound not found') > + else > + warning('DirectSound not found, disabling') > + endif > + endif > endif > + > coreaudio = not_found > -if 'CONFIG_AUDIO_COREAUDIO' in config_host > - coreaudio = declare_dependency(link_args: > config_host['COREAUDIO_LIBS'].split()) > +if not get_option('coreaudio').auto() or (targetos == 'darwin' and > have_system) > + coreaudio = dependency('appleframeworks', modules: 'CoreAudio', > + required: get_option('coreaudio')) > + if coreaudio.found() and not cc.links(''' > + #include > + int main(void) > + { > + return (int)AudioGetCurrentHostTime(); > + }''') > + coreaudio = not_found > + endif > + > + if not coreaudio.found() > + if get_option('coreaudio').enabled() > + error('CoreAudio not found') > + else > + warning('CoreAudio not found, disabling') > + endif > + endif > endif > > opengl = not_found > @@ -1158,6 +1204,49 @@ if libbpf.found() and not cc.links(''' > endif > endif > > +################# > +# config-host.h # > +################# > + > +audio_drivers_selected = [] > +if have_system > + audio_drivers_available = { > + 'alsa': alsa.found(), > + 'coreaudio': coreaudio.found(), > + 'dsound': dsound.found(), > + 'jack': jack.found(), > + 'oss': oss.found(), > + 'pa': pulse.found(), > + 'sdl': sdl.found(), > + } > + > + # Default to native drivers first, OSS second, SDL third > + audio_drivers_priority = \ > + [ 'pa', 'coreaudio', 'dsound', 'oss' ] + \ > + (targetos == 'linux' ? [] : [ 'sdl' ]) > + audio_drivers_default = [] > + foreach k: audio_drivers_priority > + if audio_drivers_available[k] > + audio_drivers_default += k > + endif > + endforeach > + > + foreach k: get_option('audio_drv_list') > + if k == 'default' > + audio_drivers_selected += audio_drivers_default > + elif not audio_drivers_available[k] > + error('Audio driver "@0@" not available.'.format(k)) > + else > + audio_drivers_selected += k > + endif > + endforeach > +endif > +foreach k: audio_drivers_selected > + config_host_data.set('CONFIG_AUDIO_' + k.to_upper(), true) > +endforeach > +config_host_data.set('CONFIG_AUDIO_DRIVERS', > + '"' + '", "'.join(audio_drivers_selected) + '", ') > + > if get_option('cfi') > cfi_flags=[] > # Check for dependency on LTO > @@ -1201,10 +1290,6 @@ endif > have_host_block_device = (targetos != 'darwin' or > cc.has_header('IOKit/storage/IOMedia.h')) > > -################# > -# config-host.h # > -################# > - > have_virtfs = (targetos == 'linux' and > have_system and > libattr.found() and > @@ -1449,7 +1534,7 @@ config_host_data.set('HAVE_BROKEN_SIZE_MAX', not > cc.compiles(''' > > > ignored = ['CONFIG_QEMU_INTERP_PREFIX'] # actually per-target > -arrays = ['CONFIG_AUDIO_DRIVERS', 'CONFIG_BDRV_RW_WHITELIST', > 'CONFIG_BDRV_RO_WHITELIST'] > +arrays = ['CONFIG_BDRV_RW_WHITELIST', 'CONFIG_BDRV_RO_WHITELIST'] > strings = ['HOST_DSOSUF', 'CONFIG_IASL'] > foreach k, v: config_host > if ignored.contains(k) > @@ -2885,7 +2970,7 @@ if config_host.has_key('CONFIG_MODULES') > endif > summary_info += {'fuzzing support': config_host.has_key('CONFIG_FUZZ')} > if have_system > - summary_info += {'Audio drivers': > config_host['CONFIG_AUDIO_DRIVERS']} > + summary_info += {'Audio drivers': ' '.join(audio_drivers_selected)} > endif > summary_info += {'Trace backends': config_host['TRACE_BACKENDS']} > if config_host['TRACE_BACKENDS'].split().contains('simple') > @@ -3073,6 +3158,18 @@ if vnc.found() > summary_info += {'VNC JPEG support': jpeg} > summary_info += {'VNC PNG support': png} > endif > +if targetos not in ['darwin', 'haiku', 'windows'] > + summary_info += {'OSS support': oss} > +elif targetos == 'darwin' > + summary_info += {'CoreAudio support': coreaudio} > +elif targetos == 'windows' > + summary_info += {'DirectSound support': dsound} > +endif > +if targetos == 'linux' > + summary_info += {'ALSA support': alsa} > + summary_info += {'PulseAudio support': pulse} > +endif > +summary_info += {'JACK support': jack} > summary_info += {'brlapi support': brlapi} > summary_info += {'vde support': config_host.has_key('CONFIG_VDE')} > summary_info += {'netmap support': > config_host.has_key('CONFIG_NETMAP')} > diff --git a/meson_options.txt b/meson_options.txt > index 2c89e79e8b..052c4f088e 100644 > --- a/meson_options.txt > +++ b/meson_options.txt > @@ -6,9 +6,12 @@ option('qemu_firmwarepath', type : 'string', value : '', > description: 'search PATH for firmware files') > option('sphinx_build', type : 'string', value : '', > description: 'Use specified sphinx-build [$sphinx_build] for > building document (default to be empty)') > - > option('default_devices', type : 'boolean', value : true, > description: 'Include a default selection of devices in emulators') > +option('audio_drv_list', type: 'array', value: ['default'], > + choices: ['alsa', 'coreaudio', 'default', 'dsound', 'jack', 'oss', > 'pa', 'sdl'], > + description: 'Set audio driver list') > + > option('docs', type : 'feature', value : 'auto', > description: 'Documentations build support') > option('gettext', type : 'feature', value : 'auto', > @@ -139,6 +142,19 @@ option('fuse', type: 'feature', value: 'auto', > option('fuse_lseek', type : 'feature', value : 'auto', > description: 'SEEK_HOLE/SEEK_DATA support for FUSE exports') > > +option('alsa', type: 'feature', value: 'auto', > + description: 'ALSA sound support') > +option('coreaudio', type: 'feature', value: 'auto', > + description: 'CoreAudio sound support') > +option('dsound', type: 'feature', value: 'auto', > + description: 'DirectSound sound support') > +option('jack', type: 'feature', value: 'auto', > + description: 'JACK sound support') > +option('oss', type: 'feature', value: 'auto', > + description: 'OSS sound support') > +option('pa', type: 'feature', value: 'auto', > + description: 'PulseAudio sound support') > + > option('vhost_user_blk_server', type: 'feature', value: 'auto', > description: 'build vhost-user-blk server') > option('virtfs', type: 'feature', value: 'auto', > -- > 2.31.1 > > > > -- Marc-André Lureau