00001 /* 00002 $Id: cardsession_manager.cpp,v 1.1 2001/03/06 15:09:26 mbn Exp $ 00003 00004 ------------------------------------------------------------------------ 00005 ClanLib, the platform independent game SDK. 00006 00007 This library is distributed under the GNU LIBRARY GENERAL PUBLIC LICENSE 00008 version 2. See COPYING for details. 00009 00010 For a total list of contributers see CREDITS. 00011 00012 ------------------------------------------------------------------------ 00013 */ 00014 00015 #ifdef WIN32 00016 #pragma warning (disable:4786) 00017 #endif 00018 00019 #include <Sound/Sound/Generic/cardsession_manager.h> 00020 #include <Sound/Sound/Generic/cardsoundbuffer_playback.h> 00021 #include <API/Sound/soundbuffer.h> 00022 00023 CL_CardSessionManager::CL_CardSessionManager() 00024 { 00025 } 00026 00027 CL_CardSessionManager::~CL_CardSessionManager() 00028 { 00029 remove_all_playbacks(); 00030 } 00031 00032 void *CL_CardSessionManager::add_playback( 00033 CL_CardSoundBuffer_Playback *playback_buffer) 00034 { 00035 garbage_collect(); 00036 00037 SPlayBackStruct *s = new SPlayBackStruct(playback_buffer); 00038 playbacks.push_back(s); 00039 return s; 00040 } 00041 00042 void CL_CardSessionManager::add_reference(void *handle) 00043 { 00044 SPlayBackStruct *s = (SPlayBackStruct *) handle; 00045 s->reference_count++; 00046 } 00047 00048 void CL_CardSessionManager::remove_reference(void *handle) 00049 { 00050 SPlayBackStruct *s = (SPlayBackStruct *) handle; 00051 s->reference_count--; 00052 00053 if (s->reference_count == 0 && !s->playback->is_playing()) 00054 { 00055 playbacks.remove(s); 00056 delete s; 00057 } 00058 } 00059 00060 void CL_CardSessionManager::garbage_collect() 00061 { 00062 for ( 00063 std::list<SPlayBackStruct*>::iterator it = playbacks.begin(); 00064 it != playbacks.end();) 00065 { 00066 if ((*it)->reference_count == 0 && 00067 !(*it)->playback->is_playing()) 00068 { 00069 delete *it; 00070 it = playbacks.erase(it); 00071 } 00072 else 00073 { 00074 it++; 00075 } 00076 } 00077 } 00078 00079 void CL_CardSessionManager::remove_soundbuffer_playbacks( 00080 CL_SoundBuffer_Generic *soundbuffer) 00081 { 00082 std::list<SPlayBackStruct*>::iterator it = playbacks.begin(); 00083 while (it != playbacks.end()) 00084 { 00085 if ((*it)->playback->get_owner() == soundbuffer) 00086 { 00087 delete *it; 00088 it = playbacks.erase(it); 00089 } 00090 else 00091 { 00092 it++; 00093 } 00094 } 00095 } 00096 00097 void CL_CardSessionManager::remove_all_playbacks() 00098 { 00099 for ( 00100 std::list<SPlayBackStruct*>::iterator it = playbacks.begin(); 00101 it != playbacks.end(); 00102 it++) 00103 { 00104 delete *it; 00105 } 00106 playbacks.clear(); 00107 } 00108 00109 CL_CardSessionManager::SPlayBackStruct::SPlayBackStruct( 00110 CL_CardSoundBuffer_Playback *_playback) 00111 { 00112 playback = _playback; 00113 reference_count = 1; 00114 } 00115 00116 CL_CardSessionManager::SPlayBackStruct::~SPlayBackStruct() 00117 { 00118 delete playback; 00119 } 00120 00121 bool CL_CardSessionManager::is_soundbuffer_playing(CL_SoundBuffer *playback) 00122 { 00123 std::list<SPlayBackStruct*>::iterator it = playbacks.begin(); 00124 while (it != playbacks.end()) 00125 { 00126 CL_SoundBuffer_Generic *owner = (*it)->playback->get_owner(); 00127 bool playing = (*it)->playback->is_playing(); 00128 if (owner == playback->impl && playing) 00129 { 00130 return true; 00131 } 00132 it++; 00133 } 00134 return false; 00135 }
1.2.6 written by Dimitri van Heesch,
© 1997-2001