diff --git a/panda/src/audiotraits/milesAudioManager.cxx b/panda/src/audiotraits/milesAudioManager.cxx index ab4382f453..d7871bfa8b 100644 --- a/panda/src/audiotraits/milesAudioManager.cxx +++ b/panda/src/audiotraits/milesAudioManager.cxx @@ -24,6 +24,7 @@ #include "milesAudioManager.h" #include "config_audio.h" #include "config_util.h" +#include int MilesAudioManager::_active_managers; HDLSFILEID MilesAudioManager::_dls_field; @@ -103,6 +104,7 @@ MilesAudioManager() { // either way. ++_active_managers; audio_debug(" _active_managers="<<_active_managers); + assert(is_valid()); } //////////////////////////////////////////////////////////////////// @@ -140,7 +142,22 @@ MilesAudioManager:: //////////////////////////////////////////////////////////////////// bool MilesAudioManager:: is_valid() { - return _is_valid; + bool check=true; + if (_sounds.size() != _lru.size()) { + audio_debug("--sizes--"); + check=false; + } else { + LRU::const_iterator i=_lru.begin(); + for (; i != _lru.end(); ++i) { + SoundMap::const_iterator smi=_sounds.find(**i); + if (smi == _sounds.end()) { + audio_debug("--"<<**i<<"--"); + check=false; + break; + } + } + } + return _is_valid && check; } //////////////////////////////////////////////////////////////////// @@ -167,6 +184,7 @@ load(Filename file_name) { PT(AudioSound) MilesAudioManager:: get_sound(const string& file_name) { audio_debug("MilesAudioManager::get_sound(file_name=\""<0); + LRU::iterator lru_i=find(_lru.begin(), _lru.end(), &(i->first)); + assert(lru_i != _lru.end()); + _lru.erase(lru_i); AIL_quick_unload(i->second); _sounds.erase(i); } + assert(is_valid()); } //////////////////////////////////////////////////////////////////// @@ -241,11 +268,52 @@ uncache_sound(const string& file_name) { void MilesAudioManager:: uncache_a_sound() { audio_debug("MilesAudioManager::uncache_a_sound()"); - SoundMap::iterator i = _sounds.begin(); + assert(is_valid()); + SoundMap::iterator i; + + // Pick a caching scheme: + if (0) { + // uncache arbitrarily: + i = _sounds.begin(); + } else if (0) { + // uncache randomly: + // (I may implement this later, along with run-time selection + // of caching mechanisms). + //i = _sounds[random from 0 to _sounds.size()-1]; + } else { + // uncache least recently used: + assert(_lru.size()>0); + LRU::reference path=_lru.front(); + i = _sounds.find(*path); + assert(i != _sounds.end()); + _lru.pop_front(); + } + if (i != _sounds.end()) { audio_debug(" uncaching \""<first<<"\""); + AIL_quick_unload(i->second); _sounds.erase(i); } + assert(is_valid()); +} + +//////////////////////////////////////////////////////////////////// +// Function: MilesAudioManager::most_recently_used +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void MilesAudioManager:: +most_recently_used(const string& path) { + audio_debug("MilesAudioManager::most_recently_used(path=\"" + <second); } _sounds.clear(); + _lru.clear(); + assert(is_valid()); } //////////////////////////////////////////////////////////////////// @@ -272,11 +343,12 @@ void MilesAudioManager:: set_cache_limit(int count) { audio_debug("MilesAudioManager::set_cache_limit(count=" < count) { uncache_a_sound(); - --_cache_limit; } _cache_limit=count; + assert(is_valid()); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/audiotraits/milesAudioManager.h b/panda/src/audiotraits/milesAudioManager.h index e6b6dbc047..291e0a8f56 100644 --- a/panda/src/audiotraits/milesAudioManager.h +++ b/panda/src/audiotraits/milesAudioManager.h @@ -27,6 +27,7 @@ #include "mss.h" #include "pset.h" #include "pmap.h" +#include "pdeque.h" class MilesAudioSound; @@ -52,9 +53,12 @@ public: bool get_active(); private: - // The sound cache/pool: + // The sound cache: typedef pmap SoundMap; SoundMap _sounds; + // The Least Recently Used mechanism: + typedef pdeque LRU; + LRU _lru; // The offspring of this manager: typedef pset AudioSet; AudioSet _soundsOnLoan; @@ -73,6 +77,7 @@ private: // Tell the manager that the sound dtor was called. void release_sound(MilesAudioSound* audioSound); + void most_recently_used(const string& path); void uncache_a_sound(); // utility function that should be moved to another class: