diff --git a/indra/llaudio/llaudioengine_fmodex.cpp b/indra/llaudio/llaudioengine_fmodex.cpp index 2b2bd19d5..d57ef7f3a 100644 --- a/indra/llaudio/llaudioengine_fmodex.cpp +++ b/indra/llaudio/llaudioengine_fmodex.cpp @@ -95,6 +95,28 @@ 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) + { + llinfos << "Decode buffer size: " << size << llendl; + } + else if(type & FMOD_MEMORY_STREAM_FILE) + { + llinfos << "Strean buffer size: " << size << llendl; + } + 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_FMODEX::init(const S32 num_channels, void* userdata) { @@ -108,6 +130,10 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata) LL_DEBUGS("AppInit") << "LLAudioEngine_FMODEX::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; @@ -124,54 +150,8 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata) << ")! You should be using FMOD Ex" << FMOD_VERSION << LL_ENDL; } -#if LL_WINDOWS - int numdrivers; - FMOD_SPEAKERMODE speakermode; - FMOD_CAPS caps; - char name[256]; - - //Is this block applicable to linux? - { - result = mSystem->getNumDrivers(&numdrivers); - Check_FMOD_Error(result, "FMOD::System::getNumDrivers"); - if (numdrivers == 0) - { - result = mSystem->setOutput(FMOD_OUTPUTTYPE_NOSOUND); - Check_FMOD_Error(result, "FMOD::System::setOutput"); - } - else - { - result = mSystem->getDriverCaps(0, &caps, 0, &speakermode); - Check_FMOD_Error(result,"FMOD::System::getDriverCaps"); - /* - Set the user selected speaker mode. - */ - result = mSystem->setSpeakerMode(speakermode); - Check_FMOD_Error(result, "FMOD::System::setSpeakerMode"); - if (caps & FMOD_CAPS_HARDWARE_EMULATED) - { - /* - The user has the 'Acceleration' slider set to off! This is really bad - for latency! You might want to warn the user about this. - */ - result = mSystem->setDSPBufferSize(1024, 10); - Check_FMOD_Error(result, "FMOD::System::setDSPBufferSize"); - } - result = mSystem->getDriverInfo(0, name, 256, 0); - Check_FMOD_Error(result, "FMOD::System::getDriverInfo"); - - if (strstr(name, "SigmaTel")) - { - /* - Sigmatel sound devices crackle for some reason if the format is PCM 16bit. - PCM floating point output seems to solve it. - */ - result = mSystem->setSoftwareFormat(48000, FMOD_SOUND_FORMAT_PCMFLOAT, 0,0, FMOD_DSP_RESAMPLER_LINEAR); - Check_FMOD_Error(result,"FMOD::System::setSoftwareFormat"); - } - } - } -#endif //LL_WINDOWS + result = mSystem->setSoftwareFormat(44100, FMOD_SOUND_FORMAT_PCM16, 0, 0, FMOD_DSP_RESAMPLER_LINEAR); + Check_FMOD_Error(result,"FMOD::System::setSoftwareFormat"); // In this case, all sounds, PLUS wind and stream will be software. result = mSystem->setSoftwareChannels(num_channels + 2); @@ -297,6 +277,19 @@ bool LLAudioEngine_FMODEX::init(const S32 num_channels, void* userdata) LL_INFOS("AppInit") << "LLAudioEngine_FMODEX::init() FMOD Ex initialized correctly" << LL_ENDL; + int r_numbuffers, r_samplerate, r_channels, r_bits; + unsigned int r_bufferlength; + char r_name[256]; + mSystem->getDSPBufferSize(&r_bufferlength, &r_numbuffers); + mSystem->getSoftwareFormat(&r_samplerate, NULL, &r_channels, NULL, NULL, &r_bits); + mSystem->getDriverInfo(0, r_name, 255, 0); + r_name[255] = '\0'; + int latency = 1000.0 * r_bufferlength * r_numbuffers /r_samplerate; + + LL_INFOS("AppInit") << "FMOD device: "<< r_name << "\n" + << "FMOD Ex parameters: " << r_samplerate << " Hz * " << r_channels << " * " <setStreamBufferSize(estimated_bitrate * buffer_seconds * 128/*bytes/kbit*/, FMOD_TIMEUNIT_RAWBYTES); @@ -145,7 +145,10 @@ void LLStreamingAudio_FMODEX::update() return; } - FMOD_OPENSTATE open_state = mCurrentInternetStreamp->getOpenState(); + unsigned int progress; + bool starving; + bool diskbusy; + FMOD_OPENSTATE open_state = mCurrentInternetStreamp->getOpenState(&progress, &starving, &diskbusy); if (open_state == FMOD_OPENSTATE_READY) { @@ -158,6 +161,7 @@ void LLStreamingAudio_FMODEX::update() // Reset volume to previously set volume setGain(getGain()); mFMODInternetStreamChannelp->setPaused(false); + mLastStarved.stop(); } } else if(open_state == FMOD_OPENSTATE_ERROR) @@ -168,6 +172,7 @@ void LLStreamingAudio_FMODEX::update() if(mFMODInternetStreamChannelp) { + //llinfos << "progress = " << progress << llendl; if(!mMetaData) mMetaData = new LLSD; @@ -237,12 +242,29 @@ void LLStreamingAudio_FMODEX::update() } } } + if(starving) + { + if(!mLastStarved.getStarted()) + { + llinfos << "Stream starvation detected! Muting stream audio until it clears." << llendl; + llinfos << " (diskbusy="<setMute(true); + } + mLastStarved.start(); + } + else if(mLastStarved.getStarted() && mLastStarved.getElapsedTimeF32() > 1.f) + { + mLastStarved.stop(); + mFMODInternetStreamChannelp->setMute(false); + } } } } void LLStreamingAudio_FMODEX::stop() { + mLastStarved.stop(); if(mMetaData) { delete mMetaData; @@ -341,6 +363,11 @@ void LLStreamingAudio_FMODEX::setGain(F32 vol) if(!mFMODInternetStreamChannelp || !mCurrentInternetStreamp) return false; + bool muted=false; + mFMODInternetStreamChannelp->getMute(&muted); + if(muted) + return false; + static std::vector local_array(count); //Have to have an extra buffer to mix channels. Bleh. if(count > (S32)local_array.size()) //Expand the array if needed. Try to minimize allocation calls, so don't ever shrink. local_array.resize(count); @@ -442,9 +469,19 @@ bool LLAudioStreamManagerFMODEX::stopStream() } } -FMOD_OPENSTATE LLAudioStreamManagerFMODEX::getOpenState() +FMOD_OPENSTATE LLAudioStreamManagerFMODEX::getOpenState(unsigned int* percentbuffered, bool* starving, bool* diskbusy) { FMOD_OPENSTATE state; - mInternetStream->getOpenState(&state,NULL,NULL,NULL); + mInternetStream->getOpenState(&state,percentbuffered,starving,diskbusy); return state; } + +void LLStreamingAudio_FMODEX::setBufferSizes(U32 streambuffertime, U32 decodebuffertime) +{ + mSystem->setStreamBufferSize(streambuffertime/1000*128*128, FMOD_TIMEUNIT_RAWBYTES); + FMOD_ADVANCEDSETTINGS settings; + memset(&settings,0,sizeof(settings)); + settings.cbsize=sizeof(settings); + settings.defaultDecodeBufferSize = decodebuffertime;//ms + mSystem->setAdvancedSettings(&settings); +} \ No newline at end of file diff --git a/indra/llaudio/llstreamingaudio_fmodex.h b/indra/llaudio/llstreamingaudio_fmodex.h index 064b266e6..1b5211485 100644 --- a/indra/llaudio/llstreamingaudio_fmodex.h +++ b/indra/llaudio/llstreamingaudio_fmodex.h @@ -37,6 +37,7 @@ #include "stdtypes.h" // from llcommon #include "llstreamingaudio.h" +#include "lltimer.h" //Stubs class LLAudioStreamManagerFMODEX; @@ -66,6 +67,8 @@ class LLStreamingAudio_FMODEX : public LLStreamingAudioInterface /*virtual*/ const LLSD *getMetaData(){return mMetaData;} //return NULL if not playing. /*virtual*/ bool supportsWaveData(){return true;} /*virtual*/ bool getWaveData(float* arr, S32 count, S32 stride = 1); + /*virtual*/ bool supportsAdjustableBufferSizes(){return true;} + /*virtual*/ void setBufferSizes(U32 streambuffertime, U32 decodebuffertime); private: FMOD::System *mSystem; @@ -76,6 +79,8 @@ private: std::string mURL; F32 mGain; + LLTimer mLastStarved; + LLSD *mMetaData; }; diff --git a/indra/llplugin/slplugin/CMakeLists.txt b/indra/llplugin/slplugin/CMakeLists.txt index 7e957d356..ea9afec16 100644 --- a/indra/llplugin/slplugin/CMakeLists.txt +++ b/indra/llplugin/slplugin/CMakeLists.txt @@ -55,7 +55,6 @@ set_target_properties(SLPlugin ) target_link_libraries(SLPlugin - ${GOOGLE_PERFTOOLS_LIBRARIES} ${LLPLUGIN_LIBRARIES} ${LLMESSAGE_LIBRARIES} ${LLCOMMON_LIBRARIES} @@ -82,11 +81,4 @@ if (DARWIN) ) endif (DARWIN) -if (WINDOWS) - set_target_properties(SLPlugin - PROPERTIES - LINK_FLAGS "${GOOGLE_PERFTOOLS_LINKER_FLAGS}" - ) -endif (WINDOWS) - #ll_deploy_sharedlibs_command(SLPlugin) diff --git a/indra/newview/app_settings/settings_sh.xml b/indra/newview/app_settings/settings_sh.xml index 803f7a12e..feae4cb77 100644 --- a/indra/newview/app_settings/settings_sh.xml +++ b/indra/newview/app_settings/settings_sh.xml @@ -40,6 +40,28 @@ Boolean Value 0 + + SHFMODExStreamBufferSize + + Comment + Sets the streaming buffer size (in milliseconds) + Persist + 1 + Type + U32 + Value + 7000 + + SHFMODExDecodeBufferSize + + Comment + Sets the streaming decode buffer size (in milliseconds) + Persist + 1 + Type + U32 + Value + 1000 SHAllowScriptCommands diff --git a/indra/newview/linux_tools/wrapper.sh b/indra/newview/linux_tools/wrapper.sh index ea944f1c2..04edf2a76 100755 --- a/indra/newview/linux_tools/wrapper.sh +++ b/indra/newview/linux_tools/wrapper.sh @@ -59,8 +59,15 @@ ## you're building your own viewer, bear in mind that the executable ## in the bin directory will be stripped: you should replace it with ## an unstripped binary before you run. -#export LL_WRAPPER='gdb --args' -#export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' +if [ -n "$ASCENDED_DEVELOPER" ]; then + if [ "$ASCENDED_DEVELOPER" = "1" ]; then + export LL_WRAPPER='gdb --args' + elif [ "$ASCENDED_DEVELOPER" = "2" ]; then + export LL_WRAPPER='valgrind --smc-check=all --error-limit=no --log-file=secondlife.vg --leak-check=full --suppressions=/usr/lib/valgrind/glibc-2.5.supp --suppressions=secondlife-i686.supp' + elif [ "$ASCENDED_DEVELOPER" = "3" ]; then + export LL_WRAPPER='strace -f -ff -o singularity.strace' + fi +fi ## - This allows one to set an arbitrary value for LD_PRELOAD. ## It won't work if LL_TCMALLOC is set because that uses it's diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 8fcbb600e..1995efd2c 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -4206,7 +4206,7 @@ void LLSoundBridge::openSoundPreview(void* which) rect.translate(left - rect.mLeft, top - rect.mTop); LLPreviewSound* preview = new LLPreviewSound("preview sound", rect, - std::string("Sound: ") + me->getName(), + LLTrans::getString("Sound: ") + me->getName(), me->mUUID); preview->setFocus(TRUE); // Keep entirely onscreen. @@ -6308,7 +6308,7 @@ public: rect.translate(left - rect.mLeft, top - rect.mTop); LLPreviewSound* preview = new LLPreviewSound("preview sound", rect, - std::string("Sound: ") + item->getName(), + LLTrans::getString("Sound: ") + item->getName(), mUUID); preview->setFocus(TRUE); // Keep entirely onscreen. diff --git a/indra/newview/llviewerfoldertype.cpp b/indra/newview/llviewerfoldertype.cpp index 8c7184ede..a779b617b 100644 --- a/indra/newview/llviewerfoldertype.cpp +++ b/indra/newview/llviewerfoldertype.cpp @@ -125,15 +125,15 @@ LLViewerFolderDictionary::LLViewerFolderDictionary() addEntry(LLFolderType::FT_LOST_AND_FOUND, new ViewerFolderEntry("Lost And Found", "inv_folder_lostandfound.tga", "inv_folder_lostandfound.tga", TRUE, false)); addEntry(LLFolderType::FT_ANIMATION, new ViewerFolderEntry("Animations", "inv_folder_animation.tga", "inv_folder_animation.tga", FALSE, false)); addEntry(LLFolderType::FT_GESTURE, new ViewerFolderEntry("Gestures", "inv_folder_gesture.tga", "inv_folder_gesture.tga", FALSE, false)); - addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", FALSE, false)); + addEntry(LLFolderType::FT_FAVORITE, new ViewerFolderEntry("Favorites", "inv_folder_favorite.tga", "inv_folder_favorite.tga", FALSE, false)); - addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", TRUE, false)); - addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", TRUE, false)); - addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", TRUE, false)); - addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", FALSE, false)); + addEntry(LLFolderType::FT_CURRENT_OUTFIT, new ViewerFolderEntry("Current Outfit", "inv_folder_outfit.tga", "inv_folder_outfit.tga", TRUE, false)); + addEntry(LLFolderType::FT_OUTFIT, new ViewerFolderEntry("New Outfit", "inv_folder_outfit.tga", "inv_folder_outfit.tga", TRUE, false)); + addEntry(LLFolderType::FT_MY_OUTFITS, new ViewerFolderEntry("My Outfits", "inv_folder_outfit.tga", "inv_folder_outfit.tga", TRUE, false)); + addEntry(LLFolderType::FT_MESH, new ViewerFolderEntry("Meshes", "inv_folder_mesh.tga", "inv_folder_mesh.tga", FALSE, false)); - addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", FALSE, false)); - addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Outbox", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", FALSE, false)); + addEntry(LLFolderType::FT_INBOX, new ViewerFolderEntry("Inbox", "inv_folder_inbox.tga", "inv_folder_inbox.tga", FALSE, false)); + addEntry(LLFolderType::FT_OUTBOX, new ViewerFolderEntry("Outbox", "inv_folder_outbox.tga", "inv_folder_outbox.tga", FALSE, false)); addEntry(LLFolderType::FT_BASIC_ROOT, new ViewerFolderEntry("Basic Root", "inv_folder_plain_open.tga", "inv_folder_plain_closed.tga", FALSE, false)); diff --git a/indra/newview/llviewerparcelmedia.cpp b/indra/newview/llviewerparcelmedia.cpp index 9e7df265e..1349429ee 100644 --- a/indra/newview/llviewerparcelmedia.cpp +++ b/indra/newview/llviewerparcelmedia.cpp @@ -54,6 +54,7 @@ #include "llaudioengine.h" #include "lloverlaybar.h" #include "slfloatermediafilter.h" +#include "llstreamingaudio.h" // Static Variables @@ -661,6 +662,9 @@ void LLViewerParcelMedia::playStreamingMusic(LLParcel* parcel, bool filter) else if (gAudiop) { LLStringUtil::trim(music_url); + LLStreamingAudioInterface *stream = gAudiop->getStreamingAudioImpl(); + if(stream && stream->supportsAdjustableBufferSizes()) + stream->setBufferSizes(gSavedSettings.getU32("SHFMODExStreamBufferSize"),gSavedSettings.getU32("SHFMODExDecodeBufferSize")); gAudiop->startInternetStream(music_url); if (music_url.empty()) { diff --git a/indra/newview/skins/default/textures/inv_folder_favorite.tga b/indra/newview/skins/default/textures/inv_folder_favorite.tga new file mode 100644 index 000000000..a6c807d12 Binary files /dev/null and b/indra/newview/skins/default/textures/inv_folder_favorite.tga differ diff --git a/indra/newview/skins/default/textures/inv_folder_inbox.tga b/indra/newview/skins/default/textures/inv_folder_inbox.tga new file mode 100644 index 000000000..04539c2cc Binary files /dev/null and b/indra/newview/skins/default/textures/inv_folder_inbox.tga differ diff --git a/indra/newview/skins/default/textures/inv_folder_mesh.tga b/indra/newview/skins/default/textures/inv_folder_mesh.tga new file mode 100644 index 000000000..be95f0007 Binary files /dev/null and b/indra/newview/skins/default/textures/inv_folder_mesh.tga differ diff --git a/indra/newview/skins/default/textures/inv_folder_outbox.tga b/indra/newview/skins/default/textures/inv_folder_outbox.tga new file mode 100644 index 000000000..589348221 Binary files /dev/null and b/indra/newview/skins/default/textures/inv_folder_outbox.tga differ diff --git a/indra/newview/skins/default/textures/inv_folder_outfit.tga b/indra/newview/skins/default/textures/inv_folder_outfit.tga new file mode 100644 index 000000000..dfb05929b Binary files /dev/null and b/indra/newview/skins/default/textures/inv_folder_outfit.tga differ diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml index 973f76923..3552b3eaf 100644 --- a/indra/newview/skins/default/textures/textures.xml +++ b/indra/newview/skins/default/textures/textures.xml @@ -105,11 +105,16 @@ + + + + + @@ -147,7 +152,7 @@ - + @@ -370,6 +375,9 @@ + + + @@ -396,7 +404,10 @@ - + + + + diff --git a/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml b/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml index 0c422f1c8..36596ca13 100644 --- a/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml +++ b/indra/newview/skins/default/xui/en-us/floater_preview_sound.xml @@ -23,4 +23,5 @@ mouse_opaque="true" name="Sound play btn" scale_image="true" sound_flags="0" tool_tip="Play this sound so that others can hear it." width="120" /> + Sound: diff --git a/indra/newview/skins/default/xui/es/floater_post_process.xml b/indra/newview/skins/default/xui/es/floater_post_process.xml index aef810211..138856077 100644 --- a/indra/newview/skins/default/xui/es/floater_post_process.xml +++ b/indra/newview/skins/default/xui/es/floater_post_process.xml @@ -1,141 +1,59 @@ - - - - - Gama - - - - Brillo - - - - Saturación - - - - Contraste - - - - Color base del contraste - - - - - - - - - - Pasos a aplicar - - - - - - - Light Amplification Multiple + + + + + Gama - - - Noise Size + + + Brillo - - - Noise Strength + + + Saturación - + + + Contraste + + + + Color base del contraste + + + + + - - -