Main Page | Namespace List | Class Hierarchy | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

CSSample.cpp

Go to the documentation of this file.
00001 /**
00002     CSSample
00003       CSSample can only be created thru a loader (CSSampleLoader).
00004 
00005 */
00006 
00007 #ifdef WIN32
00008 #pragma warning(disable : 4786 )
00009 #endif
00010 #include "CSSample.h"
00011 #include "CSXMLHelper.h"
00012 
00013 using namespace std;
00014 
00015 CSSampleLoader CSSampleLoader::INSTANCE;
00016 CSSampleMap *CSSample::mAllPlayingSamples = 0;
00017 bool CSSample::mLock = false;
00018 int CSSample::mIsInit = 0;
00019 const char *CSSample::CLASS = "CSSample";
00020 
00021 // constructor using "*.pic" file
00022 CSSample::CSSample(const std::string &filename)
00023 {
00024     static char *functionName="CSSample";
00025     LOG_ENTER 
00026     CSSampleData data;
00027     mSample = 0;
00028     mChannel = -1;
00029     loadSampleData(filename, data);
00030     initialize(data);
00031     init();
00032     LOG_EXIT
00033 }
00034 
00035 CSSample::~CSSample()
00036 {
00037     static char *functionName="~CSSample";
00038     LOG_ENTER 
00039     stop();
00040     if (mSample)
00041     {
00042         Mix_FreeChunk(mSample);
00043     }
00044     mSample = 0;
00045     deinit();
00046     LOG_EXIT
00047 }
00048 
00049 void CSSample::initialize(const CSSampleData &data)
00050 {
00051     static char *functionName="initialize";
00052     LOG_ENTER 
00053     // if Samples are to large - they get garbled during
00054     // conversion if in FULLSCREEN (Windows)
00055     mSample = Mix_LoadWAV(data.filename);
00056     LOG_EXIT
00057 }
00058 
00059 CSSample::CSSample(const CSSample &sample)
00060 {
00061     static char *functionName="~CSSample";
00062     LOG_ENTER 
00063     mSample = sample.mSample;
00064     LOG_EXIT
00065 }
00066 
00067 void CSSample::play()
00068 {
00069     static char *functionName="play";
00070     LOG_ENTER 
00071     stop();
00072     // CSA TODO: Uncomment to play samples!
00073     // mChannel = Mix_PlayChannel(-1,mSample, 0);
00074     // addCallback(mChannel, this);
00075     LOG_EXIT
00076 }
00077 
00078 void CSSample::stop()
00079 {
00080     static char *functionName="stop";
00081     LOG_ENTER 
00082     int frequency;
00083     Uint16 format;
00084     int channels;
00085     removeCallback(mChannel);
00086     int state = Mix_QuerySpec(&frequency, &format, &channels);
00087     if (state)
00088     {
00089         if (mChannel != -1)
00090         {
00091             Mix_HaltChannel(mChannel);
00092             mChannel = -1;
00093         }
00094     }
00095     LOG_EXIT
00096 }
00097 
00098 void CSSample::loadSampleData(const std::string &filename, CSSampleData &data)
00099 {
00100     static char *functionName="loadSampleData";
00101     LOG_ENTER 
00102     data.filename = strdup(filename.c_str());
00103     LOG_EXIT
00104 }
00105 
00106 void CSSample::pause()  
00107 {
00108     static char *functionName="pause";
00109     LOG_ENTER 
00110     Mix_Pause(mChannel);
00111     LOG_EXIT
00112 }
00113 
00114 void CSSample::resume() 
00115 {
00116     static char *functionName="resume";
00117     LOG_ENTER 
00118     Mix_Resume(mChannel);
00119     LOG_EXIT
00120 }
00121 
00122 void CSSample::pauseAll()
00123 {
00124     static char *functionName="pauseAll";
00125     LOG_ENTER 
00126     while (mLock)
00127     {
00128         SDL_Delay(50);
00129     }
00130 
00131     mLock = true;
00132     for (CSSampleMap::iterator iter = mAllPlayingSamples->begin(); iter != mAllPlayingSamples->end(); iter++)
00133     {
00134         iter->second->pause();
00135     }
00136     mLock = false;
00137     LOG_EXIT
00138 }
00139 
00140 void CSSample::resumeAll()
00141 {
00142     static char *functionName="resumeAll";
00143     LOG_ENTER 
00144     while (mLock)
00145     {
00146         SDL_Delay(50);
00147     }
00148 
00149     mLock = true;
00150     for (CSSampleMap::iterator iter = mAllPlayingSamples->begin(); iter != mAllPlayingSamples->end(); iter++)
00151     {
00152         iter->second->resume();
00153     }
00154     mLock = false;
00155     LOG_EXIT
00156 }
00157 
00158 void CSSample::channel_finished(int channel)
00159 {
00160     static char *functionName="channel_finished";
00161     LOG_ENTER 
00162     removeCallback(channel);
00163     LOG_EXIT
00164 }
00165     
00166 void CSSample::addCallback(int channel, CSSample *sample)
00167 {
00168     static char *functionName="addCallback";
00169     LOG_ENTER 
00170     if (channel < 0)
00171     {
00172         LOG_EXIT
00173         return;
00174     }
00175     while (mLock)
00176     {
00177         SDL_Delay(50);
00178     }
00179 
00180     mLock = true;
00181     mAllPlayingSamples->insert(CSSampleMap::value_type(channel, sample));
00182     mLock = false;
00183     LOG_EXIT
00184 }
00185 
00186 void CSSample::removeCallback(int channel)
00187 {
00188     static char *functionName="removeCallback";
00189     LOG_ENTER 
00190     if (channel < 0)
00191     {
00192         LOG_EXIT
00193         return;
00194     }
00195 
00196     while (mLock)
00197     {
00198         SDL_Delay(50);
00199     }
00200 
00201     mLock = true;
00202     CSSampleMap::iterator iter;
00203     for (iter = mAllPlayingSamples->begin(); iter!=mAllPlayingSamples->end(); iter++)
00204     {
00205         if (iter->first == channel)
00206         {
00207             mAllPlayingSamples->erase(iter);
00208             break;
00209         }
00210     }
00211     mLock = false;
00212     LOG_EXIT
00213 }
00214 
00215 void CSSample::init()
00216 {
00217     static char *functionName="init";
00218     LOG_ENTER 
00219     if (mIsInit == 0)
00220     {
00221         mAllPlayingSamples = new CSSampleMap();
00222         Mix_ChannelFinished(CSSample::channel_finished);
00223     }
00224     mIsInit++;
00225     LOG_EXIT
00226 }
00227 
00228 void CSSample::deinit()
00229 {
00230     static char *functionName="deinit";
00231     LOG_ENTER 
00232     mIsInit--;
00233     if (mIsInit == 0)
00234     {
00235         mAllPlayingSamples->clear();
00236         delete (mAllPlayingSamples);
00237         mAllPlayingSamples = 0;
00238         Mix_ChannelFinished(0);
00239     }
00240     LOG_EXIT
00241 }
00242 
00243 bool CSSample::isPlaying()
00244 {
00245     static char *functionName="isPlaying";
00246     LOG_ENTER 
00247     bool b= mAllPlayingSamples->size() > 0;
00248     LOG_EXIT
00249     return b;
00250 }

Generated on Wed Jul 14 00:43:31 2004 for CSLib by doxygen 1.3.6