Main Page | Namespace List | Class Hierarchy | Alphabetical List | Compound List | File List | Namespace Members | Compound Members | File Members

SoundBuffer.h

Go to the documentation of this file.
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 //------------------------------------------------------------------------------

Generated on Wed Mar 16 10:29:35 2005 for Lamp by doxygen 1.3.2