forked from Mirrors/openclonk
Merge all of the audio provider switches into one
There's no point in splitting the audio library selection into multiple CPP macros, since there can always only be one anyway. Merge all of them into a single macro AUDIO_TK (for "toolkit") and have CMake select one for the user, instead of making him choose (and potentially failing).issue1247
parent
474b6e1c31
commit
642ce2eb9c
|
@ -48,12 +48,6 @@ CMAKE_DEPENDENT_OPTION(USE_GTK "Use GTK for the developer mode" ON "USE_X11" OFF
|
|||
CMAKE_DEPENDENT_OPTION(USE_GTK3 "Use GTK3 instead of GTK2" OFF "USE_GTK" OFF)
|
||||
|
||||
CMAKE_DEPENDENT_OPTION(USE_COCOA "Use Apple Cocoa for the developer mode and the windows." ON "APPLE" OFF)
|
||||
if(APPLE)
|
||||
SET(INITIAL_USE_OPEN_AL ON)
|
||||
else()
|
||||
SET(INITIAL_USE_OPEN_AL OFF)
|
||||
endif()
|
||||
option(USE_OPEN_AL "Use OpenAL to play sounds" ${INITIAL_USE_OPEN_AL})
|
||||
option(WITH_AUTOMATIC_UPDATE "Automatic updates are downloaded from the project website." OFF)
|
||||
|
||||
# We link Boost statically because that makes it easier for us to distribute
|
||||
|
@ -867,21 +861,8 @@ if(MAPE_GTK_FOUND)
|
|||
link_directories(${MAPE_GTK_LIBRARY_DIRS})
|
||||
endif()
|
||||
|
||||
if(USE_OPEN_AL)
|
||||
if(MSVC)
|
||||
if(${FIND_LIBRARY_USE_LIB64_PATHS})
|
||||
FINDLIB(OPENAL_LIBRARY NAMES OpenAL64)
|
||||
else()
|
||||
FINDLIB(OPENAL_LIBRARY NAMES OpenAL32)
|
||||
endif()
|
||||
endif()
|
||||
FINDLIB(OGG_LIBRARY NAMES libogg_static libogg ogg)
|
||||
FINDLIB(VORBIS_LIBRARY NAMES libvorbis_static libvorbis vorbis)
|
||||
FINDLIB(VORBISFILE_LIBRARY NAMES libvorbisfile_static libvorbisfile vorbisfile)
|
||||
if(NOT APPLE)
|
||||
FINDLIB(ALUT_LIBRARY NAMES alut_static alut)
|
||||
endif()
|
||||
endif()
|
||||
# Select an audio library
|
||||
find_package("Audio")
|
||||
|
||||
############################################################################
|
||||
# Precompiled header support, part 1 (pre-target)
|
||||
|
@ -1061,14 +1042,9 @@ target_link_libraries(openclonk
|
|||
libmisc
|
||||
)
|
||||
|
||||
if(USE_OPEN_AL)
|
||||
target_link_libraries(openclonk
|
||||
${OPENAL_LIBRARY}
|
||||
${ALUT_LIBRARY}
|
||||
${VORBIS_LIBRARY}
|
||||
${VORBISFILE_LIBRARY}
|
||||
${OGG_LIBRARY}
|
||||
)
|
||||
if(Audio_FOUND)
|
||||
target_link_libraries(openclonk ${Audio_LIBRARIES})
|
||||
include_directories(${Audio_INCLUDE_DIRS})
|
||||
endif()
|
||||
|
||||
if(MAPE_GTK_FOUND)
|
||||
|
@ -1320,7 +1296,7 @@ if(USE_X11)
|
|||
)
|
||||
endif()
|
||||
if(USE_COCOA)
|
||||
TARGET_LINK_LIBRARIES(openclonk "-framework Cocoa -framework AppKit -framework Quartz -framework OpenAL -framework AudioToolBox")
|
||||
TARGET_LINK_LIBRARIES(openclonk "-framework Cocoa -framework AppKit -framework Quartz")
|
||||
endif()
|
||||
if (WIN32)
|
||||
# CMake is too incompetent to check whether these libraries can be linked to
|
||||
|
@ -1342,36 +1318,6 @@ if (WIN32)
|
|||
if(MAPE_GTK_FOUND)
|
||||
target_link_libraries(mape winmm)
|
||||
endif()
|
||||
|
||||
if(NOT USE_OPEN_AL)
|
||||
find_package(FMod)
|
||||
if(FMOD_FOUND)
|
||||
set(HAVE_FMOD TRUE)
|
||||
target_link_libraries(openclonk
|
||||
${FMOD_LIBRARIES}
|
||||
)
|
||||
include_directories(${FMOD_INCLUDE_DIR})
|
||||
else()
|
||||
set(HAVE_FMOD FALSE)
|
||||
endif()
|
||||
endif()
|
||||
else()
|
||||
SET(HAVE_FMOD FALSE)
|
||||
endif()
|
||||
if(NOT HAVE_FMOD AND NOT USE_OPEN_AL OR USE_SDL_MAINLOOP AND NOT USE_OPEN_AL)
|
||||
include(FindSDL)
|
||||
SET(HAVE_SDL ${SDL_FOUND})
|
||||
if(SDL_FOUND)
|
||||
include_directories(${SDL_INCLUDE_DIR})
|
||||
FINDLIB(SDLMIXER_LIBRARIES SDL_mixer)
|
||||
if(SDLMIXER_LIBRARIES)
|
||||
SET(HAVE_LIBSDL_MIXER ON)
|
||||
endif()
|
||||
target_link_libraries(openclonk
|
||||
${SDL_LIBRARY}
|
||||
${SDLMIXER_LIBRARIES}
|
||||
)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
if(HAVE_UPNP)
|
||||
|
|
|
@ -0,0 +1,143 @@
|
|||
# OpenClonk, http://www.openclonk.org
|
||||
#
|
||||
# Copyright (c) 2009-2014, The OpenClonk Team and contributors
|
||||
#
|
||||
# Distributed under the terms of the ISC license; see accompanying file
|
||||
# "COPYING" for details.
|
||||
#
|
||||
# "Clonk" is a registered trademark of Matthes Bender, used with permission.
|
||||
# See accompanying file "TRADEMARK" for details.
|
||||
#
|
||||
# To redistribute this file separately, substitute the full license texts
|
||||
# for the above references.
|
||||
|
||||
# This module chooses an audio provider for use in OpenClonk.
|
||||
|
||||
macro(__FINDAUDIO_FINDOPENAL)
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(OpenAL "openal>=1.15.1")
|
||||
pkg_check_modules(Alut "freealut>=1.1.0")
|
||||
pkg_check_modules(OggVorbis "vorbisfile>=1.3.2" "vorbis>=1.3.2" "ogg>=1.3.0")
|
||||
else()
|
||||
if(MSVC OR APPLE)
|
||||
find_path(OpenAL_INCLUDE_DIRS al.h PATH_SUFFIXES include/AL include/OpenAL include)
|
||||
find_path(Vorbis_INCLUDE_DIRS vorbis/codec.h vorbis/vorbisfile.h PATH_SUFFIXES include)
|
||||
find_library(Ogg_LIBRARY NAMES libogg_static libogg ogg)
|
||||
find_library(Vorbis_LIBRARY NAMES libvorbis_static libvorbis vorbis)
|
||||
find_library(Vorbisfile_LIBRARY NAMES libvorbisfile_static libvorbisfile vorbisfile)
|
||||
if(OpenAL_INCLUDE_DIRS)
|
||||
set(OpenAL_FOUND TRUE)
|
||||
endif()
|
||||
if(Vorbis_INCLUDE_DIRS AND Ogg_LIBRARY AND Vorbis_LIBRARY AND Vorbisfile_LIBRARY)
|
||||
set(OggVorbis_FOUND TRUE)
|
||||
set(OggVorbis_LIBRARIES ${Vorbisfile_LIBRARY} ${Vorbis_LIBRARY} ${Ogg_LIBRARY})
|
||||
set(OggVorbis_INCLUDE_DIRS(${Vorbis_INCLUDE_DIRS}))
|
||||
endif()
|
||||
endif()
|
||||
if(MSVC)
|
||||
find_path(Alut_INCLUDE_DIRS alut.h PATH_SUFFIXES include/AL include/OpenAL include)
|
||||
find_library(Alut_LIBRARY NAMES alut_static alut)
|
||||
if(${FIND_LIBRARY_USE_LIB64_PATHS})
|
||||
find_library(OpenAL_LIBRARY NAMES OpenAL64)
|
||||
else()
|
||||
find_library(OpenAL_LIBRARY NAMES OpenAL32)
|
||||
endif()
|
||||
if(NOT OpenAL_LIBRARY)
|
||||
set(OpenAL_FOUND FALSE)
|
||||
endif()
|
||||
if(Alut_INCLUDE_DIRS AND Alut_LIBRARY)
|
||||
set(Alut_FOUND TRUE)
|
||||
set(Alut_LIBRARIES ${Alut_LIBRARY})
|
||||
endif()
|
||||
endif()
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
macro(__FINDAUDIO_FINDSDLMIXER)
|
||||
find_package(PkgConfig QUIET)
|
||||
if(PKG_CONFIG_FOUND)
|
||||
pkg_check_modules(SDLMixer "SDL_mixer>=1.2.12")
|
||||
endif()
|
||||
endmacro()
|
||||
|
||||
if(Audio_TK)
|
||||
# Already chosen, don't do anything
|
||||
elseif(USE_CONSOLE)
|
||||
# Dedicated servers don't need audio output
|
||||
set(Audio_TK "none")
|
||||
set(Audio_FOUND TRUE)
|
||||
else()
|
||||
# Test for OpenAL
|
||||
__FINDAUDIO_FINDOPENAL()
|
||||
__FINDAUDIO_FINDSDLMIXER()
|
||||
find_package("FMod")
|
||||
|
||||
if(OpenAL_FOUND AND (APPLE OR Alut_FOUND) AND OggVorbis_FOUND)
|
||||
# Prefer OpenAL
|
||||
set(Audio_TK "OpenAL")
|
||||
elseif(SDLMixer_FOUND)
|
||||
set(Audio_TK "SDL_Mixer")
|
||||
elseif(FMOD_FOUND)
|
||||
set(Audio_TK "FMod")
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Search for the libraries again. If the provider was selected automatically, this will be
|
||||
# answered from cache; otherwise (because the user manually selected a provider) it will
|
||||
# make sure the provider is available.
|
||||
if(Audio_TK STREQUAL "OpenAL")
|
||||
__FINDAUDIO_FINDOPENAL()
|
||||
if(OpenAL_FOUND AND (APPLE OR Alut_FOUND) AND OggVorbis_FOUND)
|
||||
set(Audio_FOUND TRUE)
|
||||
set(Audio_LIBRARIES ${OpenAL_LIBRARIES} ${OggVorbis_LIBRARIES})
|
||||
set(Audio_INCLUDE_DIRS ${OpenAL_INCLUDE_DIRS} ${OggVorbis_INCLUDE_DIRS})
|
||||
if (NOT APPLE)
|
||||
# Apple doesn't need freealut
|
||||
set(Audio_LIBRARIES ${Audio_LIBRARIES} ${Alut_LIBRARIES})
|
||||
set(Audio_INCLUDE_DIRS ${Audio_INCLUDE_DIRS} ${Alut_INCLUDE_DIRS})
|
||||
else()
|
||||
# but it uses the AudioToolBox framework
|
||||
set(Audio_LIBRARIES ${Audio_LIBRARIES} "-framework OpenAL -framework AudioToolBox")
|
||||
endif()
|
||||
endif()
|
||||
elseif(Audio_TK STREQUAL "SDL_Mixer")
|
||||
__FINDAUDIO_FINDSDLMIXER()
|
||||
if(SDLMixer_FOUND)
|
||||
set(Audio_FOUND TRUE)
|
||||
set(Audio_LIBRARIES ${SDLMixer_LIBRARIES})
|
||||
set(Audio_INCLUDE_DIRS ${SDLMixer_INCLUDE_DIRS})
|
||||
endif()
|
||||
elseif(Audio_TK STREQUAL "FMod")
|
||||
find_package("FMod")
|
||||
if(FMOD_FOUND)
|
||||
set(Audio_FOUND TRUE)
|
||||
set(Audio_LIBRARIES ${FMOD_LIBRARIES})
|
||||
set(Audio_INCLUDE_DIRS ${FMOD_INCLUDE_DIR})
|
||||
endif()
|
||||
elseif(Audio_TK STREQUAL "none")
|
||||
set(Audio_FOUND TRUE)
|
||||
set(Audio_LIBRARIES "")
|
||||
set(Audio_INCLUDE_DIRS "")
|
||||
endif()
|
||||
|
||||
if(Audio_FOUND)
|
||||
string(TOUPPER "${Audio_TK}" Audio_TK_UPPER)
|
||||
if(NOT Audio_FIND_QUIETLY)
|
||||
message(STATUS "Using Audio toolkit: ${Audio_TK}")
|
||||
endif()
|
||||
elseif(Audio_TK)
|
||||
message(FATAL_ERROR "User-requested audio provider not available.")
|
||||
else()
|
||||
set(Audio_FOUND FALSE)
|
||||
set(Audio_TK "none")
|
||||
string(TOUPPER "${Audio_TK}" Audio_TK_UPPER)
|
||||
set(Audio_LIBRARIES "")
|
||||
set(Audio_INCLUDE_DIRS "")
|
||||
|
||||
if(Audio_FIND_REQUIRED)
|
||||
message(FATAL_ERROR "No audio provider was found")
|
||||
else()
|
||||
message(STATUS "Not enabling audio output.")
|
||||
endif()
|
||||
endif()
|
|
@ -7,9 +7,6 @@
|
|||
/* The backtrace function is declared in execinfo.h and works */
|
||||
#cmakedefine HAVE_EXECINFO_H 1
|
||||
|
||||
/* Whether FMOD shall be used */
|
||||
#cmakedefine HAVE_FMOD 1
|
||||
|
||||
/* Define to 1 if you have the <history.h> header file. */
|
||||
#cmakedefine HAVE_HISTORY_H 1
|
||||
|
||||
|
@ -28,9 +25,6 @@
|
|||
/* Define if you have a readline compatible library */
|
||||
#cmakedefine HAVE_LIBREADLINE 1
|
||||
|
||||
/* Define to 1 if you have SDL_mixer. */
|
||||
#cmakedefine HAVE_LIBSDL_MIXER 1
|
||||
|
||||
/* Define to 1 if you have the <locale.h> header file. */
|
||||
#cmakedefine HAVE_LOCALE_H 1
|
||||
|
||||
|
@ -160,9 +154,6 @@
|
|||
/* MP3 music */
|
||||
#cmakedefine USE_MP3 1
|
||||
|
||||
/* OpenAL sound */
|
||||
#cmakedefine USE_OPEN_AL 1
|
||||
|
||||
/* Define to 1 if SDL is used for the main loop */
|
||||
#cmakedefine USE_SDL_MAINLOOP 1
|
||||
|
||||
|
@ -192,3 +183,10 @@
|
|||
|
||||
/* Use Apple Cocoa for the UI */
|
||||
#cmakedefine USE_COCOA 1
|
||||
|
||||
/* Select an audio provider */
|
||||
#define AUDIO_TK_NONE 0
|
||||
#define AUDIO_TK_OPENAL 1
|
||||
#define AUDIO_TK_FMOD 2
|
||||
#define AUDIO_TK_SDL_MIXER 3
|
||||
#define AUDIO_TK AUDIO_TK_${Audio_TK_UPPER}
|
||||
|
|
|
@ -38,7 +38,7 @@ C4StartupAboutDlg::C4StartupAboutDlg() : C4StartupDlg(LoadResStr("IDS_DLG_ABOUT"
|
|||
C4GUI::ComponentAligner caMain(rcClient, 0,0, true);
|
||||
C4GUI::ComponentAligner caButtons(caMain.GetFromBottom(caMain.GetHeight()*1/8), 0,0, false);
|
||||
C4GUI::CallbackButton<C4StartupAboutDlg> *btn;
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
AddElement(new C4GUI::Label("Using FMOD Sound System, copyright (c) Firelight Technologies Pty, Ltd., 1994-2010.",
|
||||
caMain.GetFromBottom(rUseFont.GetLineHeight())));
|
||||
#endif
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#include <C4Application.h>
|
||||
#include <C4Log.h>
|
||||
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
#include <fmod_errors.h>
|
||||
#endif
|
||||
|
||||
|
@ -53,7 +53,7 @@ bool C4MusicFile::Init(const char *szFile)
|
|||
return true;
|
||||
}
|
||||
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
bool C4MusicFileMID::Play(bool loop)
|
||||
{
|
||||
// check existance
|
||||
|
@ -292,7 +292,7 @@ void C4MusicFileOgg::SetVolume(int iLevel)
|
|||
FSOUND_SetVolume(Channel, (int) ((iLevel * 255) / 100));
|
||||
}
|
||||
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
C4MusicFileSDL::C4MusicFileSDL():
|
||||
Data(NULL),
|
||||
Music(NULL)
|
||||
|
|
|
@ -18,9 +18,9 @@
|
|||
#ifndef INC_C4MusicFile
|
||||
#define INC_C4MusicFile
|
||||
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
#include <fmod.h>
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
#define USE_RWOPS
|
||||
#include <SDL_mixer.h>
|
||||
#undef USE_RWOPS
|
||||
|
@ -55,7 +55,7 @@ protected:
|
|||
bool SongExtracted;
|
||||
|
||||
};
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
class C4MusicFileMID : public C4MusicFile
|
||||
{
|
||||
public:
|
||||
|
@ -123,7 +123,7 @@ protected:
|
|||
bool Playing;
|
||||
};
|
||||
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
typedef struct _Mix_Music Mix_Music;
|
||||
class C4MusicFileSDL : public C4MusicFile
|
||||
{
|
||||
|
@ -138,6 +138,6 @@ protected:
|
|||
char *Data;
|
||||
Mix_Music * Music;
|
||||
};
|
||||
#endif // HAVE_LIBSDL_MIXER
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
|
|
@ -28,14 +28,17 @@
|
|||
#include <C4Game.h>
|
||||
#include <C4GraphicsSystem.h>
|
||||
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
#include <fmod_errors.h>
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
#include <SDL.h>
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL && !defined(APPLE)
|
||||
#ifdef _WIN32
|
||||
// This is an ugly hack to make FreeALUT not dllimport everything.
|
||||
#define _XBOX
|
||||
#endif
|
||||
|
||||
#if defined(USE_OPEN_AL) && !defined(__APPLE__)
|
||||
#include <AL/alut.h>
|
||||
#include <alut.h>
|
||||
#undef _XBOX
|
||||
#endif
|
||||
|
||||
C4MusicSystem::C4MusicSystem():
|
||||
|
@ -43,7 +46,7 @@ C4MusicSystem::C4MusicSystem():
|
|||
SongCount(0),
|
||||
PlayMusicFile(NULL),
|
||||
Volume(100)
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
, alcDevice(NULL), alcContext(NULL)
|
||||
#endif
|
||||
{
|
||||
|
@ -54,7 +57,7 @@ C4MusicSystem::~C4MusicSystem()
|
|||
Clear();
|
||||
}
|
||||
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
void C4MusicSystem::SelectContext()
|
||||
{
|
||||
alcMakeContextCurrent(alcContext);
|
||||
|
@ -63,7 +66,7 @@ void C4MusicSystem::SelectContext()
|
|||
|
||||
bool C4MusicSystem::InitializeMOD()
|
||||
{
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
#ifdef _WIN32
|
||||
// Debug code
|
||||
switch (Config.Sound.FMMode)
|
||||
|
@ -97,7 +100,7 @@ bool C4MusicSystem::InitializeMOD()
|
|||
// ok
|
||||
MODInitialized = true;
|
||||
return true;
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
SDL_version compile_version;
|
||||
const SDL_version * link_version;
|
||||
MIX_VERSION(&compile_version);
|
||||
|
@ -118,7 +121,7 @@ bool C4MusicSystem::InitializeMOD()
|
|||
}
|
||||
MODInitialized = true;
|
||||
return true;
|
||||
#elif defined(USE_OPEN_AL)
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
alcDevice = alcOpenDevice(NULL);
|
||||
if (!alcDevice)
|
||||
{
|
||||
|
@ -146,16 +149,16 @@ bool C4MusicSystem::InitializeMOD()
|
|||
|
||||
void C4MusicSystem::DeinitializeMOD()
|
||||
{
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
FSOUND_StopSound(FSOUND_ALL); /* to prevent some hangs in FMOD */
|
||||
#ifdef DEBUG
|
||||
Sleep(0);
|
||||
#endif
|
||||
FSOUND_Close();
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
Mix_CloseAudio();
|
||||
SDL_Quit();
|
||||
#elif defined(USE_OPEN_AL)
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
#ifndef __APPLE__
|
||||
alutExit();
|
||||
#endif
|
||||
|
@ -237,7 +240,7 @@ void C4MusicSystem::Load(const char *szFile)
|
|||
if (!szFile || !*szFile) return;
|
||||
C4MusicFile *NewSong=NULL;
|
||||
// get extension
|
||||
#if defined HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
const char *szExt = GetExtension(szFile);
|
||||
// get type
|
||||
switch (GetMusicFileTypeByExtension(GetExtension(szFile)))
|
||||
|
@ -258,7 +261,7 @@ void C4MusicSystem::Load(const char *szFile)
|
|||
break;
|
||||
default: return; // safety
|
||||
}
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
if (GetMusicFileTypeByExtension(GetExtension(szFile)) == MUSICTYPE_UNKNOWN) return;
|
||||
NewSong = new C4MusicFileSDL;
|
||||
#endif
|
||||
|
@ -382,7 +385,7 @@ void C4MusicSystem::ClearSongs()
|
|||
|
||||
void C4MusicSystem::Clear()
|
||||
{
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#if AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
// Stop a fadeout
|
||||
Mix_HaltMusic();
|
||||
#endif
|
||||
|
@ -392,7 +395,7 @@ void C4MusicSystem::Clear()
|
|||
|
||||
void C4MusicSystem::Execute()
|
||||
{
|
||||
#ifndef HAVE_LIBSDL_MIXER
|
||||
#if AUDIO_TK != AUDIO_TK_SDL_MIXER
|
||||
if (!::Game.iTick35)
|
||||
#endif
|
||||
{
|
||||
|
@ -513,7 +516,7 @@ MusicType GetMusicFileTypeByExtension(const char* ext)
|
|||
{
|
||||
if (SEqualNoCase(ext, "mid"))
|
||||
return MUSICTYPE_MID;
|
||||
#if defined HAVE_FMOD || defined HAVE_LIBSDL_MIXER
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD || AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
else if (SEqualNoCase(ext, "xm") || SEqualNoCase(ext, "it") || SEqualNoCase(ext, "s3m") || SEqualNoCase(ext, "mod"))
|
||||
return MUSICTYPE_MOD;
|
||||
#ifdef USE_MP3
|
||||
|
|
|
@ -22,14 +22,9 @@
|
|||
|
||||
#include <C4Group.h>
|
||||
|
||||
#if defined(USE_OPEN_AL)
|
||||
#ifdef __APPLE__
|
||||
#import <OpenAL/al.h>
|
||||
#import <OpenAL/alc.h>
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#endif
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
#include <al.h>
|
||||
#include <alc.h>
|
||||
#endif
|
||||
|
||||
class C4MusicFileInfoNode;
|
||||
|
@ -77,7 +72,7 @@ protected:
|
|||
bool MODInitialized;
|
||||
bool InitializeMOD();
|
||||
void DeinitializeMOD();
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
private:
|
||||
ALCdevice* alcDevice;
|
||||
ALCcontext* alcContext;
|
||||
|
|
|
@ -19,12 +19,17 @@
|
|||
|
||||
#include <C4Application.h>
|
||||
|
||||
#if defined(USE_OPEN_AL)
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
#if defined(__APPLE__)
|
||||
#import <CoreFoundation/CoreFoundation.h>
|
||||
#import <AudioToolbox/AudioToolbox.h>
|
||||
#else
|
||||
#include <AL/alut.h>
|
||||
#ifdef _WIN32
|
||||
// This is an ugly hack to make FreeALUT not dllimport everything.
|
||||
#define _XBOX
|
||||
#endif
|
||||
#include <alut.h>
|
||||
#undef _XBOX
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
@ -33,7 +38,7 @@ using namespace C4SoundLoaders;
|
|||
|
||||
SoundLoader* SoundLoader::first_loader(NULL);
|
||||
|
||||
#if defined(USE_OPEN_AL) && defined(__APPLE__)
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL && defined(__APPLE__)
|
||||
namespace
|
||||
{
|
||||
static OSStatus AudioToolBoxReadCallback(void* context, SInt64 inPosition, UInt32 requestCount, void* buffer, UInt32* actualCount)
|
||||
|
@ -111,8 +116,7 @@ bool AppleSoundLoader::ReadInfo(SoundInfo* result, BYTE* data, size_t data_lengt
|
|||
AppleSoundLoader AppleSoundLoader::singleton;
|
||||
#endif
|
||||
|
||||
#ifdef USE_OPEN_AL
|
||||
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
size_t VorbisLoader::read_func(void* ptr, size_t byte_size, size_t size_to_read, void* datasource)
|
||||
{
|
||||
size_t spaceToEOF;
|
||||
|
@ -254,9 +258,8 @@ bool WavLoader::ReadInfo(SoundInfo* result, BYTE* data, size_t data_length, uint
|
|||
|
||||
WavLoader WavLoader::singleton;
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
#define USE_RWOPS
|
||||
#include <SDL_mixer.h>
|
||||
|
||||
|
@ -278,9 +281,8 @@ bool SDLMixerSoundLoader::ReadInfo(SoundInfo* result, BYTE* data, size_t data_le
|
|||
}
|
||||
|
||||
SDLMixerSoundLoader SDLMixerSoundLoader::singleton;
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FMOD
|
||||
#elif AUDIO_TK == AUDIO_TK_FMOD
|
||||
bool FMODSoundLoader::ReadInfo(SoundInfo* result, BYTE* data, size_t data_length, uint32_t options)
|
||||
{
|
||||
int32_t iOptions = FSOUND_NORMAL | FSOUND_2D | FSOUND_LOADMEMORY;
|
||||
|
|
|
@ -13,7 +13,10 @@
|
|||
* for the above references.
|
||||
*/
|
||||
|
||||
#ifdef USE_OPEN_AL
|
||||
#ifndef INC_C4SoundLoaders
|
||||
#define INC_C4SoundLoaders
|
||||
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
#include <vorbis/codec.h>
|
||||
#include <vorbis/vorbisfile.h>
|
||||
#endif
|
||||
|
@ -29,7 +32,7 @@ namespace C4SoundLoaders
|
|||
double sample_length;
|
||||
uint32_t sample_rate;
|
||||
std::vector<BYTE> sound_data;
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
ALenum format;
|
||||
#endif
|
||||
C4SoundHandle final_handle;
|
||||
|
@ -53,7 +56,7 @@ namespace C4SoundLoaders
|
|||
virtual bool ReadInfo(SoundInfo* info, BYTE* data, size_t data_length, uint32_t options = 0) = 0;
|
||||
};
|
||||
|
||||
#if defined(USE_OPEN_AL) && defined(__APPLE__)
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL && defined(__APPLE__)
|
||||
class AppleSoundLoader: public SoundLoader
|
||||
{
|
||||
public:
|
||||
|
@ -64,7 +67,7 @@ namespace C4SoundLoaders
|
|||
};
|
||||
#endif
|
||||
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
class VorbisLoader: public SoundLoader
|
||||
{
|
||||
private:
|
||||
|
@ -96,18 +99,16 @@ namespace C4SoundLoaders
|
|||
static WavLoader singleton;
|
||||
};
|
||||
#endif // apple
|
||||
#endif // openal
|
||||
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
class SDLMixerSoundLoader: public SoundLoader
|
||||
{
|
||||
public:
|
||||
static SDLMixerSoundLoader singleton;
|
||||
virtual bool ReadInfo(SoundInfo* result, BYTE* data, size_t data_length, uint32_t);
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_FMOD
|
||||
#elif AUDIO_TK == AUDIO_TK_FMOD
|
||||
class FMODSoundLoader: public SoundLoader
|
||||
{
|
||||
public:
|
||||
|
@ -116,3 +117,5 @@ namespace C4SoundLoaders
|
|||
};
|
||||
#endif
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
#include <C4Viewport.h>
|
||||
#include <C4SoundLoaders.h>
|
||||
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#if AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
#define USE_RWOPS
|
||||
#include <SDL_mixer.h>
|
||||
#endif
|
||||
|
@ -52,13 +52,11 @@ C4SoundEffect::~C4SoundEffect()
|
|||
void C4SoundEffect::Clear()
|
||||
{
|
||||
while (FirstInst) RemoveInst(FirstInst);
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
if (pSample) FSOUND_Sample_Free(pSample);
|
||||
#endif
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
if (pSample) Mix_FreeChunk(pSample);
|
||||
#endif
|
||||
#ifdef USE_OPEN_AL
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
if (pSample) alDeleteBuffers(1, &pSample);
|
||||
#endif
|
||||
pSample = 0;
|
||||
|
@ -98,7 +96,7 @@ bool C4SoundEffect::Load(BYTE *pData, size_t iDataLen, bool fRaw)
|
|||
}
|
||||
else
|
||||
{
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
Application.MusicSystem.SelectContext();
|
||||
alGenBuffers(1, &pSample);
|
||||
alBufferData(pSample, info.format, &info.sound_data[0], info.sound_data.size(), info.sample_rate);
|
||||
|
@ -253,7 +251,7 @@ bool C4SoundInstance::CheckStart()
|
|||
|
||||
bool C4SoundInstance::Start()
|
||||
{
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
// Start
|
||||
if ((iChannel = FSOUND_PlaySound(FSOUND_FREE, pEffect->pSample)) == -1)
|
||||
return false;
|
||||
|
@ -266,12 +264,12 @@ bool C4SoundInstance::Start()
|
|||
int32_t iTime = (C4TimeMilliseconds::Now() - tStarted) % pEffect->Length;
|
||||
FSOUND_SetCurrentPosition(iChannel, iTime / 10 * pEffect->SampleRate / 100);
|
||||
}
|
||||
#elif defined HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
// Be paranoid about SDL_Mixer initialisation
|
||||
if (!Application.MusicSystem.MODInitialized) return false;
|
||||
if ((iChannel = Mix_PlayChannel(-1, pEffect->pSample, fLooping? -1 : 0)) == -1)
|
||||
return false;
|
||||
#elif defined(USE_OPEN_AL)
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
Application.MusicSystem.SelectContext();
|
||||
alGenSources(1, (ALuint*)&iChannel);
|
||||
alSourcei(iChannel, AL_BUFFER, pEffect->pSample);
|
||||
|
@ -292,16 +290,14 @@ bool C4SoundInstance::Stop()
|
|||
if (!pEffect) return false;
|
||||
// Stop sound
|
||||
bool fRet = true;
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
if (Playing())
|
||||
fRet = !! FSOUND_StopSound(iChannel);
|
||||
#endif
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
// iChannel == -1 will halt all channels. Is that right?
|
||||
if (Playing())
|
||||
Mix_HaltChannel(iChannel);
|
||||
#endif
|
||||
#ifdef USE_OPEN_AL
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
if (iChannel != -1)
|
||||
{
|
||||
if (Playing()) alSourceStop(iChannel);
|
||||
|
@ -318,15 +314,13 @@ bool C4SoundInstance::Stop()
|
|||
bool C4SoundInstance::Playing()
|
||||
{
|
||||
if (!pEffect) return false;
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
if (fLooping) return true;
|
||||
return isStarted() ? FSOUND_GetCurrentSample(iChannel) == pEffect->pSample
|
||||
: C4TimeMilliseconds::Now() < tStarted + pEffect->Length;
|
||||
#endif
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
return Application.MusicSystem.MODInitialized && (iChannel != -1) && Mix_Playing(iChannel);
|
||||
#endif
|
||||
#ifdef USE_OPEN_AL
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
if (iChannel == -1)
|
||||
return false;
|
||||
else
|
||||
|
@ -363,13 +357,11 @@ void C4SoundInstance::Execute()
|
|||
// stop, if started
|
||||
if (isStarted())
|
||||
{
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
FSOUND_StopSound(iChannel);
|
||||
#endif
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
Mix_HaltChannel(iChannel);
|
||||
#endif
|
||||
#ifdef USE_OPEN_AL
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
alDeleteSources(1, (ALuint*)&iChannel);
|
||||
#endif
|
||||
iChannel = -1;
|
||||
|
@ -382,16 +374,14 @@ void C4SoundInstance::Execute()
|
|||
if (!CheckStart())
|
||||
return;
|
||||
// set volume & panning
|
||||
#ifdef HAVE_FMOD
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
FSOUND_SetVolume(iChannel, BoundBy(iVol / 100, 0, 255));
|
||||
FSOUND_SetPan(iChannel, BoundBy(256*(iPan+100)/200,0,255));
|
||||
#endif
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
Mix_Volume(iChannel, (iVol * MIX_MAX_VOLUME) / (100 * 256));
|
||||
//Mix_SetPanning(iChannel, ((100 + iPan) * 256) / 200, ((100 - iPan) * 256) / 200);
|
||||
Mix_SetPanning(iChannel, BoundBy((100 - iPan) * 256 / 100, 0, 255), BoundBy((100 + iPan) * 256 / 100, 0, 255));
|
||||
#endif
|
||||
#ifdef USE_OPEN_AL
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
alSource3f(iChannel, AL_POSITION, 0, 0, 0); // FIXME
|
||||
alSourcef(iChannel, AL_GAIN, float(iVol) / (100.0f*256.0f));
|
||||
#endif
|
||||
|
@ -448,7 +438,7 @@ bool C4SoundSystem::Init()
|
|||
if (!Reloc.Open(SoundFile, C4CFN_Sound)) return false;
|
||||
// Load static sound from Sound.ocg
|
||||
LoadEffects(SoundFile);
|
||||
#ifdef HAVE_LIBSDL_MIXER
|
||||
#if AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
Mix_AllocateChannels(C4MaxSoundInstances);
|
||||
#endif
|
||||
return true;
|
||||
|
@ -475,7 +465,7 @@ void C4SoundSystem::ClearEffects()
|
|||
|
||||
void C4SoundSystem::Execute()
|
||||
{
|
||||
#ifdef USE_OPEN_AL
|
||||
#if AUDIO_TK == AUDIO_TK_OPENAL
|
||||
Application.MusicSystem.SelectContext();
|
||||
#endif
|
||||
C4SoundEffect *csfx;
|
||||
|
|
|
@ -31,17 +31,13 @@ const int32_t
|
|||
class C4Object;
|
||||
class C4SoundInstance;
|
||||
|
||||
#if defined(HAVE_FMOD)
|
||||
#if AUDIO_TK == AUDIO_TK_FMOD
|
||||
#include <fmod.h>
|
||||
typedef FSOUND_SAMPLE* C4SoundHandle;
|
||||
#elif defined(HAVE_LIBSDL_MIXER)
|
||||
#elif AUDIO_TK == AUDIO_TK_SDL_MIXER
|
||||
typedef struct Mix_Chunk* C4SoundHandle;
|
||||
#elif defined(USE_OPEN_AL)
|
||||
#ifdef __APPLE__
|
||||
#import <OpenAL/al.h>
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#endif
|
||||
#elif AUDIO_TK == AUDIO_TK_OPENAL
|
||||
#include <al.h>
|
||||
typedef ALuint C4SoundHandle;
|
||||
#else
|
||||
typedef void* C4SoundHandle;
|
||||
|
|
Loading…
Reference in New Issue