Fixed FMOD Ex support under linux

This commit is contained in:
Drake Arconis
2012-05-15 10:36:48 -04:00
parent 3d40f96dfe
commit 5a2d160ac4
6 changed files with 91 additions and 101 deletions

View File

@@ -7,10 +7,8 @@ include(Audio)
include(LLAudio) include(LLAudio)
if (FMODEX) if (FMODEX)
include(FMODEX) include(FMODEX)
if(FMODEX)
set(FMOD OFF) set(FMOD OFF)
endif (FMODEX) endif (FMODEX)
endif(FMODEX)
if (NOT FMODEX) if (NOT FMODEX)
include(FMOD) include(FMOD)
endif (NOT FMODEX) endif (NOT FMODEX)

View File

@@ -242,8 +242,8 @@ BOOL LLVorbisDecodeState::initDecode()
llwarns << "No default bitstream found" << llendl; llwarns << "No default bitstream found" << llendl;
} }
// <edit> // <edit>
// This magic value is equivilent to 150MiB of data. // This magic value is equivalent to 150MiB of data.
// Prevents griffers from utilizin a huge xbox sound the size of god to instafry the viewer // Prevents griefers from utilizing a huge xbox sound the size of god to instafry the viewer
if(size_guess >= 157286400) if(size_guess >= 157286400)
{ {
llwarns << "Bad sound caught by zmagic" << llendl; llwarns << "Bad sound caught by zmagic" << llendl;

View File

@@ -105,10 +105,6 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
U32 version; U32 version;
FMOD_RESULT result; FMOD_RESULT result;
int numdrivers;
FMOD_SPEAKERMODE speakermode;
FMOD_CAPS caps;
char name[256];
LL_DEBUGS("AppInit") << "LLAudioEngine_FMODEX::init() initializing FMOD" << LL_ENDL; LL_DEBUGS("AppInit") << "LLAudioEngine_FMODEX::init() initializing FMOD" << LL_ENDL;
@@ -124,11 +120,16 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
if (version < FMOD_VERSION) if (version < FMOD_VERSION)
{ {
LL_WARNS("AppInit") << "Error : You are using the wrong FMOD version (" << version LL_WARNS("AppInit") << "Error : You are using the wrong FMOD Ex version (" << version
<< ")! You should be using FMOD " << FMOD_VERSION << LL_ENDL; << ")! You should be using FMOD Ex" << FMOD_VERSION << LL_ENDL;
} }
#if LL_WINDOWS #if LL_WINDOWS
int numdrivers;
FMOD_SPEAKERMODE speakermode;
FMOD_CAPS caps;
char name[256];
//Is this block applicable to linux? //Is this block applicable to linux?
{ {
result = mSystem->getNumDrivers(&numdrivers); result = mSystem->getNumDrivers(&numdrivers);
@@ -181,64 +182,36 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
fmod_flags |= FMOD_INIT_ENABLE_PROFILE; fmod_flags |= FMOD_INIT_ENABLE_PROFILE;
#if LL_LINUX #if LL_LINUX
// If we don't set an output method, Linux FMOD always
// decides on OSS and fails otherwise. So we'll manually
// try ESD, then OSS, then ALSA.
// Why this order? See SL-13250, but in short, OSS emulated
// on top of ALSA is ironically more reliable than raw ALSA.
// Ack, and ESD has more reliable failure modes - but has worse
// latency - than all of them, so wins for now.
bool audio_ok = false; bool audio_ok = false;
if (!audio_ok) if (!audio_ok)
{ {
if (NULL == getenv("LL_BAD_FMODEX_ESD")) /*Flawfinder: ignore*/ if (NULL == getenv("LL_BAD_FMOD_PULSEAUDIO")) /*Flawfinder: ignore*/
{ {
LL_DEBUGS("AppInit") << "Trying ESD audio output..." << LL_ENDL; LL_DEBUGS("AppInit") << "Trying PulseAudio audio output..." << LL_ENDL;
if(mSystem->SetOutput(FMOD_OUTPUTTYPE_ESD) == FMOD_OK && if(mSystem->setOutput(FMOD_OUTPUTTYPE_PULSEAUDIO) == FMOD_OK &&
(result = mSystem->init(num_channels, fmod_flags, 0)) == FMOD_OK) (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK)
{ {
LL_DEBUGS("AppInit") << "ESD audio output initialized OKAY" << LL_ENDL; LL_DEBUGS("AppInit") << "PulseAudio output initialized OKAY" << LL_ENDL;
audio_ok = true; audio_ok = true;
} }
else else
{ {
Check_FMOD_Error(result, "ESD audio output FAILED to initialize"); Check_FMOD_Error(result, "PulseAudio audio output FAILED to initialize");
} }
} }
else else
{ {
LL_DEBUGS("AppInit") << "ESD audio output SKIPPED" << LL_ENDL; LL_DEBUGS("AppInit") << "PulseAudio audio output SKIPPED" << LL_ENDL;
} }
} }
if (!audio_ok) if (!audio_ok)
{ {
if (NULL == getenv("LL_BAD_FMODEX_OSS")) /*Flawfinder: ignore*/ if (NULL == getenv("LL_BAD_FMOD_ALSA")) /*Flawfinder: ignore*/
{
LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL;
if(mSystem->SetOutput(FMOD_OUTPUTTYPE_OSS) == FMOD_OK &&
(result = mSystem->init(num_channels, fmod_flags, 0)) == FMOD_OK)
{
LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL;
audio_ok = true;
}
else
{
Check_FMOD_Error(result, "OSS audio output FAILED to initialize" << LL_ENDL;
}
}
else
{
LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL;
}
}
if (!audio_ok)
{
if (NULL == getenv("LL_BAD_FMODEX_ALSA")) /*Flawfinder: ignore*/
{ {
LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL; LL_DEBUGS("AppInit") << "Trying ALSA audio output..." << LL_ENDL;
if(mSystem->SetOutput(FMOD_OUTPUTTYPE_ALSA) && if(mSystem->setOutput(FMOD_OUTPUTTYPE_ALSA) == FMOD_OK &&
(result = mSystem->init(num_channels, fmod_flags, 0)) == FMOD_OK) (result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK)
{ {
LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL; LL_DEBUGS("AppInit") << "ALSA audio output initialized OKAY" << LL_ENDL;
audio_ok = true; audio_ok = true;
@@ -247,7 +220,29 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
{ {
Check_FMOD_Error(result, "ALSA audio output FAILED to initialize"); Check_FMOD_Error(result, "ALSA audio output FAILED to initialize");
} }
} else }
else
{
LL_DEBUGS("AppInit") << "ALSA audio output SKIPPED" << LL_ENDL;
}
}
if (!audio_ok)
{
if (NULL == getenv("LL_BAD_FMOD_OSS")) /*Flawfinder: ignore*/
{
LL_DEBUGS("AppInit") << "Trying OSS audio output..." << LL_ENDL;
if(mSystem->setOutput(FMOD_OUTPUTTYPE_OSS) == FMOD_OK &&
(result = mSystem->init(num_channels + 2, fmod_flags, 0)) == FMOD_OK)
{
LL_DEBUGS("AppInit") << "OSS audio output initialized OKAY" << LL_ENDL;
audio_ok = true;
}
else
{
Check_FMOD_Error(result, "OSS audio output FAILED to initialize");
}
}
else
{ {
LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL; LL_DEBUGS("AppInit") << "OSS audio output SKIPPED" << LL_ENDL;
} }
@@ -258,25 +253,20 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
return false; return false;
} }
// On Linux, FMOD causes a SIGPIPE for some netstream error
// conditions (an FMOD bug); ignore SIGPIPE so it doesn't crash us.
// NOW FIXED in FMOD 3.x since 2006-10-01.
//signal(SIGPIPE, SIG_IGN);
// We're interested in logging which output method we // We're interested in logging which output method we
// ended up with, for QA purposes. // ended up with, for QA purposes.
FMOD_OUTPUTTYPE output_type; FMOD_OUTPUTTYPE output_type;
mSystem->getOutput(output_type); mSystem->getOutput(&output_type);
switch (output_type) switch (output_type)
{ {
case FSOUND_OUTPUT_NOSOUND: case FMOD_OUTPUTTYPE_NOSOUND:
LL_DEBUGS("AppInit") << "Audio output: NoSound" << LL_ENDL; break; LL_INFOS("AppInit") << "Audio output: NoSound" << LL_ENDL; break;
case FSOUND_OUTPUT_OSS: case FMOD_OUTPUTTYPE_PULSEAUDIO:
LL_DEBUGS("AppInit") << "Audio output: OSS" << LL_ENDL; break; LL_INFOS("AppInit") << "Audio output: PulseAudio" << LL_ENDL; break;
case FSOUND_OUTPUT_ESD: case FMOD_OUTPUTTYPE_ALSA:
LL_DEBUGS("AppInit") << "Audio output: ESD" << LL_ENDL; break; LL_INFOS("AppInit") << "Audio output: ALSA" << LL_ENDL; break;
case FSOUND_OUTPUT_ALSA: case FMOD_OUTPUTTYPE_OSS:
LL_DEBUGS("AppInit") << "Audio output: ALSA" << LL_ENDL; break; LL_INFOS("AppInit") << "Audio output: OSS" << LL_ENDL; break;
default: default:
LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break; LL_INFOS("AppInit") << "Audio output: Unknown!" << LL_ENDL; break;
}; };
@@ -297,7 +287,7 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
*/ */
result = mSystem->init(100, FMOD_INIT_NORMAL, 0); result = mSystem->init(100, FMOD_INIT_NORMAL, 0);
} }
if(Check_FMOD_Error(result, "Error initializing FMOD")) if(Check_FMOD_Error(result, "Error initializing FMOD Ex"))
return false; return false;
#endif #endif
@@ -305,7 +295,7 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata)
if (!getStreamingAudioImpl()) // no existing implementation added if (!getStreamingAudioImpl()) // no existing implementation added
setStreamingAudioImpl(new LLStreamingAudio_FMODEX(mSystem)); setStreamingAudioImpl(new LLStreamingAudio_FMODEX(mSystem));
LL_DEBUGS("AppInit") << "LLAudioEngine_FMODEX::init() FMOD initialized correctly" << LL_ENDL; LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init() FMOD Ex initialized correctly" << LL_ENDL;
mInited = true; mInited = true;
@@ -321,10 +311,10 @@ std::string LLAudioEngine_FMODEX::getDriverName(bool verbose)
U32 version; U32 version;
if(!Check_FMOD_Error(mSystem->getVersion(&version), "FMOD::System::getVersion")) if(!Check_FMOD_Error(mSystem->getVersion(&version), "FMOD::System::getVersion"))
{ {
return llformat("FMOD version %1x.%02x.%02x", version >> 16, version >> 8 & 0x000000FF, version & 0x000000FF); return llformat("FMOD Ex %1x.%02x.%02x", version >> 16, version >> 8 & 0x000000FF, version & 0x000000FF);
} }
} }
return "FMOD"; return "FMODEx";
} }
@@ -342,12 +332,13 @@ void LLAudioEngine_FMODEX::shutdown()
{ {
stopInternetStream(); stopInternetStream();
llinfos << "About to LLAudioEngine::shutdown()" << llendl;
LLAudioEngine::shutdown(); LLAudioEngine::shutdown();
llinfos << "LLAudioEngine_FMODEX::shutdown() closing FMOD" << llendl; llinfos << "LLAudioEngine_FMODEX::shutdown() closing FMOD Ex" << llendl;
mSystem->close(); mSystem->close();
mSystem->release(); mSystem->release();
llinfos << "LLAudioEngine_FMODEX::shutdown() done closing FMOD" << llendl; llinfos << "LLAudioEngine_FMODEX::shutdown() done closing FMOD Ex" << llendl;
delete mListenerp; delete mListenerp;
mListenerp = NULL; mListenerp = NULL;

View File

@@ -1359,32 +1359,33 @@ if (FMOD OR FMODEX)
set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD") set(LLSTARTUP_COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS} -DLL_FMOD")
endif (FMOD) endif (FMOD)
if (NOT WINDOWS) if (DARWIN)
set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp) set(fmodwrapper_SOURCE_FILES fmodwrapper.cpp)
add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES}) add_library(fmodwrapper SHARED ${fmodwrapper_SOURCE_FILES})
if(FMOD AND FMODEX)
set(fmodwrapper_needed_LIBRARIES "${FMODEX_LIBRARY} ${FMOD_LIBRARY}")
else(FMOD AND FMODEX)
if (FMODEX) if (FMODEX)
set(fmodwrapper_needed_LIBRARIES ${FMODEX_LIBRARY}) set(fmodwrapper_needed_LIBRARIES ${FMODEX_LIBRARY} ${CARBON_LIBRARY})
endif (FMODEX) endif (FMODEX)
if (FMOD) if (FMOD)
set(fmodwrapper_needed_LIBRARIES "${FMOD_LIBRARY}") set(fmodwrapper_needed_LIBRARIES ${FMOD_LIBRARY} ${CARBON_LIBRARY})
endif (FMOD) endif (FMOD)
endif(FMOD AND FMODEX)
if (DARWIN)
list(APPEND fmodwrapper_needed_LIBRARIES ${CARBON_LIBRARY})
set_target_properties( set_target_properties(
fmodwrapper fmodwrapper
PROPERTIES PROPERTIES
BUILD_WITH_INSTALL_RPATH 1 BUILD_WITH_INSTALL_RPATH 1
INSTALL_NAME_DIR "@executable_path/../Resources" INSTALL_NAME_DIR "@executable_path/../Resources"
LINK_FLAGS "-unexported_symbols_list \"${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp\"" LINK_FLAGS "-unexported_symbols_list ${CMAKE_CURRENT_SOURCE_DIR}/fmod_hidden_symbols.exp"
) )
endif (DARWIN)
set(FMODWRAPPER_LIBRARY fmodwrapper) set(FMODWRAPPER_LIBRARY fmodwrapper)
target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES}) target_link_libraries(fmodwrapper ${fmodwrapper_needed_LIBRARIES})
endif (NOT WINDOWS) else (DARWIN)
# fmodwrapper unnecessary on linux or windows, for fmod and fmodex
if (FMODEX)
set(FMODWRAPPER_LIBRARY ${FMODEX_LIBRARY})
endif (FMODEX)
if (FMOD)
set(FMODWRAPPER_LIBRARY ${FMOD_LIBRARY})
endif (FMOD)
endif (DARWIN)
endif (FMOD OR FMODEX) endif (FMOD OR FMODEX)
set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}") set_source_files_properties(llstartup.cpp PROPERTIES COMPILE_FLAGS "${LLSTARTUP_COMPILE_FLAGS}")