# Distributed under the OSI-approved BSD 3-Clause License.  See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.

#.rst:
# FindSDL_sound
# -------------
#
# Locates the SDL_sound library
#
#
#
# This module depends on SDL being found and must be called AFTER
# FindSDL.cmake is called.
#
# This module defines
#
# ::
#
#   SDL_SOUND_INCLUDE_DIR, where to find SDL_sound.h
#   SDL_SOUND_FOUND, if false, do not try to link to SDL_sound
#   SDL_SOUND_LIBRARIES, this contains the list of libraries that you need
#     to link against.
#   SDL_SOUND_EXTRAS, this is an optional variable for you to add your own
#     flags to SDL_SOUND_LIBRARIES. This is prepended to SDL_SOUND_LIBRARIES.
#     This is available mostly for cases this module failed to anticipate for
#     and you must add additional flags. This is marked as ADVANCED.
#   SDL_SOUND_VERSION_STRING, human-readable string containing the
#     version of SDL_sound
#
#
#
# This module also defines (but you shouldn't need to use directly)
#
# ::
#
#    SDL_SOUND_LIBRARY, the name of just the SDL_sound library you would link
#    against. Use SDL_SOUND_LIBRARIES for you link instructions and not this one.
#
# And might define the following as needed
#
# ::
#
#    MIKMOD_LIBRARY
#    MODPLUG_LIBRARY
#    OGG_LIBRARY
#    VORBIS_LIBRARY
#    SMPEG_LIBRARY
#    FLAC_LIBRARY
#    SPEEX_LIBRARY
#
#
#
# Typically, you should not use these variables directly, and you should
# use SDL_SOUND_LIBRARIES which contains SDL_SOUND_LIBRARY and the other
# audio libraries (if needed) to successfully compile on your system.
#
# Created by Eric Wing.  This module is a bit more complicated than the
# other FindSDL* family modules.  The reason is that SDL_sound can be
# compiled in a large variety of different ways which are independent of
# platform.  SDL_sound may dynamically link against other 3rd party
# libraries to get additional codec support, such as Ogg Vorbis, SMPEG,
# ModPlug, MikMod, FLAC, Speex, and potentially others.  Under some
# circumstances which I don't fully understand, there seems to be a
# requirement that dependent libraries of libraries you use must also be
# explicitly linked against in order to successfully compile.  SDL_sound
# does not currently have any system in place to know how it was
# compiled.  So this CMake module does the hard work in trying to
# discover which 3rd party libraries are required for building (if any).
# This module uses a brute force approach to create a test program that
# uses SDL_sound, and then tries to build it.  If the build fails, it
# parses the error output for known symbol names to figure out which
# libraries are needed.
#
# Responds to the $SDLDIR and $SDLSOUNDDIR environmental variable that
# would correspond to the ./configure --prefix=$SDLDIR used in building
# SDL.
#
# On OSX, this will prefer the Framework version (if found) over others.
# People will have to manually change the cache values of SDL_LIBRARY to
# override this selectionor set the CMake environment CMAKE_INCLUDE_PATH
# to modify the search paths.

set(SDL_SOUND_EXTRAS "" CACHE STRING "SDL_sound extra flags")
mark_as_advanced(SDL_SOUND_EXTRAS)

# Find SDL_sound.h
find_path(SDL_SOUND_INCLUDE_DIR SDL_sound.h
  HINTS
    ENV SDLSOUNDDIR
    ENV SDLDIR
  PATH_SUFFIXES SDL
                # path suffixes to search inside ENV{SDLDIR}
                include/SDL include/SDL12 include/SDL11 include
  )

find_library(SDL_SOUND_LIBRARY
  NAMES SDL_sound
  HINTS
    ENV SDLSOUNDDIR
    ENV SDLDIR
  PATH_SUFFIXES lib VisualC/win32lib
  )

if(SDL_FOUND AND SDL_SOUND_INCLUDE_DIR AND SDL_SOUND_LIBRARY)

  # CMake is giving me problems using TRY_COMPILE with the CMAKE_FLAGS
  # for the :STRING syntax if I have multiple values contained in a
  # single variable. This is a problem for the SDL_LIBRARY variable
  # because it does just that. When I feed this variable to the command,
  # only the first value gets the appropriate modifier (e.g. -I) and
  # the rest get dropped.
  # To get multiple single variables to work, I must separate them with a "\;"
  # I could go back and modify the FindSDL.cmake module, but that's kind of painful.
  # The solution would be to try something like:
  # string(APPEND SDL_TRY_COMPILE_LIBRARY_LIST "\;${CMAKE_THREAD_LIBS_INIT}")
  # Instead, it was suggested on the mailing list to write a temporary CMakeLists.txt
  # with a temporary test project and invoke that with TRY_COMPILE.
  # See message thread "Figuring out dependencies for a library in order to build"
  # 2005-07-16
  #     try_compile(
  #             MY_RESULT
  #             ${CMAKE_BINARY_DIR}
  #             ${PROJECT_SOURCE_DIR}/DetermineSoundLibs.c
  #             CMAKE_FLAGS
  #                     -DINCLUDE_DIRECTORIES:STRING=${SDL_INCLUDE_DIR}\;${SDL_SOUND_INCLUDE_DIR}
  #                     -DLINK_LIBRARIES:STRING=${SDL_SOUND_LIBRARY}\;${SDL_LIBRARY}
  #             OUTPUT_VARIABLE MY_OUTPUT
  #     )

  # To minimize external dependencies, create a sdlsound test program
  # which will be used to figure out if additional link dependencies are
  # required for the link phase.
  file(WRITE ${PROJECT_BINARY_DIR}/CMakeTmp/DetermineSoundLibs.c
    "#include \"SDL_sound.h\"
    #include \"SDL.h\"
    int main(int argc, char* argv[])
    {
        Sound_AudioInfo desired;
        Sound_Sample* sample;

        SDL_Init(0);
        Sound_Init();

        /* This doesn't actually have to work, but Init() is a no-op
         * for some of the decoders, so this should force more symbols
         * to be pulled in.
         */
        sample = Sound_NewSampleFromFile(argv[1], &desired, 4096);

        Sound_Quit();
        SDL_Quit();
        return 0;
     }"
     )

   # Calling
   # target_link_libraries(DetermineSoundLibs "${SDL_SOUND_LIBRARY} ${SDL_LIBRARY})
   # causes problems when SDL_LIBRARY looks like
   # /Library/Frameworks/SDL.framework;-framework Cocoa
   # The ;-framework Cocoa seems to be confusing CMake once the OS X
   # framework support was added. I was told that breaking up the list
   # would fix the problem.
   set(TMP_TRY_LIBS)
   foreach(lib ${SDL_SOUND_LIBRARY} ${SDL_LIBRARY})
     string(APPEND TMP_TRY_LIBS " \"${lib}\"")
   endforeach()

   # message("TMP_TRY_LIBS ${TMP_TRY_LIBS}")

   # Write the CMakeLists.txt and test project
   # Weird, this is still sketchy. If I don't quote the variables
   # in the TARGET_LINK_LIBRARIES, I seem to loose everything
   # in the SDL_LIBRARY string after the "-framework".
   # But if I quote the stuff in INCLUDE_DIRECTORIES, it doesn't work.
   file(WRITE ${PROJECT_BINARY_DIR}/CMakeTmp/CMakeLists.txt
     "cmake_minimum_required(VERSION ${CMAKE_VERSION})
        project(DetermineSoundLibs)
        include_directories(${SDL_INCLUDE_DIR} ${SDL_SOUND_INCLUDE_DIR})
        add_executable(DetermineSoundLibs DetermineSoundLibs.c)
        target_link_libraries(DetermineSoundLibs ${TMP_TRY_LIBS})"
     )

   try_compile(
     MY_RESULT
     ${PROJECT_BINARY_DIR}/CMakeTmp
     ${PROJECT_BINARY_DIR}/CMakeTmp
     DetermineSoundLibs
     OUTPUT_VARIABLE MY_OUTPUT
     )

   # message("${MY_RESULT}")
   # message(${MY_OUTPUT})

   if(NOT MY_RESULT)

     # I expect that MPGLIB, VOC, WAV, AIFF, and SHN are compiled in statically.
     # I think Timidity is also compiled in statically.
     # I've never had to explcitly link against Quicktime, so I'll skip that for now.

     set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARY})

     # Find MikMod
     if("${MY_OUTPUT}" MATCHES "MikMod_")
     find_library(MIKMOD_LIBRARY
         NAMES libmikmod-coreaudio mikmod
         PATHS
           ENV MIKMODDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
       )
       if(MIKMOD_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${MIKMOD_LIBRARY})
       endif(MIKMOD_LIBRARY)
     endif("${MY_OUTPUT}" MATCHES "MikMod_")

     # Find ModPlug
     if("${MY_OUTPUT}" MATCHES "MODPLUG_")
       find_library(MODPLUG_LIBRARY
         NAMES modplug
         PATHS
           ENV MODPLUGDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
       )
       if(MODPLUG_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${MODPLUG_LIBRARY})
       endif()
     endif()


     # Find Ogg and Vorbis
     if("${MY_OUTPUT}" MATCHES "ov_")
       find_library(VORBIS_LIBRARY
         NAMES vorbis Vorbis VORBIS
         PATHS
           ENV VORBISDIR
           ENV OGGDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
         )
       if(VORBIS_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${VORBIS_LIBRARY})
       endif()

       find_library(OGG_LIBRARY
         NAMES ogg Ogg OGG
         PATHS
           ENV OGGDIR
           ENV VORBISDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
         )
       if(OGG_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${OGG_LIBRARY})
       endif()
     endif()


     # Find SMPEG
     if("${MY_OUTPUT}" MATCHES "SMPEG_")
       find_library(SMPEG_LIBRARY
         NAMES smpeg SMPEG Smpeg SMpeg
         PATHS
           ENV SMPEGDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
         )
       if(SMPEG_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${SMPEG_LIBRARY})
       endif()
     endif()


     # Find FLAC
     if("${MY_OUTPUT}" MATCHES "FLAC_")
       find_library(FLAC_LIBRARY
         NAMES flac FLAC
         PATHS
           ENV FLACDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
         )
       if(FLAC_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${FLAC_LIBRARY})
       endif()
     endif()


     # Hmmm...Speex seems to depend on Ogg. This might be a problem if
     # the TRY_COMPILE attempt gets blocked at SPEEX before it can pull
     # in the Ogg symbols. I'm not sure if I should duplicate the ogg stuff
     # above for here or if two ogg entries will screw up things.
     if("${MY_OUTPUT}" MATCHES "speex_")
       find_library(SPEEX_LIBRARY
         NAMES speex SPEEX
         PATHS
           ENV SPEEXDIR
           ENV SDLSOUNDDIR
           ENV SDLDIR
           /sw
           /opt/local
           /opt/csw
           /opt
         PATH_SUFFIXES
           lib
         )
       if(SPEEX_LIBRARY)
         set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${SPEEX_LIBRARY})
       endif()

       # Find OGG (needed for Speex)
     # We might have already found Ogg for Vorbis, so skip it if so.
       if(NOT OGG_LIBRARY)
         find_library(OGG_LIBRARY
           NAMES ogg Ogg OGG
           PATHS
             ENV OGGDIR
             ENV VORBISDIR
             ENV SPEEXDIR
             ENV SDLSOUNDDIR
             ENV SDLDIR
             /sw
             /opt/local
             /opt/csw
             /opt
           PATH_SUFFIXES lib
           )
         if(OGG_LIBRARY)
           set(SDL_SOUND_LIBRARIES_TMP ${SDL_SOUND_LIBRARIES_TMP} ${OGG_LIBRARY})
         endif()
       endif()
     endif()

     set(SDL_SOUND_LIBRARIES ${SDL_SOUND_EXTRAS} ${SDL_SOUND_LIBRARIES_TMP})
   else()
     set(SDL_SOUND_LIBRARIES ${SDL_SOUND_EXTRAS} ${SDL_SOUND_LIBRARY})
   endif()
 endif()

if(SDL_SOUND_INCLUDE_DIR AND EXISTS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h")
  file(STRINGS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h" SDL_SOUND_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SOUND_VER_MAJOR[ \t]+[0-9]+$")
  file(STRINGS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h" SDL_SOUND_VERSION_MINOR_LINE REGEX "^#define[ \t]+SOUND_VER_MINOR[ \t]+[0-9]+$")
  file(STRINGS "${SDL_SOUND_INCLUDE_DIR}/SDL_sound.h" SDL_SOUND_VERSION_PATCH_LINE REGEX "^#define[ \t]+SOUND_VER_PATCH[ \t]+[0-9]+$")
  string(REGEX REPLACE "^#define[ \t]+SOUND_VER_MAJOR[ \t]+([0-9]+)$" "\\1" SDL_SOUND_VERSION_MAJOR "${SDL_SOUND_VERSION_MAJOR_LINE}")
  string(REGEX REPLACE "^#define[ \t]+SOUND_VER_MINOR[ \t]+([0-9]+)$" "\\1" SDL_SOUND_VERSION_MINOR "${SDL_SOUND_VERSION_MINOR_LINE}")
  string(REGEX REPLACE "^#define[ \t]+SOUND_VER_PATCH[ \t]+([0-9]+)$" "\\1" SDL_SOUND_VERSION_PATCH "${SDL_SOUND_VERSION_PATCH_LINE}")
  set(SDL_SOUND_VERSION_STRING ${SDL_SOUND_VERSION_MAJOR}.${SDL_SOUND_VERSION_MINOR}.${SDL_SOUND_VERSION_PATCH})
  unset(SDL_SOUND_VERSION_MAJOR_LINE)
  unset(SDL_SOUND_VERSION_MINOR_LINE)
  unset(SDL_SOUND_VERSION_PATCH_LINE)
  unset(SDL_SOUND_VERSION_MAJOR)
  unset(SDL_SOUND_VERSION_MINOR)
  unset(SDL_SOUND_VERSION_PATCH)
endif()

include(${CMAKE_CURRENT_LIST_DIR}/FindPackageHandleStandardArgs.cmake)

FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL_sound
                                  REQUIRED_VARS SDL_SOUND_LIBRARY SDL_SOUND_INCLUDE_DIR
                                  VERSION_VAR SDL_SOUND_VERSION_STRING)
