00001
00002
00003
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
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
00054
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
00073
00074
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 }