Simple Directmedia Layer
Go to file
Sam Lantinga a8400dc3bf Fixed bug 5105 - sndio support not working in dynamic mode (dlopen)
Giovanni Bajo

The CMake build system supports several audio frameworks for Linux: one of them is sndio.

All frameworks can be built with "runtime linking" (that is, using dlopen to load the library at runtime). In sdlchecks.cmake, there's code to do the same with sndio:

=================================================================
# Requires:
# - n/a
# Optional:
# - SNDIO_SHARED opt
# - HAVE_DLOPEN opt
macro(CheckSNDIO)
  if(SNDIO)
    # TODO: set include paths properly, so the sndio headers are found
    check_include_file(sndio.h HAVE_SNDIO_H)
    find_library(D_SNDIO_LIB sndio)
    if(HAVE_SNDIO_H AND D_SNDIO_LIB)
      set(HAVE_SNDIO TRUE)
      file(GLOB SNDIO_SOURCES ${SDL2_SOURCE_DIR}/src/audio/sndio/*.c)
      set(SOURCE_FILES ${SOURCE_FILES} ${SNDIO_SOURCES})
      set(SDL_AUDIO_DRIVER_SNDIO 1)
      if(SNDIO_SHARED)
        if(NOT HAVE_DLOPEN)
          message_warn("You must have SDL_LoadObject() support for dynamic sndio loading")
        else()
          FindLibraryAndSONAME("sndio")
          set(SDL_AUDIO_DRIVER_SNDIO_DYNAMIC "\"${SNDIO_LIB_SONAME}\"")
          set(HAVE_SNDIO_SHARED TRUE)
        endif()
      else()
        list(APPEND EXTRA_LIBS ${D_SNDIO_LIB})
      endif()
      set(HAVE_SDL_AUDIO TRUE)
    endif()
  endif()
endmacro()
=================================================================

The feature is gated by an option called SNDIO_SHARED. It is also fully implemented in SDL_sndioaudio.c

Unfortunately, it seems there is a missing line in CMakeLists.txt, so SNDIO_SHARED is not defined:

======================================================================
set_option(ALSA                "Support the ALSA audio API" ${UNIX_SYS})
dep_option(ALSA_SHARED         "Dynamically load ALSA audio support" ON "ALSA" OFF)
set_option(JACK                "Support the JACK audio API" ${UNIX_SYS})
dep_option(JACK_SHARED         "Dynamically load JACK audio support" ON "JACK" OFF)
set_option(ESD                 "Support the Enlightened Sound Daemon" ${UNIX_SYS})
dep_option(ESD_SHARED          "Dynamically load ESD audio support" ON "ESD" OFF)
set_option(PULSEAUDIO          "Use PulseAudio" ${UNIX_SYS})
dep_option(PULSEAUDIO_SHARED   "Dynamically load PulseAudio support" ON "PULSEAUDIO" OFF)
set_option(ARTS                "Support the Analog Real Time Synthesizer" ${UNIX_SYS})
dep_option(ARTS_SHARED         "Dynamically load aRts audio support" ON "ARTS" OFF)
set_option(NAS                 "Support the NAS audio API" ${UNIX_SYS})
set_option(NAS_SHARED          "Dynamically load NAS audio API" ${UNIX_SYS})
set_option(SNDIO               "Support the sndio audio API" ${UNIX_SYS})
set_option(FUSIONSOUND         "Use FusionSound audio driver" OFF)
dep_option(FUSIONSOUND_SHARED  "Dynamically load fusionsound audio support" ON "FUSIONSOUND" OFF)
======================================================================

You can see that all frameworks define a "dep_option" NAME_SHARED, and SNDIO is the only one where the option is missing.

This means that runtime loading of sndio is never activated. If sndio is found at configuration time, it is always activated in "linked" mode, so that the final binary will have a load-time dependency with libsdnio. This is unfortunate.

To fix the problem, it is sufficient to add this line:

dep_option(SNDIO_SHARED        "Dynamically load the sndio audio API" ${UNIX_SYS} ON "SNDIO" OFF)

I've verified that this fixes the bug, and sndio can now be dynamically loaded as expected.
2020-05-29 16:31:05 -07:00
acinclude Added missing PKG_CONFIG macros 2019-03-16 17:39:15 -07:00
android-project Don't bother logging security exception getting the device serial number 2020-05-29 15:40:17 -07:00
android-project-ant Added the old ant Android build project structure 2017-10-28 12:11:25 -07:00
build-scripts Fixed mkdir warning when running iosbuild.sh multiple times 2020-05-27 09:57:51 -07:00
cmake cmake: Set HAVE_VIDEO_WAYLAND_QT_TOUCH if appropriate (thanks, Michael!). 2020-04-14 18:14:39 -04:00
debian Backed out changeset 51622f74dc85 2020-03-10 18:35:31 -07:00
docs docs: README-linux.md updated for a modern Ubuntu release. 2020-05-14 21:54:51 -04:00
include Fixed bug 5145 - Fix whitespace in SDL_vulkan.h 2020-05-29 16:28:56 -07:00
src Fixed bug 5146 - SDL_RenderFillRect doesn't work in DirectFB 2020-05-29 16:02:49 -07:00
test locale: Implemented SDL_GetPreferredLocales(). 2020-05-04 02:27:29 -04:00
VisualC locale: Implemented SDL_GetPreferredLocales(). 2020-05-04 02:27:29 -04:00
VisualC-WinRT locale: Implemented SDL_GetPreferredLocales(). 2020-05-04 02:27:29 -04:00
visualtest test: unify all the command line usage logging. 2019-05-28 17:39:13 -04:00
wayland-protocols wayland: ask xdg-decoration protocol extension to use server-side decorations if possible. 2018-11-04 21:08:40 +01:00
Xcode xcode: make sure locale sources are used in all targets. 2020-05-18 21:07:02 -04:00
Xcode-iOS locale: Implemented SDL_GetPreferredLocales(). 2020-05-04 02:27:29 -04:00
.hgignore Fixed bug 4965 - Update the .hgignore file 2020-02-03 16:38:07 -08:00
Android.mk locale: Implemented SDL_GetPreferredLocales(). 2020-05-04 02:27:29 -04:00
autogen.sh
BUGS.txt BUGS.txt: Changed mailing list link to discourse.libsdl.org. 2017-04-01 00:05:25 -04:00
cmake_uninstall.cmake.in Fixed bug 3867 - Can't find install_manifest.txt when running 'uninstall' target 2017-10-12 08:44:45 -07:00
CMakeLists.txt Fixed bug 5105 - sndio support not working in dynamic mode (dlopen) 2020-05-29 16:31:05 -07:00
configure configure: fix fcitx tests. 2020-05-20 16:34:19 -04:00
configure.ac Don't include the iOS joystick driver if joysticks are disabled 2020-05-27 10:35:43 -07:00
COPYING.txt Updated copyright date for 2020 2020-01-16 20:49:25 -08:00
CREDITS.txt
INSTALL.txt More HTTPS doc tweaks. 2017-02-16 16:59:07 -05:00
Makefile.in locale: Implemented SDL_GetPreferredLocales(). 2020-05-04 02:27:29 -04:00
Makefile.minimal Added a dummy sensor driver 2018-08-21 13:29:21 -07:00
Makefile.os2 OS/2: Forgot to add locale source dir to makefile. 2020-05-18 20:18:34 -04:00
Makefile.pandora Added a dummy sensor driver 2018-08-21 13:29:21 -07:00
Makefile.psp added SDL_strtokr() as a replacement for POSIX strtok_r (bug #4046.) 2019-11-20 20:40:50 +03:00
Makefile.wiz Added a dummy sensor driver 2018-08-21 13:29:21 -07:00
README-SDL.txt
README.txt
sdl2-config-version.cmake.in cmake: Forgot to add this file to revision control. 2020-02-25 14:52:03 -05:00
sdl2-config.cmake.in build: Merge pkg-config Libs.private into Libs for static-only builds 2020-04-11 23:38:34 +01:00
sdl2-config.in build: Don't duplicate Libs in Libs.private in pkg-config file 2020-04-12 13:24:36 +01:00
sdl2.m4 Fixed bug 4544 - SDL2.m4 SDL2.framework patch made it impossible to fail detection 2019-03-16 18:45:10 -07:00
sdl2.pc.in build: Merge pkg-config Libs.private into Libs for static-only builds 2020-04-11 23:38:34 +01:00
SDL2.spec.in Fixed bug 4615 - RPM Build fails due to unpackaged files 2019-06-11 19:58:10 -07:00
SDL2Config.cmake Fixed bug 3651 - CMake build does not install CMake package configuration 2017-08-09 19:03:10 -07:00
TODO.txt
VisualC.html
WhatsNew.txt Updated WhatsNew.txt with SDL 2.0.12 release notes 2020-03-02 11:39:44 -08:00

                         Simple DirectMedia Layer

                                  (SDL)

                                Version 2.0

---
https://www.libsdl.org/

Simple DirectMedia Layer is a cross-platform development library designed
to provide low level access to audio, keyboard, mouse, joystick, and graphics
hardware via OpenGL and Direct3D. It is used by video playback software,
emulators, and popular games including Valve's award winning catalog
and many Humble Bundle games.

More extensive documentation is available in the docs directory, starting
with README.md

Enjoy!
	Sam Lantinga				(slouken@libsdl.org)