00001 //------------------------------------------------------------------------------ 00002 // Lamp : Open source game middleware 00003 // Copyright (C) 2004 Junpei Ohtani ( Email : junpee@users.sourceforge.jp ) 00004 // 00005 // This library is free software; you can redistribute it and/or 00006 // modify it under the terms of the GNU Lesser General Public 00007 // License as published by the Free Software Foundation; either 00008 // version 2.1 of the License, or (at your option) any later version. 00009 // 00010 // This library is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 // Lesser General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU Lesser General Public 00016 // License along with this library; if not, write to the Free Software 00017 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 00018 //------------------------------------------------------------------------------ 00019 00020 /** @file 00021 * サウンドキャッシュヘッダ 00022 * @author Junpee 00023 */ 00024 00025 #ifndef SOUND_CACHE_H_ 00026 #define SOUND_CACHE_H_ 00027 00028 #include <Core/Container/ArrayList.h> 00029 #include <Core/Container/HashMap.h> 00030 #include <Sound/System/Sound.h> 00031 00032 namespace Lamp{ 00033 00034 class TextReader; 00035 00036 //------------------------------------------------------------------------------ 00037 /** 00038 * サウンドキャッシュ 00039 * 00040 * 静的サウンドをキャッシングするためのクラス。ストリームは恩恵が無いので 00041 * 現在非対応。ストリームに対するclone()が上手くいくようになれば対応を考える。 00042 * SoundCache.cppのrev1.5あたりにストリームキャッシュの実装有り。 00043 */ 00044 class SoundCache{ 00045 public: 00046 //-------------------------------------------------------------------------- 00047 // 生成、破棄 00048 //-------------------------------------------------------------------------- 00049 /** 00050 * コンストラクタ 00051 * @param basePath ベースパス 00052 * @param extension 「.」付き拡張子(例 : ".wav" ".ogg") 00053 * @param focus フォーカス 00054 * @param defaultMaxMixingCount デフォルト最大ミキシング数 00055 */ 00056 SoundCache(const String& basePath = "", const String& extension = "", 00057 Sound::Focus focus = Sound::focusNormal, 00058 int defaultMaxMixingCount = 16); 00059 00060 /** 00061 * デストラクタ 00062 */ 00063 virtual ~SoundCache(); 00064 00065 //-------------------------------------------------------------------------- 00066 // サウンドのロード 00067 //-------------------------------------------------------------------------- 00068 /** 00069 * 静的サウンドのロード 00070 * @param name サウンド名 00071 * @param loop ループするならtrue 00072 * @param priority 優先度を32767〜-32768の間で指定 00073 * @param maxMixingCount 最大ミキシング数、0ならデフォルトを使用する 00074 * @return 成功すればtrueを返す 00075 */ 00076 virtual bool loadStaticSound(const String& name, bool loop = false, 00077 int priority = Sound::priorityDefault, int maxMixingCount = 0); 00078 00079 /** 00080 * 静的3Dサウンドのロード 00081 * @param name サウンド名 00082 * @param minimumDistance 最小距離 00083 * @param maximumDistance 最大距離 00084 * @param loop ループするならtrue 00085 * @param priority 優先度を32767〜-32768の間で指定 00086 * @param maxMixingCount 最大ミキシング数、0ならデフォルトを使用する 00087 * @return 成功すればtrueを返す 00088 */ 00089 virtual bool loadStaticSound3D(const String& name, bool loop = false, 00090 int priority = Sound::priorityDefault, 00091 float minimumDistance = DS3D_DEFAULTMINDISTANCE, 00092 float maximumDistance = DS3D_DEFAULTMAXDISTANCE, 00093 int maxMixingCount = 0); 00094 00095 /** 00096 * サウンドのアンロード 00097 * @param name サウンド名 00098 * @return 成功すればtrueを返す 00099 */ 00100 virtual bool unloadSound(const String& name); 00101 00102 /** 00103 * 全サウンドのアンロード 00104 */ 00105 virtual void unloadAll(); 00106 00107 //-------------------------------------------------------------------------- 00108 // サウンドリスト 00109 //-------------------------------------------------------------------------- 00110 /** 00111 * サウンドリストのロード 00112 * @param filePath ベースパスからの相対ファイルパス 00113 * @return 成功すればtrue 00114 */ 00115 virtual bool loadSoundList(const String& filePath); 00116 00117 /** 00118 * サウンドリストのロード 00119 * @param textReader テキストリーダ 00120 * @return 成功すればtrue 00121 */ 00122 virtual bool loadSoundList(TextReader* textReader); 00123 00124 //-------------------------------------------------------------------------- 00125 // サウンドの再生 00126 //-------------------------------------------------------------------------- 00127 /** 00128 * サウンドの再生 00129 * 00130 * ループサウンドの場合は返り値のポインタを保存して自前でstop()を呼んでください。 00131 * ループサウンドで無い場合は返り値のポインタへのアクセスは、呼び出した時点で 00132 * のみ行い、その後は使用しないで下さい。もし、ループしていないサウンドに対して 00133 * 再生終了までのアクセスが必要なのであれば、getSound(),releaseSound()を 00134 * 使用してください。 00135 * @param name 名前 00136 * @param volume ボリュームを1.fから0.fの間で指定する 00137 * @param frequency 周波数を100から100000の間で指定する、0ならオリジナル周波数 00138 * @return 再生したサウンド、失敗ならNULL。 00139 */ 00140 virtual Sound* playSound(const String& name, float volume = 1.f, 00141 int frequency = 0); 00142 00143 /** 00144 * ステレオサウンドの再生 00145 * 00146 * ループサウンドの場合は返り値のポインタを保存して自前でstop()を呼んでください。 00147 * ループサウンドで無い場合は返り値のポインタへのアクセスは、呼び出した時点で 00148 * のみ行い、その後は使用しないで下さい。もし、ループしていないサウンドに対して 00149 * 再生終了までのアクセスが必要なのであれば、getSound(),releaseSound()を 00150 * 使用してください。 00151 * @param name 名前 00152 * @param volume ボリュームを1.fから0.fの間で指定する 00153 * @param frequency 周波数を100から100000の間で指定する、0ならオリジナル周波数 00154 * @param pan パンを-1.f(左)から1.f(右)の間で指定する 00155 * @return 再生したサウンド、失敗ならNULL。 00156 */ 00157 virtual StereoSound* playStereoSound(const String& name, float volume = 1.f, 00158 int frequency = 0, float pan = 0.f); 00159 00160 /** 00161 * 3Dサウンドの再生 00162 * 00163 * ループサウンドの場合は返り値のポインタを保存して自前でstop()を呼んでください。 00164 * ループサウンドで無い場合は返り値のポインタへのアクセスは、呼び出した時点で 00165 * のみ行い、その後は使用しないで下さい。もし、ループしていないサウンドに対して 00166 * 再生終了までのアクセスが必要なのであれば、getSound(),releaseSound()を 00167 * 使用してください。 00168 * @param name 名前 00169 * @param volume ボリュームを1.fから0.fの間で指定する 00170 * @param frequency 周波数を100から100000の間で指定する、0ならオリジナル周波数 00171 * @param position 再生位置を指定する 00172 * @return 再生したサウンド、失敗ならNULL。 00173 */ 00174 virtual Sound3D* playSound3D(const String& name, float volume = 1.f, 00175 int frequency = 0, const Vector3& position = Vector3::zero); 00176 00177 //-------------------------------------------------------------------------- 00178 // サウンドの取得、解放 00179 //-------------------------------------------------------------------------- 00180 /** 00181 * サウンドの取得 00182 * 00183 * サウンドの所有権を得る。所有権を得ている間、サウンドは再利用されない。 00184 * 使用後はreleaseSound()で返却する必要がある。 00185 * @param name 名前 00186 * @param resetFlag リセットフラグ 00187 * @return 取得したサウンド、失敗ならNULL。 00188 */ 00189 virtual Sound* getSound(const String& name, 00190 Sound::Reset resetFlag = Sound::resetRuntime); 00191 00192 /** 00193 * ステレオサウンドの取得 00194 * 00195 * サウンドの所有権を得る。所有権を得ている間、サウンドは再利用されない。 00196 * 使用後はreleaseSound()で返却する必要がある。 00197 * @param name 名前 00198 * @param resetFlag リセットフラグ 00199 * @return 取得したサウンド、失敗ならNULL。 00200 */ 00201 virtual StereoSound* getStereoSound(const String& name, 00202 Sound::Reset resetFlag = Sound::resetRuntime); 00203 00204 /** 00205 * 3Dサウンドの取得 00206 * 00207 * サウンドの所有権を得る。所有権を得ている間、サウンドは再利用されない。 00208 * 使用後はreleaseSound()で返却する必要がある。 00209 * @param name 名前 00210 * @param resetFlag リセットフラグ 00211 * @return 取得したサウンド、失敗ならNULL。 00212 */ 00213 virtual Sound3D* getSound3D(const String& name, 00214 Sound::Reset resetFlag = Sound::resetRuntime); 00215 00216 /** 00217 * サウンドの解放 00218 * 00219 * getSound()で所有権を得たサウンドを解放する。 00220 * @param sound 解放するサウンド 00221 */ 00222 virtual void releaseSound(Sound* sound); 00223 00224 //-------------------------------------------------------------------------- 00225 // その他 00226 //-------------------------------------------------------------------------- 00227 /** 00228 * 全サウンドの再生を一時停止する 00229 */ 00230 virtual void suspendAll(); 00231 00232 /** 00233 * 全サウンドの再生を再開する 00234 */ 00235 virtual void resumeAll(); 00236 00237 //-------------------------------------------------------------------------- 00238 /** 00239 * 文字列への変換 00240 * @return 文字列 00241 */ 00242 virtual String toString() const; 00243 00244 protected: 00245 //-------------------------------------------------------------------------- 00246 /** 00247 * キャッシュ作成 00248 * @param name 名前 00249 * @param sound キャッシュを作成するサウンド 00250 * @param maxMixingCount 最大ミキシング数 00251 */ 00252 virtual void createCache( 00253 const String& name, Sound* sound, int maxMixingCount); 00254 00255 //-------------------------------------------------------------------------- 00256 // サウンド配列 00257 //-------------------------------------------------------------------------- 00258 /** 00259 * サウンド配列 00260 */ 00261 class SoundArray{ 00262 public: 00263 /** 00264 * コンストラクタ 00265 * @param sound 初期化サウンド 00266 * @param maxMixingCount 最大ミキシング数 00267 */ 00268 SoundArray(Sound* sound, int maxMixingCount); 00269 00270 /** 00271 * デストラクタ 00272 */ 00273 virtual ~SoundArray(); 00274 00275 /** 00276 * フリーサウンド取得 00277 * @return フリーサウンド、無ければNULLを返す 00278 */ 00279 Sound* getFreeSound(); 00280 00281 /** 00282 * サウンド数の取得 00283 * @return サウンド数 00284 */ 00285 virtual int getSoundCount() const{ return sounds_.getCount(); } 00286 00287 /** 00288 * サウンドの取得 00289 * @param index サウンドインデックス 00290 * @return サウンド 00291 */ 00292 virtual Sound* getSound(int index){ return sounds_[index]; } 00293 00294 /** 00295 * 文字列への変換 00296 * @return 文字列 00297 */ 00298 virtual String toString() const; 00299 00300 protected: 00301 /// サウンド配列 00302 ArrayList<Sound*> sounds_; 00303 /// 最大ミキシング数 00304 int maxMixingCount_; 00305 00306 }; 00307 00308 //-------------------------------------------------------------------------- 00309 // メンバ変数 00310 //-------------------------------------------------------------------------- 00311 /// キャッシュ 00312 HashMap<String, SoundArray*> cache_; 00313 /// リスト 00314 ArrayList<SoundArray*> list_; 00315 /// ベースパス 00316 String basePath_; 00317 /// 拡張子 00318 String extension_; 00319 /// フォーカス 00320 Sound::Focus focus_; 00321 /// デフォルト最大ミキシング数 00322 int defaultMaxMixingCount_; 00323 00324 private: 00325 // コピーコンストラクタの隠蔽 00326 SoundCache(const SoundCache& copy); 00327 00328 // 代入コピーの隠蔽 00329 void operator =(const SoundCache& copy); 00330 00331 }; 00332 00333 //------------------------------------------------------------------------------ 00334 } // End of namespace Lamp 00335 #endif // End of SOUND_CACHE_H_ 00336 //------------------------------------------------------------------------------