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_MANAGER_H_ 00026 #define SOUND_MANAGER_H_ 00027 00028 #include <Core/Container/Deque.h> 00029 #include <Core/InputOutput/FilePath.h> 00030 #include <Sound/System/Sound.h> 00031 #include <Sound/System/SoundDefinition.h> 00032 00033 namespace Lamp{ 00034 00035 class SoundReader; 00036 00037 //------------------------------------------------------------------------------ 00038 /** 00039 * サウンドマネージャ 00040 */ 00041 class SoundManager{ 00042 friend class LampSound; 00043 friend class SoundBuffer; 00044 friend class StaticSound; 00045 friend class StaticSound3D; 00046 public: 00047 //-------------------------------------------------------------------------- 00048 /// 3Dサウンドアルゴリズム 00049 enum Algorithm{ 00050 /// 通常の3Dサウンドアルゴリズム 00051 algorithmNormal, 00052 /// 軽量HRTF3Dサウンドアルゴリズム 00053 algorithmLightHRTF, 00054 /// フルHRTF3Dサウンドアルゴリズム 00055 algorithmFullHRTF, 00056 }; 00057 00058 //-------------------------------------------------------------------------- 00059 // サウンド操作 00060 //-------------------------------------------------------------------------- 00061 /** 00062 * サウンドの破棄 00063 * @param sound 破棄するサウンド 00064 */ 00065 virtual void destroy(Sound* sound); 00066 00067 /** 00068 * 全サウンドの破棄 00069 */ 00070 virtual void destroyAll(); 00071 00072 /** 00073 * サウンド数の取得 00074 * @return サウンド数 00075 */ 00076 virtual int getCount() const{ return sounds_.getCount(); } 00077 00078 /** 00079 * サウンドの取得 00080 * @param index サウンドのインデックス 00081 * @return サウンド 00082 */ 00083 virtual Sound* getSound(int index){ return sounds_[index]; } 00084 00085 //-------------------------------------------------------------------------- 00086 /** 00087 * 3Dアルゴリズムの設定 00088 * 00089 * 設定後に生成した3Dサウンドに対してアルゴリズムが適用されます。 00090 * @param algorithm 3Dアルゴリズム 00091 */ 00092 virtual void set3DAlgorithm(Algorithm algorithm){ algorithm_ = algorithm; } 00093 00094 /** 00095 * 3Dアルゴリズムの取得 00096 * @return 3Dアルゴリズム 00097 */ 00098 virtual Algorithm get3DAlgorithm() const{ return algorithm_; } 00099 00100 //-------------------------------------------------------------------------- 00101 // 静的サウンド 00102 //-------------------------------------------------------------------------- 00103 /** 00104 * 静的サウンドの作成 00105 * @param size バッファサイズ 00106 * @param sample サンプル数 00107 * @param channel チャンネル数 00108 * @param bit ビット数 00109 * @param focus フォーカス 00110 * @return 静的サウンド 00111 */ 00112 virtual StaticSound* createStaticSound( 00113 u_int size, int sample, int channel, int bit, 00114 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00115 00116 /** 00117 * 静的サウンドの作成 00118 * @param fileName ファイル名 00119 * @param focus フォーカス 00120 * @return 静的サウンド。失敗したらNULLを返す。 00121 */ 00122 virtual StaticSound* createStaticSound(const String& fileName, 00123 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00124 00125 //-------------------------------------------------------------------------- 00126 // ストリームサウンド 00127 //-------------------------------------------------------------------------- 00128 /** 00129 * ストリームサウンドの作成 00130 * @param size バッファサイズ 00131 * @param sample サンプル数 00132 * @param channel チャンネル数 00133 * @param bit ビット数 00134 * @param focus フォーカス 00135 * @return ストリームサウンド 00136 */ 00137 virtual StreamSound* createStreamSound( 00138 u_int size, int sample, int channel, int bit, 00139 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00140 00141 /** 00142 * ストリームサウンドの作成 00143 * @param fileName ファイル名 00144 * @param focus フォーカス 00145 * @return ストリームサウンド。失敗したらNULLを返す。 00146 */ 00147 virtual StreamSound* createStreamSound(const String& fileName, 00148 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00149 00150 //-------------------------------------------------------------------------- 00151 // 静的3Dサウンド 00152 //-------------------------------------------------------------------------- 00153 /** 00154 * 静的3Dサウンドの作成 00155 * @param size バッファサイズ 00156 * @param sample サンプル数 00157 * @param channel チャンネル数 00158 * @param bit ビット数 00159 * @param focus フォーカス 00160 * @return 静的3Dサウンド 00161 */ 00162 virtual StaticSound3D* createStaticSound3D( 00163 u_int size, int sample, int channel, int bit, 00164 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00165 00166 /** 00167 * 静的3Dサウンドの作成 00168 * @param fileName ファイル名 00169 * @param focus フォーカス 00170 * @return 静的3Dサウンド。失敗したらNULLを返す。 00171 */ 00172 virtual StaticSound3D* createStaticSound3D(const String& fileName, 00173 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00174 00175 //-------------------------------------------------------------------------- 00176 // ストリーム3Dサウンド 00177 //-------------------------------------------------------------------------- 00178 /** 00179 * ストリーム3Dサウンドの作成 00180 * @param size バッファサイズ 00181 * @param sample サンプル数 00182 * @param channel チャンネル数 00183 * @param bit ビット数 00184 * @param focus フォーカス 00185 * @return ストリーム3Dサウンド 00186 */ 00187 virtual StreamSound3D* createStreamSound3D( 00188 u_int size, int sample, int channel, int bit, 00189 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00190 00191 /** 00192 * ストリーム3Dサウンドの作成 00193 * @param fileName ファイル名 00194 * @param focus フォーカス 00195 * @return ストリーム3Dサウンド。失敗したらNULLを返す。 00196 */ 00197 virtual StreamSound3D* createStreamSound3D(const String& fileName, 00198 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00199 00200 private: 00201 //-------------------------------------------------------------------------- 00202 /** 00203 * コンストラクタ 00204 * @param directSound DirectSound 00205 */ 00206 SoundManager(DirectSound* directSound); 00207 00208 /** 00209 * デストラクタ 00210 */ 00211 virtual ~SoundManager(); 00212 00213 //-------------------------------------------------------------------------- 00214 // 静的サウンド 00215 //-------------------------------------------------------------------------- 00216 /** 00217 * 静的サウンドの作成 00218 * @param soundReader サウンドリーダ 00219 * @param name 名前 00220 * @param focus フォーカス 00221 * @return 静的サウンド。失敗したらNULLを返す。 00222 */ 00223 virtual StaticSound* createStaticSound( 00224 SoundReader* soundReader, const String& name, 00225 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00226 00227 /** 00228 * 静的サウンドの複製 00229 * @param staticSound 静的サウンド 00230 * @return 静的サウンド 00231 */ 00232 virtual StaticSound* cloneStaticSound(StaticSound* staticSound); 00233 00234 //-------------------------------------------------------------------------- 00235 // ストリームサウンド 00236 //-------------------------------------------------------------------------- 00237 /** 00238 * ストリームサウンドの作成 00239 * @param soundReader サウンドリーダ、ストリームサウンドによりdeleteされます。 00240 * @param name 名前 00241 * @param focus フォーカス 00242 * @return ストリームサウンド。失敗したらNULLを返す。 00243 */ 00244 virtual StreamSound* createStreamSound( 00245 SoundReader* soundReader, const String& name, 00246 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00247 00248 //-------------------------------------------------------------------------- 00249 // 静的3Dサウンド 00250 //-------------------------------------------------------------------------- 00251 /** 00252 * 静的3Dサウンドの作成 00253 * @param soundReader サウンドリーダ 00254 * @param name 名前 00255 * @param focus フォーカス 00256 * @return 静的3Dサウンド。失敗したらNULLを返す。 00257 */ 00258 virtual StaticSound3D* createStaticSound3D( 00259 SoundReader* soundReader, const String& name, 00260 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00261 00262 /** 00263 * 静的3Dサウンドの複製 00264 * @param staticSound3D 静的3Dサウンド 00265 * @return 静的3Dサウンド 00266 */ 00267 virtual StaticSound3D* cloneStaticSound3D(StaticSound3D* staticSound3D); 00268 00269 //-------------------------------------------------------------------------- 00270 // ストリーム3Dサウンド 00271 //-------------------------------------------------------------------------- 00272 /** 00273 * ストリーム3Dサウンドの作成 00274 * @param soundReader サウンドリーダ、ストリーム3Dサウンドによりdeleteされます。 00275 * @param name 名前 00276 * @param focus フォーカス 00277 * @return ストリーム3Dサウンド。失敗したらNULLを返す。 00278 */ 00279 virtual StreamSound3D* createStreamSound3D( 00280 SoundReader* soundReader, const String& name, 00281 Sound::Focus focus = (Sound::Focus)SoundDefinition::defaultFocus); 00282 00283 //-------------------------------------------------------------------------- 00284 // サウンドバッファ 00285 //-------------------------------------------------------------------------- 00286 /** 00287 * ウェーブフォーマットの構築 00288 * @param waveFormat ウェーブフォーマットへのポインタ 00289 * @param samples サンプル数 00290 * @param channels チャンネル数 00291 * @param bit ビット数 00292 */ 00293 virtual void buildWaveFormat( 00294 WAVEFORMATEX* waveFormat, int sample, int channel, int bit); 00295 00296 /** 00297 * バッファ記述の構築 00298 * @param description バッファ記述 00299 * @param waveFormat ウェーブフォーマットへのポインタ 00300 * @param size バッファサイズ 00301 * @param focus フォーカス 00302 */ 00303 virtual void buildBufferDescription(DSBUFFERDESC* description, 00304 WAVEFORMATEX* waveFormat, int size, Sound::Focus focus); 00305 00306 /** 00307 * サウンドバッファの構築 00308 * @param description バッファ記述 00309 * @return サウンドバッファ 00310 */ 00311 virtual DirectSoundBuffer* buildSoundBuffer(DSBUFFERDESC* description); 00312 00313 /** 00314 * サウンドリーダの作成 00315 * @param filePath ファイルパス 00316 * @return サウンドリーダ 00317 */ 00318 virtual SoundReader* createSoundReader(const FilePath& filePath); 00319 00320 /** 00321 * サウンドバッファの読み込み 00322 * @param soundBuffer サウンドバッファ 00323 * @param soundReader サウンドリーダ 00324 * @return 成功すればtrue 00325 */ 00326 virtual bool readSoundBuffer(SoundBuffer* sound, SoundReader* soundReader); 00327 00328 /** 00329 * サウンドバッファの複製 00330 * @param soundBuffer 複製元サウンドバッファ 00331 * @return 複製されたサウンドバッファ 00332 */ 00333 virtual DirectSoundBuffer* duplicateSoundBuffer( 00334 DirectSoundBuffer* soundBuffer); 00335 00336 //-------------------------------------------------------------------------- 00337 // アップデート 00338 //-------------------------------------------------------------------------- 00339 /** 00340 * アップデート 00341 */ 00342 virtual void update(); 00343 00344 /** 00345 * アップデートサウンドの追加 00346 * @param sound 追加するアップデートサウンド 00347 */ 00348 virtual void addUpdateSound(Sound* sound); 00349 00350 /** 00351 * アップデートサウンドの削除 00352 * @param sound 削除するアップデートサウンド 00353 */ 00354 virtual void removeUpdateSound(Sound* sound); 00355 00356 //-------------------------------------------------------------------------- 00357 // コピーコンストラクタの隠蔽 00358 SoundManager(const SoundManager& copy); 00359 00360 // 代入コピーの隠蔽 00361 void operator =(const SoundManager& copy); 00362 00363 //-------------------------------------------------------------------------- 00364 // DirectSound 00365 DirectSound* directSound_; 00366 // サウンド配列 00367 Deque<Sound*> sounds_; 00368 // アップデートサウンド配列 00369 Deque<Sound*> updateSounds_; 00370 // 3Dアルゴリズム 00371 Algorithm algorithm_; 00372 00373 }; 00374 00375 //------------------------------------------------------------------------------ 00376 } // End of namespace Lamp 00377 #endif // End of SOUND_MANAGER_H_ 00378 //------------------------------------------------------------------------------