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_BUFFER_H_ 00026 #define SOUND_BUFFER_H_ 00027 00028 #include <Sound/System/Sound.h> 00029 #include <Core/Utility/Timer.h> 00030 00031 namespace Lamp{ 00032 00033 //------------------------------------------------------------------------------ 00034 /** 00035 * サウンドバッファ 00036 */ 00037 class SoundBuffer : public Sound{ 00038 friend class StreamPlayer; 00039 public: 00040 //-------------------------------------------------------------------------- 00041 // 基本データ取得 00042 //-------------------------------------------------------------------------- 00043 /** 00044 * 名前の設定 00045 * @param name 名前 00046 */ 00047 virtual void setName(const String& name){ name_ = name; } 00048 00049 /** 00050 * 名前の取得 00051 * @return 名前 00052 */ 00053 virtual const String& getName() const{ return name_; } 00054 00055 //-------------------------------------------------------------------------- 00056 /** 00057 * サイズの取得 00058 * @return サイズ 00059 */ 00060 virtual u_int getSize() const{ return size_; } 00061 00062 /** 00063 * サンプル数の取得 00064 * @return サンプル数 00065 */ 00066 virtual int getSample() const{ return sample_; } 00067 00068 /** 00069 * チャンネル数の取得 00070 * @return チャンネル数 00071 */ 00072 virtual int getChannel() const{ return channel_; } 00073 00074 /** 00075 * ビット数の取得 00076 * @return ビット数 00077 */ 00078 virtual int getBit() const{ return bit_; } 00079 00080 /** 00081 * フォーカスの取得 00082 * @return フォーカス 00083 */ 00084 virtual Focus getFocus() const{ return focus_; } 00085 00086 /** 00087 * バッファサイズの取得 00088 * @return バッファサイズ 00089 */ 00090 virtual u_int getBufferSize() const{ return size_; } 00091 00092 //-------------------------------------------------------------------------- 00093 // 再生 00094 //-------------------------------------------------------------------------- 00095 /** 00096 * 再生 00097 * @return 正常に再生されればtrue 00098 */ 00099 virtual bool play(); 00100 00101 /** 00102 * 停止 00103 */ 00104 virtual void stop(); 00105 00106 /** 00107 * 再生の一時停止 00108 */ 00109 virtual void suspend(); 00110 00111 /** 00112 * 再生再開 00113 * @return 正常に再生が再開されればtrue 00114 */ 00115 virtual bool resume(); 00116 00117 /** 00118 * 状態の取得 00119 */ 00120 virtual State getState() const; 00121 00122 //-------------------------------------------------------------------------- 00123 // 再生位置 00124 //-------------------------------------------------------------------------- 00125 /** 00126 * 再生位置設定 00127 * @param cursor 再生位置のバイト数 00128 */ 00129 virtual void setCursor(u_int cursor); 00130 00131 /** 00132 * 再生位置取得 00133 * @return 再生位置のバイト数 00134 */ 00135 virtual u_int getCursor() const; 00136 00137 //-------------------------------------------------------------------------- 00138 // 優先度 00139 //-------------------------------------------------------------------------- 00140 /** 00141 * 優先度の設定 00142 * 00143 * 優先度は次回再生時に適用される 00144 * @param priority 優先度を32767〜-32768の間で指定 00145 */ 00146 virtual void setPriority(int priority){ 00147 Assert(priority <= priorityMax); 00148 Assert(priority >= priorityMin); 00149 priority_ = priority; 00150 } 00151 00152 /** 00153 * 優先度の取得 00154 * @return 32767〜-32768の間の値を持つ優先度 00155 */ 00156 virtual int getPriority() const{ return priority_; } 00157 00158 //-------------------------------------------------------------------------- 00159 // ループ 00160 //-------------------------------------------------------------------------- 00161 /** 00162 * ループの設定 00163 * 00164 * ループは次回再生時に適用される 00165 * @param loop ループするならtrue 00166 */ 00167 virtual void setLoop(bool loop){ loop_ = loop; } 00168 00169 /** 00170 * ループしているか 00171 * @return ループしているならtrue 00172 */ 00173 virtual bool isLoop() const{ return loop_; } 00174 00175 //-------------------------------------------------------------------------- 00176 // ボリューム 00177 //-------------------------------------------------------------------------- 00178 /** 00179 * ボリュームの設定 00180 * @param volume ボリュームを1.fから0.fで設定する 00181 */ 00182 virtual void setVolume(float volume); 00183 00184 /** 00185 * ボリュームの取得 00186 * @return ボリュームを1.fから0.fで返す 00187 */ 00188 virtual float getVolume() const{ return volume_; } 00189 00190 //-------------------------------------------------------------------------- 00191 // 周波数 00192 //-------------------------------------------------------------------------- 00193 /** 00194 * 周波数の設定 00195 * @param frequency 周波数 00196 */ 00197 virtual void setFrequency(int frequency); 00198 00199 /** 00200 * 周波数の取得 00201 * @return 周波数 00202 */ 00203 virtual int getFrequency() const{ return frequency_; } 00204 00205 /** 00206 * オリジナル周波数の設定 00207 */ 00208 virtual void setOriginalFrequency(); 00209 00210 //-------------------------------------------------------------------------- 00211 // フェード 00212 //-------------------------------------------------------------------------- 00213 /** 00214 * フェードイン 00215 * @param millisecond フェードインにかかる時間。0を指定するとフェード中止。 00216 */ 00217 virtual void fadeIn(float millisecond){ 00218 fade(millisecond, 0.f, 1.f); 00219 } 00220 00221 /** 00222 * フェードアウト 00223 * @param millisecond フェードアウトにかかる時間。0を指定するとフェード中止。 00224 */ 00225 virtual void fadeOut(float millisecond){ 00226 fade(millisecond, getVolume(), 0.f); 00227 } 00228 00229 /** 00230 * フェード 00231 * @param millisecond フェードアウトにかかる時間。0を指定するとフェード中止。 00232 * @param startVolume 開始ボリューム 00233 * @param endVolume 終了ボリューム 00234 */ 00235 virtual void fade(float millisecond, float startVolume, float endVolume); 00236 00237 /** 00238 * フェード中かどうか 00239 * @return フェード中ならtrue 00240 */ 00241 virtual bool isFading() const{ return isFading_; } 00242 00243 //-------------------------------------------------------------------------- 00244 // コメント 00245 //-------------------------------------------------------------------------- 00246 /** 00247 * コメントの設定 00248 * @param comment コメント 00249 */ 00250 virtual void setComment(const String& comment){ comment_ = comment; } 00251 00252 /** 00253 * コメントの取得 00254 * @return コメント 00255 */ 00256 virtual const String& getComment() const{ return comment_; } 00257 00258 //-------------------------------------------------------------------------- 00259 // その他 00260 //-------------------------------------------------------------------------- 00261 /** 00262 * 所有権があるか 00263 * @return 所有権。falseならすでに誰かに所有されている 00264 */ 00265 virtual bool hasOwnership() const{ return ownership_; } 00266 00267 //-------------------------------------------------------------------------- 00268 // ロック 00269 //-------------------------------------------------------------------------- 00270 /// ロック 00271 class Lock{ 00272 friend class SoundBuffer; 00273 public: 00274 /** 00275 * アドレス0の取得 00276 * @return アドレス0 00277 */ 00278 void* getAddress0() const{ return address0_; } 00279 00280 /** 00281 * サイズ0の取得 00282 * @return サイズ0 00283 */ 00284 u_int getSize0() const{ return (u_int)size0_; } 00285 00286 /** 00287 * アドレス1の取得 00288 * @return アドレス1 00289 */ 00290 void* getAddress1() const{ return address1_; } 00291 00292 /** 00293 * サイズ1の取得 00294 * @return サイズ1 00295 */ 00296 u_int getSize1() const{ return (u_int)size1_; } 00297 00298 /** 00299 * データが有効か 00300 * @return データが有効ならtrueを返す 00301 */ 00302 bool isValid() const{ return (size0_ != 0); } 00303 00304 private: 00305 /// コンストラクタ 00306 Lock(){ clear(); } 00307 00308 /// クリア 00309 void clear(){ 00310 address0_ = address1_ = NULL; 00311 size0_ = size1_ = 0; 00312 } 00313 00314 // アドレス0 00315 void* address0_; 00316 // サイズ0 00317 u_long size0_; 00318 // アドレス1 00319 void* address1_; 00320 // サイズ1 00321 u_long size1_; 00322 }; 00323 00324 //-------------------------------------------------------------------------- 00325 /** 00326 * ロック 00327 * 00328 * バッファ全体をロックします。失敗した場合、Lock::isValid()がfalseを返します。 00329 * @return ロックデータ 00330 */ 00331 virtual Lock& lock(); 00332 00333 /** 00334 * ロック 00335 * 00336 * 失敗した場合、Lock::isValid()がfalseを返します。 00337 * @param offset オフセットをバイト数で指定する 00338 * @param bytes ロックするバイト数 00339 * @return ロックデータ 00340 */ 00341 virtual Lock& lock(u_int offset, u_int bytes); 00342 00343 /** 00344 * アンロック 00345 */ 00346 virtual void unlock(); 00347 00348 //-------------------------------------------------------------------------- 00349 // RTTI 00350 //-------------------------------------------------------------------------- 00351 /** 00352 * サウンドバッファかどうか 00353 * @return サウンドバッファならtrue 00354 */ 00355 virtual bool isSoundBuffer() const{ return true; } 00356 00357 protected: 00358 //-------------------------------------------------------------------------- 00359 // 生成、破棄 00360 //-------------------------------------------------------------------------- 00361 /** 00362 * コンストラクタ 00363 * @param soundBuffer サウンドバッファ 00364 */ 00365 SoundBuffer(DirectSoundBuffer* soundBuffer); 00366 00367 /** 00368 * デストラクタ 00369 */ 00370 virtual ~SoundBuffer(); 00371 00372 /** 00373 * 初期化 00374 * @param size サイズ 00375 * @param sample サンプル数 00376 * @param channel チャンネル数 00377 * @param bit ビット数 00378 * @param focus フォーカス 00379 */ 00380 virtual void initialize( 00381 u_int size, int sample, int channel, int bit, Focus focus); 00382 00383 /** 00384 * サウンドバッファデータのコピー 00385 * @param destination コピー先サウンドバッファ 00386 */ 00387 virtual void copySoundBufferData(SoundBuffer* destination); 00388 00389 //-------------------------------------------------------------------------- 00390 /** 00391 * アップデート 00392 * @return アップデートが必要な処理が終了したらtrueを返す 00393 */ 00394 virtual bool update(); 00395 00396 //-------------------------------------------------------------------------- 00397 // 基本データ取得 00398 //-------------------------------------------------------------------------- 00399 /** 00400 * サウンドバッファの取得 00401 * @return サウンドバッファ 00402 */ 00403 DirectSoundBuffer* getSoundBuffer(){ return soundBuffer_; } 00404 00405 //-------------------------------------------------------------------------- 00406 /** 00407 * 所有権の設定 00408 * @param ownership 所有権。falseなら誰かに所有されている 00409 */ 00410 virtual void setOwnership(bool ownership){ ownership_ = ownership; } 00411 00412 //-------------------------------------------------------------------------- 00413 // 再生 00414 //-------------------------------------------------------------------------- 00415 /** 00416 * バッファの再生 00417 * @return 成功すればtrue 00418 */ 00419 virtual bool playBuffer(); 00420 00421 /** 00422 * バッファの停止 00423 */ 00424 virtual void stopBuffer(); 00425 00426 /** 00427 * 再生フラグの取得 00428 * @return 再生フラグ 00429 */ 00430 virtual u_int getPlayFlag() = 0; 00431 00432 //-------------------------------------------------------------------------- 00433 // 周波数 00434 //-------------------------------------------------------------------------- 00435 /** 00436 * バッファ周波数の取得 00437 * @return バッファ周波数 00438 */ 00439 virtual int getBufferFrequency() const; 00440 00441 private: 00442 // サウンドバッファ 00443 DirectSoundBuffer* soundBuffer_; 00444 // ロック 00445 Lock lock_; 00446 // 名前 00447 String name_; 00448 // コメント 00449 String comment_; 00450 // サイズ 00451 u_int size_; 00452 // サンプル数 00453 int sample_; 00454 // チャンネル数 00455 int channel_; 00456 // ビット数 00457 int bit_; 00458 // フォーカス 00459 Focus focus_; 00460 // ボリューム 00461 float volume_; 00462 // 周波数 00463 int frequency_; 00464 // フェード開始時間 00465 Timer::Tick fadeStartTime_; 00466 // フェード期間 00467 float fadePeriod_; 00468 // フェード開始ボリューム 00469 float fadeStartVolume_; 00470 // フェード終了ボリューム 00471 float fadeEndVolume_; 00472 // 優先度 00473 int priority_; 00474 // 所有フラグ 00475 bool ownership_; 00476 // フェード中か 00477 bool isFading_; 00478 // ループ 00479 volatile bool loop_; 00480 // 一時停止 00481 volatile bool isSuspended_; 00482 00483 }; 00484 00485 //------------------------------------------------------------------------------ 00486 } // End of namespace Lamp 00487 #endif // End of SOUND_BUFFER_H_ 00488 //------------------------------------------------------------------------------