Main Page   Namespace List   Class Hierarchy   Compound List   File List   Compound Members   File Members  

cardsession_manager.cpp

Go to the documentation of this file.
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 }

Generated at Wed Apr 4 19:53:59 2001 for ClanLib by doxygen1.2.6 written by Dimitri van Heesch, © 1997-2001