From adf9596316bc9b457139af127ad74be95ac21457 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 17 Dec 2014 19:21:32 +0000 Subject: [PATCH] Added support for using SDL2 to the osgmovie to enable it to handle floating point audio formats git-svn-id: http://svn.openscenegraph.org/osg/OpenSceneGraph/trunk@14610 16af8721-9629-0410-8352-f15c8da7e697 --- CMakeLists.txt | 1 + CMakeModules/FindSDL2.cmake | 178 +++++++++++++++++++++++++++++++ examples/osgmovie/CMakeLists.txt | 13 ++- examples/osgmovie/osgmovie.cpp | 65 +++++++---- 4 files changed, 238 insertions(+), 19 deletions(-) create mode 100644 CMakeModules/FindSDL2.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index 556e02322..9d618eefa 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -627,6 +627,7 @@ ELSE() FIND_PACKAGE(GStreamer COMPONENTS gstreamer-app gstreamer-pbutils) FIND_PACKAGE(GLIB COMPONENTS gobject) FIND_PACKAGE(DirectShow) + FIND_PACKAGE(SDL2) FIND_PACKAGE(SDL) FIND_PACKAGE(Poppler-glib) FIND_PACKAGE(RSVG) diff --git a/CMakeModules/FindSDL2.cmake b/CMakeModules/FindSDL2.cmake new file mode 100644 index 000000000..af2ebd19e --- /dev/null +++ b/CMakeModules/FindSDL2.cmake @@ -0,0 +1,178 @@ +# - Locate SDL library +# This module defines +# SDL2_LIBRARY, the name of the library to link against +# SDL2_FOUND, if false, do not try to link to SDL +# SDL2_INCLUDE_DIR, where to find SDL.h +# SDL2_VERSION_STRING, human-readable string containing the version of SDL +# +# This module responds to the the flag: +# SDL2_BUILDING_LIBRARY +# If this is defined, then no SDL2_main will be linked in because +# only applications need main(). +# Otherwise, it is assumed you are building an application and this +# module will attempt to locate and set the the proper link flags +# as part of the returned SDL2_LIBRARY variable. +# +# Don't forget to include SDLmain.h and SDLmain.m your project for the +# OS X framework based version. (Other versions link to -lSDLmain which +# this module will try to find on your behalf.) Also for OS X, this +# module will automatically add the -framework Cocoa on your behalf. +# +# +# Additional Note: If you see an empty SDL2_LIBRARY_TEMP in your configuration +# and no SDL2_LIBRARY, it means CMake did not find your SDL library +# (SDL.dll, libsdl.so, SDL.framework, etc). +# Set SDL2_LIBRARY_TEMP to point to your SDL library, and configure again. +# Similarly, if you see an empty SDL2MAIN_LIBRARY, you should set this value +# as appropriate. These values are used to generate the final SDL2_LIBRARY +# variable, but when these values are unset, SDL2_LIBRARY does not get created. +# +# +# $SDLDIR is an environment variable that would +# correspond to the ./configure --prefix=$SDLDIR +# used in building SDL. +# l.e.galup 9-20-02 +# +# Modified by Eric Wing. +# Added code to assist with automated building by using environmental variables +# and providing a more controlled/consistent search behavior. +# Added new modifications to recognize OS X frameworks and +# additional Unix paths (FreeBSD, etc). +# Also corrected the header search path to follow "proper" SDL guidelines. +# Added a search for SDLmain which is needed by some platforms. +# Added a search for threads which is needed by some platforms. +# Added needed compile switches for MinGW. +# +# On OSX, this will prefer the Framework version (if found) over others. +# People will have to manually change the cache values of +# SDL2_LIBRARY to override this selection or set the CMake environment +# CMAKE_INCLUDE_PATH to modify the search paths. +# +# Note that the header path has changed from SDL/SDL.h to just SDL.h +# This needed to change because "proper" SDL convention +# is #include "SDL.h", not . This is done for portability +# reasons because not all systems place things in SDL/ (see FreeBSD). + +#============================================================================= +# Copyright 2003-2009 Kitware, Inc. +# Copyright 2012 Benjamin Eikel +# +# Distributed under the OSI-approved BSD License (the "License"); +# see accompanying file Copyright.txt for details. +# +# This software is distributed WITHOUT ANY WARRANTY; without even the +# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +# See the License for more information. +#============================================================================= +# (To distribute this file outside of CMake, substitute the full +# License text for the above reference.) + +find_path(SDL2_INCLUDE_DIR SDL.h + HINTS + ENV SDL2DIR + PATH_SUFFIXES include/SDL2 +) + +# SDL-1.1 is the name used by FreeBSD ports... +# don't confuse it for the version number. +find_library(SDL2_LIBRARY_TEMP + NAMES SDL2 + HINTS + ENV SDL2DIR + PATH_SUFFIXES lib +) + +if(NOT SDL2_BUILDING_LIBRARY) + if(NOT ${SDL2_INCLUDE_DIR} MATCHES ".framework") + # Non-OS X framework versions expect you to also dynamically link to + # SDLmain. This is mainly for Windows and OS X. Other (Unix) platforms + # seem to provide SDLmain for compatibility even though they don't + # necessarily need it. + find_library(SDL2MAIN_LIBRARY + NAMES SDL2main + HINTS + ENV SDL2DIR + PATH_SUFFIXES lib + PATHS + /sw + /opt/local + /opt/csw + /opt + ) + endif() +endif() + +# SDL may require threads on your system. +# The Apple build may not need an explicit flag because one of the +# frameworks may already provide it. +# But for non-OSX systems, I will use the CMake Threads package. +if(NOT APPLE) + find_package(Threads) +endif() + +# MinGW needs an additional library, mwindows +# It's total link flags should look like -lmingw32 -lSDLmain -lSDL -lmwindows +# (Actually on second look, I think it only needs one of the m* libraries.) +if(MINGW) + set(MINGW32_LIBRARY mingw32 CACHE STRING "mwindows for MinGW") +endif() + +if(SDL2_LIBRARY_TEMP) + # For SDLmain + if(SDL2MAIN_LIBRARY AND NOT SDL2_BUILDING_LIBRARY) + list(FIND SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" _SDL2_MAIN_INDEX) + if(_SDL2_MAIN_INDEX EQUAL -1) + set(SDL2_LIBRARY_TEMP "${SDL2MAIN_LIBRARY}" ${SDL2_LIBRARY_TEMP}) + endif() + unset(_SDL2_MAIN_INDEX) + endif() + + # For OS X, SDL uses Cocoa as a backend so it must link to Cocoa. + # CMake doesn't display the -framework Cocoa string in the UI even + # though it actually is there if I modify a pre-used variable. + # I think it has something to do with the CACHE STRING. + # So I use a temporary variable until the end so I can set the + # "real" variable in one-shot. + if(APPLE) + set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} "-framework Cocoa") + endif() + + # For threads, as mentioned Apple doesn't need this. + # In fact, there seems to be a problem if I used the Threads package + # and try using this line, so I'm just skipping it entirely for OS X. + if(NOT APPLE) + set(SDL2_LIBRARY_TEMP ${SDL2_LIBRARY_TEMP} ${CMAKE_THREAD_LIBS_INIT}) + endif() + + # For MinGW library + if(MINGW) + set(SDL2_LIBRARY_TEMP ${MINGW32_LIBRARY} ${SDL2_LIBRARY_TEMP}) + endif() + + # Set the final string here so the GUI reflects the final state. + set(SDL2_LIBRARY ${SDL2_LIBRARY_TEMP} CACHE STRING "Where the SDL Library can be found") + # Set the temp variable to INTERNAL so it is not seen in the CMake GUI + set(SDL2_LIBRARY_TEMP "${SDL2_LIBRARY_TEMP}" CACHE INTERNAL "") +endif() + +if(SDL2_INCLUDE_DIR AND EXISTS "${SDL2_INCLUDE_DIR}/SDL2_version.h") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MAJOR_LINE REGEX "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_MINOR_LINE REGEX "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+[0-9]+$") + file(STRINGS "${SDL2_INCLUDE_DIR}/SDL2_version.h" SDL2_VERSION_PATCH_LINE REGEX "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+[0-9]+$") + string(REGEX REPLACE "^#define[ \t]+SDL2_MAJOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MAJOR "${SDL2_VERSION_MAJOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_MINOR_VERSION[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_MINOR "${SDL2_VERSION_MINOR_LINE}") + string(REGEX REPLACE "^#define[ \t]+SDL2_PATCHLEVEL[ \t]+([0-9]+)$" "\\1" SDL2_VERSION_PATCH "${SDL2_VERSION_PATCH_LINE}") + set(SDL2_VERSION_STRING ${SDL2_VERSION_MAJOR}.${SDL2_VERSION_MINOR}.${SDL2_VERSION_PATCH}) + unset(SDL2_VERSION_MAJOR_LINE) + unset(SDL2_VERSION_MINOR_LINE) + unset(SDL2_VERSION_PATCH_LINE) + unset(SDL2_VERSION_MAJOR) + unset(SDL2_VERSION_MINOR) + unset(SDL2_VERSION_PATCH) +endif() + +include(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SDL2 + REQUIRED_VARS SDL2_LIBRARY SDL2_INCLUDE_DIR + VERSION_VAR SDL2_VERSION_STRING) diff --git a/examples/osgmovie/CMakeLists.txt b/examples/osgmovie/CMakeLists.txt index 157bac8a1..b1ba3967b 100644 --- a/examples/osgmovie/CMakeLists.txt +++ b/examples/osgmovie/CMakeLists.txt @@ -1,13 +1,24 @@ # INCLUDE_DIRECTORIES( ${OPENAL_INCLUDE_DIR} ) # SET(TARGET_EXTERNAL_LIBRARIES ${OPENAL_LIBRARY} alut) -IF (SDL_FOUND) +IF (SDL2_FOUND) + + SET(TARGET_EXTERNAL_LIBRARIES ${SDL2_LIBRARY} ) + INCLUDE_DIRECTORIES(${SDL2_INCLUDE_DIR} ) + ADD_DEFINITIONS(-DUSE_SDL2) + IF (MINGW) + SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid) + ENDIF() + +ELSEIF (SDL_FOUND) + SET(TARGET_EXTERNAL_LIBRARIES ${SDL_LIBRARY} ) INCLUDE_DIRECTORIES(${SDL_INCLUDE_DIR} ) ADD_DEFINITIONS(-DUSE_SDL) IF (MINGW) SET(TARGET_EXTERNAL_LIBRARIES ${TARGET_EXTERNAL_LIBRARIES} winmm dinput ddraw dxguid) ENDIF() + ENDIF(SDL_FOUND) SET(TARGET_SRC osgmovie.cpp ) diff --git a/examples/osgmovie/osgmovie.cpp b/examples/osgmovie/osgmovie.cpp index 173608435..706bc4760 100644 --- a/examples/osgmovie/osgmovie.cpp +++ b/examples/osgmovie/osgmovie.cpp @@ -376,7 +376,7 @@ osg::Geometry* myCreateTexturedQuadGeometry(const osg::Vec3& pos,float width,flo } } -#if USE_SDL +#if USE_SDL || USE_SDL2 class SDLAudioSink : public osg::AudioSink { @@ -508,11 +508,11 @@ int main(int argc, char** argv) osg::Vec3 bottomright = pos; bool xyPlane = fullscreen; - + bool useAudioSink = false; while(arguments.read("--audio")) { useAudioSink = true; } - -#if USE_SDL + +#if USE_SDL || USE_SDL2 unsigned int numAudioStreamsEnabled = 0; #endif @@ -522,18 +522,18 @@ int main(int argc, char** argv) { osg::Image* image = osgDB::readImageFile(arguments[i]); osg::ImageStream* imagestream = dynamic_cast(image); - if (imagestream) + if (imagestream) { osg::ImageStream::AudioStreams& audioStreams = imagestream->getAudioStreams(); if (useAudioSink && !audioStreams.empty()) { osg::AudioStream* audioStream = audioStreams[0].get(); osg::notify(osg::NOTICE)<<"AudioStream read ["<getName()<<"]"<setAudioSink(new SDLAudioSink(audioStream)); - + ++numAudioStreamsEnabled; } #endif @@ -551,7 +551,7 @@ int main(int argc, char** argv) float height = image->t(); osg::ref_ptr drawable = myCreateTexturedQuadGeometry(pos, width, height,image, useTextureRectangle, xyPlane, flip); - + if (image->isImageTranslucent()) { osg::notify(osg::NOTICE)<<"Transparent movie, enabling blending."<setClearColor(osg::Vec4(0.0f,0.0f,0.0f,1.0f)); float screenAspectRatio = 1280.0f/1024.0f; osg::GraphicsContext::WindowingSystemInterface* wsi = osg::GraphicsContext::getWindowingSystemInterface(); - if (wsi) + if (wsi) { unsigned int width, height; wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0), width, height); - + screenAspectRatio = float(width) / float(height); } - + float modelAspectRatio = (bottomright.x()-topleft.x())/(bottomright.y()-topleft.y()); - + viewer.getCamera()->setViewMatrix(osg::Matrix::identity()); @@ -659,7 +659,7 @@ int main(int argc, char** argv) } } -#if USE_SDL +#if USE_SDL || USE_SDL2 #include "SDL.h" @@ -699,22 +699,51 @@ void SDLAudioSink::play() osg::notify(osg::NOTICE)<<" audioNbChannels()="<<_audioStream->audioNbChannels()<=2 + switch(_audioStream->audioSampleFormat()) + { + case(osg::AudioStream::SAMPLE_FORMAT_U8): { wanted_specs.format = AUDIO_U8; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_U8"<audioSampleFormat()) + { + case(osg::AudioStream::SAMPLE_FORMAT_U8): { wanted_specs.format = AUDIO_U8; OSG_NOTICE<<" SampleFormat = SAMPLE_FORMAT_U8"<