Fix for DEV-41435 and DEV-41434 (unload media instances associated with muted objects/object owners)

Unloading based on object owner isn't completely reliable, because the viewer doesn't have owner data for all objects it knows about.
meow-7.2.2
Monroe Linden 2009-10-27 14:27:48 -07:00
parent b93c4d6bd6
commit ea020bea59
2 changed files with 77 additions and 2 deletions

View File

@ -49,6 +49,7 @@
#include "llnotifications.h"
#include "lluuid.h"
#include "llkeyboard.h"
#include "llmutelist.h"
#include <boost/bind.hpp> // for SkinFolder listener
#include <boost/signals2.hpp>
@ -195,6 +196,14 @@ static void remove_media_impl(LLViewerMediaImpl* media)
}
}
class LLViewerMediaMuteListObserver : public LLMuteListObserver
{
/* virtual */ void onChange() { LLViewerMedia::muteListChanged();}
};
static LLViewerMediaMuteListObserver sViewerMediaMuteListObserver;
static bool sViewerMediaMuteListObserverInitialized = false;
//////////////////////////////////////////////////////////////////////////////////////////
// LLViewerMedia
@ -410,10 +419,35 @@ F32 LLViewerMedia::getVolume()
return sGlobalVolume;
}
//////////////////////////////////////////////////////////////////////////////////////////
// static
void LLViewerMedia::muteListChanged()
{
// When the mute list changes, we need to check mute status on all impls.
impl_list::iterator iter = sViewerMediaImplList.begin();
impl_list::iterator end = sViewerMediaImplList.end();
for(; iter != end; iter++)
{
LLViewerMediaImpl* pimpl = *iter;
pimpl->mNeedsMuteCheck = true;
}
}
// This is the predicate function used to sort sViewerMediaImplList by priority.
static inline bool compare_impl_interest(const LLViewerMediaImpl* i1, const LLViewerMediaImpl* i2)
{
if(i1->hasFocus())
if(i1->mIsMuted)
{
// Muted items always go to the end of the list, period.
return false;
}
else if(i2->mIsMuted)
{
// Muted items always go to the end of the list, period.
return true;
}
else if(i1->hasFocus())
{
// The item with user focus always comes to the front of the list, period.
return true;
@ -487,8 +521,9 @@ void LLViewerMedia::updateMedia()
LLPluginClassMedia::EPriority new_priority = LLPluginClassMedia::PRIORITY_NORMAL;
if(impl_count_total > (int)max_instances)
if(pimpl->mIsMuted || (impl_count_total > (int)max_instances))
{
// Never load muted impls.
// Hard limit on the number of instances that will be loaded at one time
new_priority = LLPluginClassMedia::PRIORITY_UNLOADED;
}
@ -605,8 +640,17 @@ LLViewerMediaImpl::LLViewerMediaImpl( const LLUUID& texture_id,
mDoNavigateOnLoadServerRequest(false),
mMediaSourceFailedInit(false),
mRequestedVolume(1.0f),
mIsMuted(false),
mNeedsMuteCheck(false),
mIsUpdated(false)
{
// Set up the mute list observer if it hasn't been set up already.
if(!sViewerMediaMuteListObserverInitialized)
{
LLMuteList::getInstance()->addObserver(&sViewerMediaMuteListObserver);
sViewerMediaMuteListObserverInitialized = true;
}
add_media_impl(this);
@ -1721,6 +1765,32 @@ void LLViewerMediaImpl::calculateInterest()
// This will be a relatively common case now, since it will always be true for unloaded media.
mInterest = 0.0f;
}
if(mNeedsMuteCheck)
{
// Check all objects this instance is associated with, and those objects' owners, against the mute list
mIsMuted = false;
std::list< LLVOVolume* >::iterator iter = mObjectList.begin() ;
for(; iter != mObjectList.end() ; ++iter)
{
LLVOVolume *obj = *iter;
if(LLMuteList::getInstance()->isMuted(obj->getID()))
mIsMuted = true;
else
{
// We won't have full permissions data for all objects. Attempt to mute objects when we can tell their owners are muted.
LLPermissions* obj_perm = LLSelectMgr::getInstance()->findObjectPermissions(obj);
if(obj_perm)
{
if(LLMuteList::getInstance()->isMuted(obj_perm->getOwner()))
mIsMuted = true;
}
}
}
mNeedsMuteCheck = false;
}
}
F64 LLViewerMediaImpl::getApproximateTextureInterest()
@ -1828,11 +1898,13 @@ void LLViewerMediaImpl::addObject(LLVOVolume* obj)
}
mObjectList.push_back(obj) ;
mNeedsMuteCheck = true;
}
void LLViewerMediaImpl::removeObject(LLVOVolume* obj)
{
mObjectList.remove(obj) ;
mNeedsMuteCheck = true;
}
const std::list< LLVOVolume* >* LLViewerMediaImpl::getObjectList() const

View File

@ -96,6 +96,7 @@ class LLViewerMedia
static void toggleMediaPlay(void*);
static void mediaStop(void*);
static F32 getVolume();
static void muteListChanged();
};
// Implementation functions not exported into header file
@ -290,6 +291,8 @@ public:
bool mDoNavigateOnLoadServerRequest;
bool mMediaSourceFailedInit;
F32 mRequestedVolume;
bool mIsMuted;
bool mNeedsMuteCheck;
private: