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

Sound.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_H_
00026 #define SOUND_H_
00027 
00028 namespace Lamp{
00029 
00030 class SoundBuffer;
00031 class StereoSound;
00032 class Sound3D;
00033 class StaticSound;
00034 class StreamSound;
00035 class StaticSound3D;
00036 class StreamSound3D;
00037 
00038 //------------------------------------------------------------------------------
00039 /**
00040  * サウンド
00041  *
00042  * 状態の移り変わり。<br>
00043  * play()<br>
00044  *  statePlay  そのまま再生<br>
00045  *  stateStop  先頭に戻って再生<br>
00046  *  stateSuspend 一時停止した場所から再生<br>
00047  *  stateLost  そのまま再生を試みる<br>
00048  * stop()<br>
00049  *  statePlay  停止<br>
00050  *  stateStop  そのまま停止<br>
00051  *  stateSuspend 停止<br>
00052  *  stateLost  停止<br>
00053  * suspend()<br>
00054  *  statePlay  一時停止<br>
00055  *  stateStop  そのまま停止<br>
00056  *  stateSuspend そのまま一時停止<br>
00057  *  stateLost  一時停止を試みる<br>
00058  * resume()<br>
00059  *  statePlay  そのまま再生を試みる<br>
00060  *  stateStop  そのまま停止<br>
00061  *  stateSuspend 再生再開<br>
00062  *  stateLost  再生再開を試みる<br>
00063  */
00064 class Sound{
00065 friend class SoundManager;
00066 friend class SoundCache;
00067 public:
00068     //--------------------------------------------------------------------------
00069     // 優先度
00070     //--------------------------------------------------------------------------
00071     /// デフォルト優先度
00072     static const int priorityDefault = 0;
00073 
00074     /// 最高優先度
00075     static const int priorityMax = Limit::shortMax;
00076 
00077     /// 最低優先度
00078     static const int priorityMin = Limit::shortMin;
00079 
00080     //--------------------------------------------------------------------------
00081     // ステート
00082     //--------------------------------------------------------------------------
00083     /// ステート
00084     enum State{
00085         /// 再生中
00086         statePlay,
00087         /// 一時停止中
00088         stateSuspend,
00089         /// 停止中
00090         stateStop,
00091         /// ロスト中
00092         stateLost,
00093     };
00094 
00095     //--------------------------------------------------------------------------
00096     // フォーカス
00097     //--------------------------------------------------------------------------
00098     /// フォーカス
00099     enum Focus{
00100         /// 通常フォーカス
00101         focusNormal = 0,
00102         /// スティっキーフォーカス
00103         focusSticky,
00104         /// グローバルフォーカス
00105         focusGlobal,
00106     };
00107 
00108     //--------------------------------------------------------------------------
00109     // リセット
00110     //--------------------------------------------------------------------------
00111     /// リセットフラグ
00112     enum Reset{
00113         // Sound
00114         resetName               = (1),
00115         resetCursor             = (resetName << 1),
00116         resetPriority           = (resetCursor << 1),
00117         resetLoop               = (resetPriority << 1),
00118         resetLoopCursor         = (resetLoop << 1),
00119         resetVolume             = (resetLoopCursor << 1),
00120         resetFrequency          = (resetVolume << 1),
00121         resetFade               = (resetFrequency << 1),
00122         // StereoSound
00123         resetPan                = (resetFade << 1),
00124         // Sound3D
00125         resetPosition           = (resetPan << 1),
00126         resetVelocity           = (resetPosition << 1),
00127         resetDistance           = (resetVelocity << 1),
00128         resetConeDirection      = (resetDistance << 1),
00129         resetConeAngle          = (resetConeDirection << 1),
00130         resetConeOutsideVolume  = (resetConeAngle << 1),
00131         reset3DEnabled          = (resetConeOutsideVolume << 1),
00132         // Custom
00133         resetNone               = (0),
00134         resetAll                = (0xffffffff),
00135         resetRuntime            =
00136             (resetCursor | resetVolume | resetFrequency | resetFade |
00137             resetPan | resetPosition | resetVelocity | resetConeDirection |
00138             resetConeAngle | resetConeOutsideVolume | reset3DEnabled),
00139     };
00140 
00141     //--------------------------------------------------------------------------
00142     // 基本データ取得
00143     //--------------------------------------------------------------------------
00144     /**
00145      * 名前の設定
00146      * @param name 名前
00147      */
00148     virtual void setName(const String& name) = 0;
00149 
00150     /**
00151      * 名前の取得
00152      * @return 名前
00153      */
00154     virtual const String& getName() const = 0;
00155 
00156     //--------------------------------------------------------------------------
00157     /**
00158      * サイズの取得
00159      * @return サイズ
00160      */
00161     virtual u_int getSize() const = 0;
00162 
00163     /**
00164      * 時間の長さの取得
00165      * @return 秒単位の時間の長さ
00166      */
00167     virtual float getTimeLength() const{ return byteToTime(getSize()); }
00168 
00169     /**
00170      * サンプル数の取得
00171      * @return サンプル数
00172      */
00173     virtual int getSample() const = 0;
00174 
00175     /**
00176      * チャンネル数の取得
00177      * @return チャンネル数
00178      */
00179     virtual int getChannel() const = 0;
00180 
00181     /**
00182      * ビット数の取得
00183      * @return ビット数
00184      */
00185     virtual int getBit() const = 0;
00186 
00187     /**
00188      * フォーカスの取得
00189      * @return フォーカス
00190      */
00191     virtual Focus getFocus() const = 0;
00192 
00193     /**
00194      * 1サンプルのバイト数取得
00195      * @return 1サンプルのバイト数
00196      */
00197     virtual u_int getOneSampleBytes() const{
00198         return (getChannel() * getBit() / 8);
00199     }
00200 
00201     /**
00202      * 1秒のバイト数取得
00203      * @return 1秒のバイト数
00204      */
00205     virtual u_int getOneSecondBytes() const{
00206         return (getSample() * getOneSampleBytes());
00207     }
00208 
00209     /**
00210      * バイト数から時間への変換
00211      * @param byte バイト数
00212      * @return 秒単位の時間
00213      */
00214     virtual float byteToTime(u_int byte) const{
00215         Assert(byte <= getSize());
00216         return (float)byte / (float)getOneSecondBytes();
00217     }
00218 
00219     /**
00220      * 時間からバイト数への変換
00221      * @return time 秒単位の時間
00222      * @return バイト数
00223      */
00224     virtual u_int timeToByte(float time) const{
00225         Assert((time >= 0.f) && (time < getTimeLength()));
00226         return (u_int)(time * getOneSecondBytes());
00227     }
00228 
00229     //--------------------------------------------------------------------------
00230     // 再生
00231     //--------------------------------------------------------------------------
00232     /**
00233      * 再生
00234      * @return 正常に再生されればtrue
00235      */
00236     virtual bool play() = 0;
00237 
00238     /**
00239      * 停止
00240      */
00241     virtual void stop() = 0;
00242 
00243     /**
00244      * 再生の一時停止
00245      */
00246     virtual void suspend() = 0;
00247 
00248     /**
00249      * 再生再開
00250      * @return 正常に再生が再開されればtrue
00251      */
00252     virtual bool resume() = 0;
00253 
00254     /**
00255      * リセット
00256      * @param flags リセットフラグ
00257      */
00258     virtual void reset(Reset flags);
00259 
00260     /**
00261      * 状態の取得
00262      */
00263     virtual State getState() const = 0;
00264 
00265     //--------------------------------------------------------------------------
00266     // 再生位置
00267     //--------------------------------------------------------------------------
00268     /**
00269      * 再生位置設定
00270      * @param cursor 再生位置のバイト数
00271      */
00272     virtual void setCursor(u_int cursor) = 0;
00273 
00274     /**
00275      * 再生位置取得
00276      * @return 再生位置のバイト数
00277      */
00278     virtual u_int getCursor() const = 0;
00279 
00280     //--------------------------------------------------------------------------
00281     /**
00282      * 再生時間設定
00283      * @param timeCursor 再生時間の秒数
00284      */
00285     virtual void setCurrentTime(float timeCursor){
00286         setCursor(timeToByte(timeCursor));
00287     }
00288 
00289     /**
00290      * 現在の再生時間取得
00291      * @return 現在の再生時間の秒数
00292      */
00293     virtual float getCurrentTime() const{ return byteToTime(getCursor()); }
00294 
00295     //--------------------------------------------------------------------------
00296     // 優先度
00297     //--------------------------------------------------------------------------
00298     /**
00299      * 優先度の設定
00300      *
00301      * 優先度は次回再生時に適用される
00302      * @param priority 優先度を32767〜-32768の間で指定
00303      */
00304     virtual void setPriority(int priority) = 0;
00305 
00306     /**
00307      * 優先度の取得
00308      * @return 32767〜-32768の間の値を持つ優先度
00309      */
00310     virtual int getPriority() const = 0;
00311 
00312     //--------------------------------------------------------------------------
00313     // ループ
00314     //--------------------------------------------------------------------------
00315     /**
00316      * ループの設定
00317      *
00318      * ループは次回再生時に適用される
00319      * @param loop ループするならtrue
00320      */
00321     virtual void setLoop(bool loop) = 0;
00322 
00323     /**
00324      * ループしているか
00325      * @return ループしているならtrue
00326      */
00327     virtual bool isLoop() const = 0;
00328 
00329     //--------------------------------------------------------------------------
00330     /**
00331      * ループ位置の設定
00332      * @param loopCursor ループ位置をバイト数で指定
00333      */
00334     virtual void setLoopCursor(u_int loopCursor){
00335         if(loopCursor == 0){ return; }
00336         Assert(false);
00337     }
00338 
00339     /**
00340      * ループ位置の取得
00341      * @return ループ位置のバイト数
00342      */
00343     virtual u_int getLoopCursor() const{ return 0; }
00344 
00345     //--------------------------------------------------------------------------
00346     /**
00347      * ループ時間の設定
00348      * @param loopTimeCursor ループ時間を秒数で指定
00349      */
00350     virtual void setLoopTime(float loopTimeCursor){
00351         setLoopCursor(timeToByte(loopTimeCursor));
00352     }
00353 
00354     /**
00355      * ループ時間の取得
00356      * @return ループ時間の秒数
00357      */
00358     virtual float getLoopTime() const{ return byteToTime(getLoopCursor()); }
00359 
00360     //--------------------------------------------------------------------------
00361     // ボリューム
00362     //--------------------------------------------------------------------------
00363     /**
00364      * ボリュームの設定
00365      * @param volume ボリュームを1.fから0.fで設定する
00366      */
00367     virtual void setVolume(float volume) = 0;
00368 
00369     /**
00370      * ボリュームの取得
00371      * @return ボリュームを1.fから0.fで返す
00372      */
00373     virtual float getVolume() const = 0;
00374 
00375     //--------------------------------------------------------------------------
00376     // 周波数
00377     //--------------------------------------------------------------------------
00378     /**
00379      * 周波数の設定
00380      * @param frequency 周波数
00381      */
00382     virtual void setFrequency(int frequency) = 0;
00383 
00384     /**
00385      * 周波数の取得
00386      * @return 周波数
00387      */
00388     virtual int getFrequency() const = 0;
00389 
00390     /**
00391      * オリジナル周波数の設定
00392      */
00393     virtual void setOriginalFrequency() = 0;
00394 
00395     //--------------------------------------------------------------------------
00396     // フェード
00397     //--------------------------------------------------------------------------
00398     /**
00399      * フェードイン
00400      * @param millisecond フェードインにかかる時間。0を指定するとフェード中止。
00401      */
00402     virtual void fadeIn(float millisecond) = 0;
00403 
00404     /**
00405      * フェードアウト
00406      * @param millisecond フェードアウトにかかる時間。0を指定するとフェード中止。
00407      */
00408     virtual void fadeOut(float millisecond) = 0;
00409 
00410     /**
00411      * フェード
00412      * @param millisecond フェードアウトにかかる時間。0を指定するとフェード中止。
00413      * @param startVolume 開始ボリューム
00414      * @param endVolume 終了ボリューム
00415      */
00416     virtual void fade(
00417         float millisecond, float startVolume, float endVolume) = 0;
00418 
00419     /**
00420      * フェードの中止
00421      */
00422     virtual void stopFade(){ fade(0.f, 0.f, 0.f); }
00423 
00424     /**
00425      * フェード中かどうか
00426      * @return フェード中ならtrue
00427      */
00428     virtual bool isFading() const = 0;
00429 
00430     //--------------------------------------------------------------------------
00431     // コメント
00432     //--------------------------------------------------------------------------
00433     /**
00434      * コメントの設定
00435      * @param comment コメント
00436      */
00437     virtual void setComment(const String& comment) = 0;
00438 
00439     /**
00440      * コメントの取得
00441      * @return コメント
00442      */
00443     virtual const String& getComment() const = 0;
00444 
00445     /**
00446      * コメントオプションの適用
00447      */
00448     virtual void applyCommentOption();
00449 
00450     //--------------------------------------------------------------------------
00451     // その他
00452     //--------------------------------------------------------------------------
00453     /**
00454      * 複製
00455      * ストリームは複製できない。
00456      * @return 複製されたサウンド。失敗したらNULLを返す
00457      */
00458     virtual Sound* clone(){ return NULL; }
00459 
00460     /**
00461      * 所有権の取得
00462      * @return 所有権。falseなら誰かに所有されている
00463      */
00464     virtual bool hasOwnership() const = 0;
00465 
00466     /**
00467      * 文字列への変換
00468      * @return 文字列
00469      */
00470     virtual String toString() const;
00471 
00472     //--------------------------------------------------------------------------
00473     // RTTI
00474     //--------------------------------------------------------------------------
00475     /**
00476      * ストリームを使用しているか
00477      * @return ストリームを使用しているtrue
00478      */
00479     virtual bool useStream() const{ return false; }
00480 
00481     //--------------------------------------------------------------------------
00482     /**
00483      * サウンドバッファかどうか
00484      * @return サウンドバッファならtrue
00485      */
00486     virtual bool isSoundBuffer() const{ return false; }
00487 
00488     /**
00489      * サウンドバッファへのキャスト
00490      * @return サウンドバッファ。型が違えばNULLを返す。
00491      */
00492     virtual SoundBuffer* castSoundBuffer() const{
00493         if(isSoundBuffer()){ return (SoundBuffer*)this; }
00494         return NULL;
00495     }
00496 
00497     //--------------------------------------------------------------------------
00498     /**
00499      * ステレオサウンドかどうか
00500      * @return ステレオサウンドならtrue
00501      */
00502     virtual bool isStereoSound() const{ return false; }
00503 
00504     /**
00505      * ステレオサウンドへのキャスト
00506      * @return ステレオサウンド。型が違えばNULLを返す。
00507      */
00508     virtual StereoSound* castStereoSound() const{
00509         if(isStereoSound()){ return (StereoSound*)this; }
00510         return NULL;
00511     }
00512 
00513     //--------------------------------------------------------------------------
00514     /**
00515      * 3Dサウンドかどうか
00516      * @return 3Dサウンドならtrue
00517      */
00518     virtual bool isSound3D() const{ return false; }
00519 
00520     /**
00521      * 3Dサウンドへのキャスト
00522      * @return 3Dサウンド。型が違えばNULLを返す。
00523      */
00524     virtual Sound3D* castSound3D() const{
00525         if(isSound3D()){ return (Sound3D*)this; }
00526         return NULL;
00527     }
00528 
00529     //--------------------------------------------------------------------------
00530     /**
00531      * 静的サウンドかどうか
00532      * @return 静的サウンドならtrue
00533      */
00534     virtual bool isStaticSound() const{ return false; }
00535 
00536     /**
00537      * 静的サウンドへのキャスト
00538      * @return 静的サウンド。型が違えばNULLを返す。
00539      */
00540     virtual StaticSound* castStaticSound() const{
00541         if(isStaticSound()){ return (StaticSound*)this; }
00542         return NULL;
00543     }
00544 
00545     //--------------------------------------------------------------------------
00546     /**
00547      * ストリームサウンドかどうか
00548      * @return ストリームサウンドならtrue
00549      */
00550     virtual bool isStreamSound() const{ return false; }
00551 
00552     /**
00553      * ストリームサウンドへのキャスト
00554      * @return ストリームサウンド。型が違えばNULLを返す。
00555      */
00556     virtual StreamSound* castStreamSound() const{
00557         if(isStreamSound()){ return (StreamSound*)this; }
00558         return NULL;
00559     }
00560 
00561     //--------------------------------------------------------------------------
00562     /**
00563      * 静的3Dサウンドかどうか
00564      * @return 静的3Dサウンドならtrue
00565      */
00566     virtual bool isStaticSound3D() const{ return false; }
00567 
00568     /**
00569      * 静的3Dサウンドへのキャスト
00570      * @return 静的3Dサウンド。型が違えばNULLを返す。
00571      */
00572     virtual StaticSound3D* castStaticSound3D() const{
00573         if(isStaticSound3D()){ return (StaticSound3D*)this; }
00574         return NULL;
00575     }
00576 
00577     //--------------------------------------------------------------------------
00578     /**
00579      * ストリーム3Dサウンドかどうか
00580      * @return ストリーム3Dサウンドならtrue
00581      */
00582     virtual bool isStreamSound3D() const{ return false; }
00583 
00584     /**
00585      * ストリーム3Dサウンドへのキャスト
00586      * @return ストリーム3Dサウンド。型が違えばNULLを返す。
00587      */
00588     virtual StreamSound3D* castStreamSound3D() const{
00589         if(isStreamSound3D()){ return (StreamSound3D*)this; }
00590         return NULL;
00591     }
00592 
00593     //--------------------------------------------------------------------------
00594     /**
00595      * ボリュームデシベル変換
00596      * @param volume ボリューム
00597      * @return デシベル
00598      */
00599     static int volumeToDecibel(float volume);
00600 
00601     /**
00602      * デシベルボリューム変換
00603      * @param decibel デシベル
00604      * @return ボリューム
00605      */
00606     static float decibelToVolume(int decibel);
00607 
00608 protected:
00609     //--------------------------------------------------------------------------
00610     // 生成、破棄
00611     //--------------------------------------------------------------------------
00612     /**
00613      * コンストラクタ
00614      */
00615     Sound();
00616 
00617     /**
00618      * デストラクタ
00619      */
00620     virtual ~Sound();
00621 
00622     //--------------------------------------------------------------------------
00623     /**
00624      * 所有権の設定
00625      * @param ownership 所有権。falseなら誰かに所有されている
00626      */
00627     virtual void setOwnership(bool ownership) = 0;
00628 
00629     /**
00630      * アップデート
00631      * @return アップデートが必要な処理が終了したらtrueを返す
00632      */
00633     virtual bool update() = 0;
00634 
00635 private:
00636     //--------------------------------------------------------------------------
00637     // コピーコンストラクタの隠蔽
00638     Sound(const Sound& copy);
00639 
00640     // 代入コピーの隠蔽
00641     void operator =(const Sound& copy);
00642 
00643 };
00644 
00645 //------------------------------------------------------------------------------
00646 } // End of namespace Lamp
00647 #endif // End of SOUND_H_
00648 //------------------------------------------------------------------------------

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