From da96e911a3886a20827188e6f95e775746242f60 Mon Sep 17 00:00:00 2001 From: Drake Arconis <drake@alchemyviewer.org> Date: Mon, 24 Nov 2014 03:08:39 -0500 Subject: [PATCH] Fixed FMOD Studio wind, a crash when enabling profiler, minor cleanup --- indra/llaudio/llaudioengine_fmodstudio.cpp | 167 +++++++++------------ 1 file changed, 75 insertions(+), 92 deletions(-) diff --git a/indra/llaudio/llaudioengine_fmodstudio.cpp b/indra/llaudio/llaudioengine_fmodstudio.cpp index 1f6abe539e..7dd18ed834 100644 --- a/indra/llaudio/llaudioengine_fmodstudio.cpp +++ b/indra/llaudio/llaudioengine_fmodstudio.cpp @@ -72,28 +72,6 @@ inline bool Check_FMOD_Error(FMOD_RESULT result, const char *string) return true; } -void* F_STDCALL decode_alloc(unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) -{ - if(type & FMOD_MEMORY_STREAM_DECODE) - { - LL_INFOS() << "Decode buffer size: " << size << LL_ENDL; - } - else if(type & FMOD_MEMORY_STREAM_FILE) - { - LL_INFOS() << "Strean buffer size: " << size << LL_ENDL; - } - return new char[size]; -} -void* F_STDCALL decode_realloc(void *ptr, unsigned int size, FMOD_MEMORY_TYPE type, const char *sourcestr) -{ - memset(ptr,0,size); - return ptr; -} -void F_STDCALL decode_dealloc(void *ptr, FMOD_MEMORY_TYPE type, const char *sourcestr) -{ - delete[] (char*)ptr; -} - bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata) { U32 version; @@ -101,10 +79,6 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata) LL_DEBUGS("AppInit") << "LLAudioEngine_FMODSTUDIO::init() initializing FMOD" << LL_ENDL; - //result = FMOD::Memory_Initialize(NULL, 0, &decode_alloc, &decode_realloc, &decode_dealloc, FMOD_MEMORY_STREAM_DECODE | FMOD_MEMORY_STREAM_FILE); - //if(Check_FMOD_Error(result, "FMOD::Memory_Initialize")) - // return false; - result = FMOD::System_Create(&mSystem); if(Check_FMOD_Error(result, "FMOD::System_Create")) return false; @@ -129,10 +103,6 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata) if(mEnableProfiler) { fmod_flags |= FMOD_INIT_PROFILE_ENABLE; - mSystem->createChannelGroup("None", &mChannelGroups[AUDIO_TYPE_NONE]); - mSystem->createChannelGroup("SFX", &mChannelGroups[AUDIO_TYPE_SFX]); - mSystem->createChannelGroup("UI", &mChannelGroups[AUDIO_TYPE_UI]); - mSystem->createChannelGroup("Ambient", &mChannelGroups[AUDIO_TYPE_AMBIENT]); } #if LL_LINUX @@ -234,7 +204,7 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata) Ok, the speaker mode selected isn't supported by this soundcard. Switch it back to stereo... */ - result = mSystem->setSoftwareFormat(44100, FMOD_SPEAKERMODE_STEREO, 2); + result = mSystem->setSoftwareFormat(44100, FMOD_SPEAKERMODE_STEREO, 0); Check_FMOD_Error(result,"Error falling back to stereo mode"); /* ... and re-init. @@ -245,6 +215,14 @@ bool LLAudioEngine_FMODSTUDIO::init(const S32 num_channels, void* userdata) return false; #endif + if (mEnableProfiler) + { + mSystem->createChannelGroup("None", &mChannelGroups[AUDIO_TYPE_NONE]); + mSystem->createChannelGroup("SFX", &mChannelGroups[AUDIO_TYPE_SFX]); + mSystem->createChannelGroup("UI", &mChannelGroups[AUDIO_TYPE_UI]); + mSystem->createChannelGroup("Ambient", &mChannelGroups[AUDIO_TYPE_AMBIENT]); + } + // set up our favourite FMOD-native streaming audio implementation if none has already been added if (!getStreamingAudioImpl()) // no existing implementation added setStreamingAudioImpl(new LLStreamingAudio_FMODSTUDIO(mSystem)); @@ -335,79 +313,84 @@ LLAudioChannel * LLAudioEngine_FMODSTUDIO::createChannel() bool LLAudioEngine_FMODSTUDIO::initWind() { - //mNextWindUpdate = 0.0; - - //if (!mWindDSP) - //{ - // memset(mWindDSPDesc, 0, sizeof(*mWindDSPDesc)); //Set everything to zero - // strncpy(mWindDSPDesc->name, "Wind Unit", sizeof(mWindDSPDesc->name)); - // mWindDSPDesc->read = &windDSPCallback; // Assign callback - may be called from arbitrary threads - // if (Check_FMOD_Error(mSystem->createDSP(mWindDSPDesc, &mWindDSP), "FMOD::createDSP")) - // return false; - - // if (mWindGen) - // delete mWindGen; - - // int frequency = 44100; - // mSystem->getSoftwareFormat(&frequency, NULL, NULL); - // mWindGen = new LLWindGen<MIXBUFFERFORMAT>((U32) frequency); - // mWindDSP->setUserData((void*) mWindGen); - // mWindDSP->setChannelFormat(FMOD_CHANNELMASK_STEREO, 2, FMOD_SPEAKERMODE_STEREO); - //} - - //// *TODO: Should this guard against multiple plays? - //if (mWindDSP) - //{ - // mSystem->playDSP(mWindDSP, NULL, false, 0); - // return true; - //} + mNextWindUpdate = 0.0; + + if (!mWindDSP) + { + FMOD_DSP_DESCRIPTION dspdesc; + memset(&dspdesc, 0, sizeof(FMOD_DSP_DESCRIPTION)); //Set everything to zero + dspdesc.pluginsdkversion = FMOD_PLUGIN_SDK_VERSION; + strncpy(dspdesc.name, "Wind Unit", sizeof(dspdesc.name)); //Set name to "Wind Unit" + dspdesc.numoutputbuffers = 1; + dspdesc.read = &windDSPCallback; //Assign callback. + if (Check_FMOD_Error(mSystem->createDSP(&dspdesc, &mWindDSP), "FMOD::createDSP")) + return false; + + if (mWindGen) + delete mWindGen; + + int frequency = 44100; + mSystem->getSoftwareFormat(&frequency, NULL, NULL); + mWindGen = new LLWindGen<MIXBUFFERFORMAT>((U32)frequency); + mWindDSP->setUserData((void*)mWindGen); + + } + + if (mWindDSP) + { + mSystem->playDSP(mWindDSP, NULL, false, 0); + FMOD_SPEAKERMODE mode; + mSystem->getSoftwareFormat(NULL, &mode, NULL); + mWindDSP->setChannelFormat(FMOD_CHANNELMASK_STEREO, 2, mode); + return true; + } return false; } void LLAudioEngine_FMODSTUDIO::cleanupWind() { - //if (mWindDSP) - //{ - // mWindDSP->release(); - // mWindDSP = NULL; - //} - - //delete mWindGen; - //mWindGen = NULL; + if (mWindDSP) + { + mWindDSP->release(); + mWindDSP = NULL; + } + + delete mWindGen; + mWindGen = NULL; } //----------------------------------------------------------------------- void LLAudioEngine_FMODSTUDIO::updateWind(LLVector3 wind_vec, F32 camera_height_above_water) { -// LLVector3 wind_pos; -// F64 pitch; -// F64 center_freq; -// -// if (!mEnableWind) -// { -// return; -// } -// -// if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL)) -// { -// -// // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up) -// // need to convert this to the conventional orientation DS3D and OpenAL use -// // where +X = right, +Y = up, +Z = backwards -// -// wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], wind_vec.mV[0]); -// -// // cerr << "Wind update" << endl; -// -// pitch = 1.0 + mapWindVecToPitch(wind_vec); -// center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0)); -// -// mWindGen->mTargetFreq = (F32)center_freq; -// mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain; -// mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec); -// } + LLVector3 wind_pos; + F64 pitch; + F64 center_freq; + + if (!mEnableWind) + { + return; + } + + if (mWindUpdateTimer.checkExpirationAndReset(LL_WIND_UPDATE_INTERVAL)) + { + + // wind comes in as Linden coordinate (+X = forward, +Y = left, +Z = up) + // need to convert this to the conventional orientation DS3D and OpenAL use + // where +X = right, +Y = up, +Z = backwards + + wind_vec.setVec(-wind_vec.mV[1], wind_vec.mV[2], wind_vec.mV[0]); + + // cerr << "Wind update" << endl; + + pitch = 1.0 + mapWindVecToPitch(wind_vec); + center_freq = 80.0 * pow(pitch,2.5*(mapWindVecToGain(wind_vec)+1.0)); + + mWindGen->mTargetFreq = (F32)center_freq; + mWindGen->mTargetGain = (F32)mapWindVecToGain(wind_vec) * mMaxWindGain; + mWindGen->mTargetPanGainR = (F32)mapWindVecToPan(wind_vec); + } } //----------------------------------------------------------------------- -- GitLab