From b8a7fd60fd3c96449d59ca99fa90982aaa923933 Mon Sep 17 00:00:00 2001 From: Dave Schuyler Date: Thu, 17 Jan 2002 06:31:28 +0000 Subject: [PATCH] changed audio caching --- panda/src/audio/audioManager.h | 6 +- panda/src/audio/config_audio.cxx | 3 + panda/src/audio/config_audio.h | 1 + panda/src/audio/nullAudioManager.cxx | 35 ++++++++- panda/src/audio/nullAudioManager.h | 5 +- panda/src/audiotraits/milesAudioManager.cxx | 78 ++++++++++++++++++--- panda/src/audiotraits/milesAudioManager.h | 8 ++- 7 files changed, 121 insertions(+), 15 deletions(-) diff --git a/panda/src/audio/audioManager.h b/panda/src/audio/audioManager.h index 7c8e7ea96b..d655f3b219 100644 --- a/panda/src/audio/audioManager.h +++ b/panda/src/audio/audioManager.h @@ -42,12 +42,16 @@ PUBLISHED: // Get a sound: virtual PT(AudioSound) get_sound(const string& file_name) = 0; + // Tell the AudioManager there is no need to keep this one cached. // This doesn't break any connection between AudioSounds that have // already given by get_sound() from this manager. It's // only affecting whether the AudioManager keeps a copy of the sound // in its pool/cache. - virtual void drop_sound(const string& file_name) = 0; + virtual void uncache_sound(const string& file_name) = 0; + virtual void clear_cache() = 0; + virtual void set_cache_limit(int count) = 0; + virtual int get_cache_limit() = 0; // Control volume: // FYI: diff --git a/panda/src/audio/config_audio.cxx b/panda/src/audio/config_audio.cxx index 57b75843da..9459bb4a30 100644 --- a/panda/src/audio/config_audio.cxx +++ b/panda/src/audio/config_audio.cxx @@ -26,6 +26,9 @@ NotifyCategoryDef(audio, ""); bool audio_active =config_audio.GetBool("audio-active", true); +int audio_cache_limit + =config_audio.GetInt("audio-cache-limit", 15); + float audio_volume =config_audio.GetFloat("audio-volume", 1.0f); diff --git a/panda/src/audio/config_audio.h b/panda/src/audio/config_audio.h index 747ab2d7e9..4caf2fc09f 100644 --- a/panda/src/audio/config_audio.h +++ b/panda/src/audio/config_audio.h @@ -29,6 +29,7 @@ NotifyCategoryDecl(audio, EXPCL_PANDA, EXPTP_PANDA); extern EXPCL_PANDA bool audio_active; +extern EXPCL_PANDA int audio_cache_limit; extern EXPCL_PANDA float audio_volume; extern EXPCL_PANDA bool audio_software_midi; diff --git a/panda/src/audio/nullAudioManager.cxx b/panda/src/audio/nullAudioManager.cxx index 2b872435d1..f97f82ec6c 100644 --- a/panda/src/audio/nullAudioManager.cxx +++ b/panda/src/audio/nullAudioManager.cxx @@ -61,15 +61,46 @@ get_sound(const string&) { } //////////////////////////////////////////////////////////////////// -// Function: NullAudioManager::drop_sound +// Function: NullAudioManager::uncache_sound // Access: Public // Description: //////////////////////////////////////////////////////////////////// void NullAudioManager:: -drop_sound(const string&) { +uncache_sound(const string&) { // intentionally blank. } +//////////////////////////////////////////////////////////////////// +// Function: NullAudioManager::uncache_all_sounds +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void NullAudioManager:: +clear_cache() { + // intentionally blank. +} + +//////////////////////////////////////////////////////////////////// +// Function: NullAudioManager::set_cache_limit +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void NullAudioManager:: +set_cache_limit(int) { + // intentionally blank. +} + +//////////////////////////////////////////////////////////////////// +// Function: NullAudioManager::get_cache_limit +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +int NullAudioManager:: +get_cache_limit() { + // intentionally blank. + return 0; +} + //////////////////////////////////////////////////////////////////// // Function: NullAudioManager::set_volume // Access: Public diff --git a/panda/src/audio/nullAudioManager.h b/panda/src/audio/nullAudioManager.h index 1c6e6c72d3..ff57f05c7c 100644 --- a/panda/src/audio/nullAudioManager.h +++ b/panda/src/audio/nullAudioManager.h @@ -35,7 +35,10 @@ public: virtual bool is_valid(); virtual PT(AudioSound) get_sound(const string&); - virtual void drop_sound(const string&); + virtual void uncache_sound(const string&); + virtual void clear_cache(); + virtual void set_cache_limit(int); + virtual int get_cache_limit(); virtual void set_volume(float); virtual float get_volume(); diff --git a/panda/src/audiotraits/milesAudioManager.cxx b/panda/src/audiotraits/milesAudioManager.cxx index 54f69b83b1..ab4382f453 100644 --- a/panda/src/audiotraits/milesAudioManager.cxx +++ b/panda/src/audiotraits/milesAudioManager.cxx @@ -46,6 +46,7 @@ MilesAudioManager() { audio_debug(" audio_volume="<second); - } - _sounds.clear(); + clear_cache(); --_active_managers; audio_debug(" _active_managers="<<_active_managers); if (!_active_managers) { @@ -185,6 +182,9 @@ get_sound(const string& file_name) { // ...the sound was not found in the cache/pool. audio=load(path); if (audio) { + while (_sounds.size() >= _cache_limit) { + uncache_a_sound(); + } // Put it in the pool: // The following is roughly like: _sounds[path] = audio; // But, it gives us an iterator into the map. @@ -215,13 +215,13 @@ get_sound(const string& file_name) { } //////////////////////////////////////////////////////////////////// -// Function: MilesAudioManager::drop_sound +// Function: MilesAudioManager::uncache_sound // Access: Public // Description: //////////////////////////////////////////////////////////////////// void MilesAudioManager:: -drop_sound(const string& file_name) { - audio_debug("MilesAudioManager::drop_sound(file_name=\"" +uncache_sound(const string& file_name) { + audio_debug("MilesAudioManager::uncache_sound(file_name=\"" <first<<"\""); + _sounds.erase(i); + } +} + +//////////////////////////////////////////////////////////////////// +// Function: MilesAudioManager::clear_cache +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void MilesAudioManager:: +clear_cache() { + audio_debug("MilesAudioManager::clear_cache()"); + SoundMap::iterator i=_sounds.begin(); + for (; i!=_sounds.end(); ++i) { + AIL_quick_unload(i->second); + } + _sounds.clear(); +} + +//////////////////////////////////////////////////////////////////// +// Function: MilesAudioManager::set_cache_limit +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void MilesAudioManager:: +set_cache_limit(int count) { + audio_debug("MilesAudioManager::set_cache_limit(count=" + <