1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SoundHandle.h
4 
5   Copyright (C)2009-2011 Nintendo/HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain proprietary
8   information of Nintendo and/or its licensed developers and are protected by
9   national and international copyright laws. They may not be disclosed to third
10   parties or copied or duplicated in any form, in whole or in part, without the
11   prior written consent of Nintendo.
12 
13   The content herein is highly confidential and should be handled accordingly.
14 
15   $Revision: 31311 $
16  *---------------------------------------------------------------------------*/
17 
18 /**
19  * :include nw/snd/snd_SoundHandle.h
20  *
21  * @file snd_SoundHandle.h
22  */
23 
24 #ifndef NW_SND_SOUND_HANDLE_H_
25 #define NW_SND_SOUND_HANDLE_H_
26 
27 #include <nw/ut/ut_PreProcessor.h>
28 #include <nw/snd/snd_BasicSound.h>
29 #include <nw/snd/snd_Global.h>      // BIQUAD_FILTER_TYPE_USER_MAX
30 
31 namespace nw {
32 namespace snd {
33 
34 //---------------------------------------------------------------------------
35 //! @brief    再生したサウンドの操作を行うためのハンドルクラスです。
36 //!
37 //!           サウンドハンドルは、 @ref SoundArchivePlayer::PrepareSound または
38 //!           @ref SoundArchivePlayer::StartSound を呼び出すことにより、
39 //!           サウンドと関連付けられます。
40 //!
41 //!           その際、ハンドルが既に別のサウンドと関連付けられていた場合は、
42 //!           古いサウンドとの関連は外され、新たに再生するサウンドと関連付けられます。
43 //!
44 //!           下記の状態になると、ハンドルとサウンドの関連が外れ、
45 //!           その後はサウンドに対しての操作が行えないようになります。
46 //!
47 //!           ・サウンドが終端に達して停止したとき @n
48 //!           ・フェードフレーム 0 で @ref Stop をコールしたとき @n
49 //!           ・フェードフレームを 1 以上に指定して @ref Stop をコールし、
50 //!           そのフレーム数だけ時間が経過して停止したとき @n
51 //!           ・明示的に SoundHandle::DetachSound を呼び出したとき @n
52 //!           ・プレイヤープライオリティの判定でサウンドが停止したとき
53 //!
54 //!           したがって、@ref IsAttachedSound を毎フレーム監視することで、
55 //!           サウンドが終端に達して停止したかどうか、確認することができます。
56 //!           ただし、@ref Stop での停止や明示的な @ref DetachSound、
57 //!           プレイヤープライオリティ判定でのサウンド停止の影響を考慮しておく必要があります。
58 //!
59 //!           プレイヤープライオリティの判定については、サウンドシステムマニュアルの
60 //!           「プライオリティの動作」の章をご参照ください。
61 //!
62 //!           サウンドにはシーケンスサウンド・ストリームサウンド・ウェーブサウンドの
63 //!           3 種類があります。
64 //!           SoundHandle クラスはこれら全てのサウンドの共通の操作を扱うことができます。
65 //!
66 //!           SoundHandle クラスでは扱えない、各サウンド専用の操作を行うために、
67 //!           @ref SequenceSoundHandle クラス、
68 //!           @ref StreamSoundHandle クラス、
69 //!           @ref WaveSoundHandle クラスが用意されています。
70 //!
71 //! @see SoundArchivePlayer クラス
72 //! @see SequenceSoundHandle クラス
73 //! @see StreamSoundHandle クラス
74 //! @see WaveSoundHandle クラス
75 //!
76 //! @date 2010/04/28 サウンドとの関連が外れる条件を追記、サウンド終端停止判定について追記
77 //! @date 2010/01/25 SequenceSoundHandle、StreamSoundHandle、WaveSoundHandle に関する記述を追加
78 //! @date 2010/01/15 初版
79 //---------------------------------------------------------------------------
80 class SoundHandle
81 {
82 public:
83 
84     //----------------------------------------
85     //! @name コンストラクタ/デストラクタ
86     //@{
87     //! コンストラクタです。
SoundHandle()88     SoundHandle() : m_pSound( NULL ) { }
89     //! デストラクタです。
~SoundHandle()90     ~SoundHandle() { DetachSound(); }
91     //@}
92 
93     //----------------------------------------
94     //! @name 再生/停止/一時停止/再開
95     //@{
96     //---------------------------------------------------------------------------
97     //! @brief    再生準備が完了したサウンドを再生します。
98     //!
99     //!           ハンドルが無効の場合は、何もしません。
100     //!
101     //!           サウンドの再生を開始するためには、
102     //!           @ref SoundArchivePlayer::PrepareSound を呼び出した後、
103     //!           再生準備が完了していなければなりません。
104     //!           この関数は、再生準備が完了したサウンドの再生を開始します。
105     //!           再生準備が完了していないサウンドは、
106     //!           完了するまで待ってから再生を開始します。
107     //!
108     //! @see SoundArchivePlayer::PrepareSound
109     //!
110     //! @date 2010/01/15 初版
111     //---------------------------------------------------------------------------
StartPrepared()112     void StartPrepared()
113     {
114         if ( IsAttachedSound() ) m_pSound->StartPrepared();
115     }
116 
117     //---------------------------------------------------------------------------
118     //! @brief    サウンドを停止します。
119     //!
120     //!           ハンドルに関連付けられたサウンドを停止します。
121     //!           ハンドルが無効の場合は、何もしません。
122     //!
123     //!           fadeFrames で指定したフレーム数をかけて
124     //!           フェードアウトさせることができます。
125     //!           0 を指定した場合は、フェードアウトを行いません。
126     //!           ただし、シーケンスサウンドで発音中の音は、
127     //!           エンベロープのリリースを発音し全ての減衰が完了した後に
128     //!           サウンドが停止します。
129     //!
130     //!           フェードアウトの音量制御は、フェードインと共有されます。
131     //!           フェードアウトにかかるフレーム数は、
132     //!           最大音量から音が消えるまでにかかる変化速度を表しますので、
133     //!           フェードイン中にフェードアウトを指定した時などは、
134     //!           指定したフレーム数よりも短い時間で
135     //!           フェードアウトが完了する可能性があります。
136     //!
137     //! @param[in] fadeFrames   フェードアウトにかけるフレーム数です。
138     //!                         フレーム数は @ref SoundArchivePlayer::Update
139     //!                         の呼び出し回数で換算されます。
140     //!
141     //! @see Pause
142     //!
143     //! @date 2010/12/24 フレーム数について追記
144     //! @date 2010/01/15 初版
145     //---------------------------------------------------------------------------
Stop(int fadeFrames)146     void Stop( int fadeFrames )
147     {
148         if ( IsAttachedSound() ) m_pSound->Stop( fadeFrames );
149     }
150 
151     //---------------------------------------------------------------------------
152     //! @brief    サウンドを一時停止または再開します。
153     //!
154     //!           ハンドルに関連付けられたサウンドを一時停止または再開します。
155     //!           ハンドルが無効の場合は、何もしません。
156     //!
157     //!           fadeFrames で指定したフレーム数をかけてフェードアウトしながら一時停止、
158     //!           またはフェードインしながら再開させることができます。
159     //!           0 を指定した場合は、即座に一時停止または再開します。
160     //!
161     //!           一時停止・再開時のフェードは、再生開始時のフェードイン、
162     //!           停止時のフェードアウトとは独立してはたらきます。
163     //!           フェードにかかるフレーム数は、最大音量から音が消えるまで、
164     //!           あるいは発音していない状態から最大音量に達するまでに
165     //!           かかる変化速度を表しますので、
166     //!           フェード中にさらにフェードを指定した時などは、
167     //!           指定したフレーム数よりも短い時間でフェードが完了する可能性があります。
168     //!
169     //! @param[in]    flag        true なら一時停止、false なら再開します。
170     //! @param[in]    fadeFrames  フェードイン・フェードアウトにかけるフレーム数です。
171     //!                           フレーム数は @ref SoundArchivePlayer::Update
172     //!                           の呼び出し回数で換算されます。
173     //!
174     //! @see IsPause
175     //!
176     //! @date 2010/12/24 フレーム数について追記
177     //! @date 2010/01/15 初版
178     //---------------------------------------------------------------------------
Pause(bool flag,int fadeFrames)179     void Pause( bool flag, int fadeFrames )
180     {
181         if ( IsAttachedSound() ) m_pSound->Pause( flag, fadeFrames );
182     }
183 
184     //---------------------------------------------------------------------------
185     //! @brief    サウンドの再生準備が完了しているかどうかを調べます。
186     //!
187     //!           @ref SoundArchivePlayer::PrepareSound を呼び出した後、
188     //!           そのサウンドの再生準備が完了しているかどうかを調べます。
189     //!           再生準備が完了したサウンドは、
190     //!           @ref SoundHandle::StartPrepared を呼び出した際に、
191     //!           すぐに再生を始めることができます。
192     //!
193     //! @return   サウンドの再生準備が完了していれば true を返します。
194     //!
195     //! @see SoundArchivePlayer::PrepareSound
196     //! @see StartPrepared
197     //!
198     //! @date 2010/01/15 初版
199     //---------------------------------------------------------------------------
IsPrepared()200     bool IsPrepared() const { return IsAttachedSound() && m_pSound->IsPrepared(); }
201 
202     //---------------------------------------------------------------------------
203     //! @brief    サウンドが一時停止中かどうかを調べます。
204     //!
205     //! @return   サウンドが一時停止状態であれば true を返します。
206     //!
207     //! @date 2010/01/15 初版
208     //---------------------------------------------------------------------------
IsPause()209     bool IsPause() const { return IsAttachedSound() && m_pSound->IsPause(); }
210 
211     //---------------------------------------------------------------------------
212     //! @brief    サウンドを再生開始時にフェードインさせます。
213     //!
214     //!           ハンドルが無効の場合は、何もしません。
215     //!
216     //!           この関数でフェードインの指定を行うと、
217     //!           @ref SoundArchivePlayer::StartSound または
218     //!           @ref SoundHandle::StartPrepared を呼び出して再生を開始してから、
219     //!           最初の @ref SoundArchivePlayer::Update が呼び出されたときに
220     //!           フェードインが設定されます。
221     //!
222     //!           サウンドの再生が開始され、最初の @ref SoundArchivePlayer::Update
223     //!           が呼ばれた後にこの関数を呼び出しても効果がありません。
224     //!
225     //!           フェードインの音量制御は、停止時のフェードアウトと共有されます。
226     //!
227     //! @param[in]    frames  フェードインにかけるフレーム数です。
228     //!                       フレーム数は @ref SoundArchivePlayer::Update
229     //!                       の呼び出し回数で換算されます。
230     //!
231     //! @see StartPrepared
232     //! @see SoundArchivePlayer::StartSound
233     //!
234     //! @date 2010/12/24 フレーム数について追記
235     //! @date 2010/01/15 初版
236     //---------------------------------------------------------------------------
FadeIn(int frames)237     void FadeIn( int frames )
238     {
239         if ( IsAttachedSound() ) m_pSound->FadeIn( frames );
240     }
241 
242     //---------------------------------------------------------------------------
243     //! @brief    フェードイン・フェードアウト完了までの残りフレーム数を取得します。
244     //!
245     //!           フェード中でない場合は 0 を返します。
246     //!
247     //! @return   フェード完了までの残りフレーム数を返します。
248     //!           フレーム数は @ref SoundArchivePlayer::Update
249     //!           の呼び出し回数で換算されます。
250     //!
251     //! @see FadeIn
252     //! @see Stop
253     //!
254     //! @date 2010/12/24 フレーム数について追記
255     //! @date 2010/01/15 初版
256     //---------------------------------------------------------------------------
GetRemainingFadeFrames()257     int GetRemainingFadeFrames() const
258     {
259         if ( IsAttachedSound() ) return m_pSound->GetRemainingFadeFrames();
260         else return 0;
261     }
262 
263     //---------------------------------------------------------------------------
264     //! @brief    一時停止時のフェード完了までの残りフレーム数を取得します。
265     //!
266     //!           フェード中でない場合は 0 を返します。
267     //!
268     //! @return   フェード完了までの残りフレーム数を返します。
269     //!           フレーム数は @ref SoundArchivePlayer::Update
270     //!           の呼び出し回数で換算されます。
271     //!
272     //! @see Pause
273     //!
274     //! @date 2010/12/24 フレーム数について追記
275     //! @date 2010/01/15 初版
276     //---------------------------------------------------------------------------
GetRemainingPauseFadeFrames()277     int GetRemainingPauseFadeFrames() const
278     {
279         if ( IsAttachedSound() ) return m_pSound->GetRemainingPauseFadeFrames();
280         else return 0;
281     }
282     //@}
283 
284     //----------------------------------------
285     //! @name パラメータ
286     //@{
287     //---------------------------------------------------------------------------
288     //! @brief    サウンドの音量を変更します。
289     //!
290     //!           ハンドルに関連付けられたサウンドの音量を変更します。
291     //!           ハンドルが無効の場合は、何もしません。
292     //!
293     //!           この関数で指定する値は、他のどの音量パラメータとも独立して動作し、
294     //!           それらは全て重ね合わされます。
295     //!
296     //!           音量 volume は、0.0 以上の倍率で指定します。
297     //!           すなわち、1.0 を指定すると音量に影響を与えません。
298     //!           0.0 を指定すると発音されなくなります。デフォルト値は 1.0 です。
299     //!
300     //!           他の音量パラメータと重ね合わされたあと、
301     //!           最終的な音量は 0.0 ~ 2.0 の範囲でクランプされます。
302     //!           この関数で 2.0 を設定したとしても、
303     //!           元の音量の 2 倍にならない可能性があることに注意してください。
304     //!
305     //!           音量の変化は frames で指定したフレーム数をかけて行われます。
306     //!           音量の変化途中にさらにこの関数を呼び出した場合は、
307     //!           その時点での変化途中の音量値を基点として、
308     //!           新しく指定したフレーム数をかけて音量を変化させます。
309     //!
310     //! @param[in]    volume  変更する音量の倍率( 0.0 ~ )です。
311     //! @param[in]    frames  音量変化にかけるフレーム数です。
312     //!                       フレーム数は @ref SoundArchivePlayer::Update
313     //!                       の呼び出し回数で換算されます。
314     //!
315     //! @date 2010/12/24 フレーム数について追記
316     //! @date 2010/01/15 初版
317     //---------------------------------------------------------------------------
318     void SetVolume( float volume, int frames = 0 )
319     {
320         if ( IsAttachedSound() ) m_pSound->SetVolume( volume, frames );
321     }
322 
323     //---------------------------------------------------------------------------
324     //! @brief    サウンドの音程を変更します。
325     //!
326     //!           ハンドルに関連付けられたサウンドの音程を変更します。
327     //!           ハンドルが無効の場合は、何もしません。
328     //!
329     //!           この関数で指定する値は、他のどの音程パラメータとも独立して動作し、
330     //!           それらは全て重ね合わされます。
331     //!
332     //!           音程 pitch は、周波数の比率で指定します。
333     //!           すなわち、1.0 を指定すると音程に影響を与えません。
334     //!           2.0 を指定すると再生される周波数が 2 倍になり、
335     //!           1 オクターブ高い音程になります。
336     //!           0.5 を指定すると 1 オクターブ低い音程になります。
337     //!
338     //!           デフォルト値は 1.0 です。
339     //!
340     //! @param[in]    pitch  変更する音程の周波数比率です。
341     //!
342     //! @date 2010/01/15 初版
343     //---------------------------------------------------------------------------
SetPitch(float pitch)344     void SetPitch( float pitch )
345     {
346         if ( IsAttachedSound() ) m_pSound->SetPitch( pitch );
347     }
348 
349     //---------------------------------------------------------------------------
350     //! @brief    サウンドのパン(左右の定位)を変更します。
351     //!
352     //!           ハンドルに関連付けられたサウンドのパンを変更します。
353     //!           ハンドルが無効の場合は、何もしません。
354     //!
355     //!           この関数で指定する値は、他のどのパンパラメータとも独立して動作し、
356     //!           それらは全て重ね合わされます。
357     //!
358     //!           pan は、定位の相対変化の値を設定します。
359     //!           0.0 を指定するとデータで設定されたパンの値から変化しません。
360     //!           1.0 を指定すると中央に定位していた音が右端に定位するようになり、
361     //!           -1.0 を指定すると中央に定位していた音が左端に定位するようになります。
362     //!
363     //!           デフォルト値は 0.0 です。
364     //!
365     //! @param[in]    pan  0.0 を基準としたパンの相対変化の値です。
366     //!
367     //! @date 2010/01/15 初版
368     //---------------------------------------------------------------------------
SetPan(float pan)369     void SetPan( float pan )
370     {
371         if ( IsAttachedSound() ) m_pSound->SetPan( pan );
372     }
373 
374     //---------------------------------------------------------------------------
375     //! @brief  サウンドのサラウンドパン(前後の定位)を変更します。
376     //!
377     //!         ハンドルに関連付けられたサウンドのサラウンドパンを変更します。
378     //!         ハンドルが無効の場合は、何もしません。
379     //!
380     //!         この関数で指定する値は、他のどのサラウンドパンパラメータとも独立して動作し、
381     //!         それらは全て重ね合わされます。
382     //!
383     //!         surroundPan は、定位の相対変化の値を設定します。
384     //!         0.0 を指定するとデータで設定されたパンの値から変化しません。
385     //!         1.0 を指定すると最前方に定位していた音が中央に定位するようになり、
386     //!         2.0 を指定すると最前方に定位していた音が最後方に定位するようになります。
387     //!         前方へ定位を移動させたい場合は負の値を指定してください。
388     //!
389     //!         デフォルト値は 0.0 です。
390     //!
391     //! @param[in] surroundPan 0.0 を基準としたサラウンドパンの相対変化の値です。
392     //!
393     //! @date 2010/08/10 初版
394     //---------------------------------------------------------------------------
SetSurroundPan(float surroundPan)395     void SetSurroundPan( float surroundPan )
396     {
397         if ( IsAttachedSound() ) m_pSound->SetSurroundPan( surroundPan );
398     }
399 
400     //---------------------------------------------------------------------------
401     //! @brief    サウンドのローパスフィルタカットオフ値を変更します。
402     //!
403     //!           ハンドルに関連付けられたローパスフィルタカットオフ値を変更します。
404     //!           ハンドルが無効の場合は、何もしません。
405     //!
406     //!           この関数で指定する値は、
407     //!           他のどのローパスフィルタカットオフパラメータとも独立して動作し、
408     //!           それらは全て重ね合わされます。
409     //!
410     //!           lpfFreq は、カットオフの相対変化の値を指定します。
411     //!           0.0 を指定するとカットオフの値を変更しません。
412     //!           -1.0 を指定すると、フィルタがかかっていない状態から、
413     //!           もっともフィルタがかかっている状態 (カットオフ周波数が下がる方向)
414     //!           に変更します。
415     //!
416     //! @param[in] lpfFreq    0.0 を基準としたフィルタカットオフの相対変化の値です。
417     //!
418     //! @date 2010/10/18 初版
419     //---------------------------------------------------------------------------
SetLpfFreq(f32 lpfFreq)420     void SetLpfFreq( f32 lpfFreq )
421     {
422         if ( IsAttachedSound() ) m_pSound->SetLpfFreq( lpfFreq );
423     }
424 
425     //---------------------------------------------------------------------------
426     //! @brief  サウンドの biquad フィルタの設定を変更します。
427     //!
428     //!         ハンドルに関連付けられたサウンドの biquad フィルタの設定を変更します。
429     //!         ハンドルが無効の場合は、何もしません。
430     //!
431     //!         biquad フィルタは複数の箇所での設定が重ね合わされず、
432     //!         以下の優先度に従って設定されます。
433     //!         優先度が高い箇所でパラメータの設定がされた場合、
434     //!         それより下位の設定は上書きされます。
435     //!
436     //!         (1) サウンドハンドルでの設定 @n
437     //!         (2) サウンドプレーヤーでの設定 @n
438     //!         (3) アンビエントパラメータ構造体での設定 @n
439     //!         (4) シーケンスデータでの設定
440     //!
441     //!         フィルタの種類 type は @ref BiquadFilterType の値を使用します。
442     //!         プリセットで用意されているフィルタの種類の他、
443     //!         ユーザーが登録したフィルタを選択することができます。
444     //!
445     //!         type は 0 ~ BIQUAD_FILTER_TYPE_USER_MAX の値を指定します。
446     //!         BIQUAD_FILTER_TYPE_USER_MAX については @ref BiquadFilterType をご参照ください。
447     //!         範囲外の値を設定すると、Debug 版 / Development 版ではアサートで停止します。
448     //!         Release 版では無視されます。
449     //!
450     //!         フィルタのかかり具合を指定する value は、
451     //!         0.0f ~ 1.0f の値で指定します。
452     //!         値の意味はフィルタの係数の種類によって変化します。
453     //!
454     //! @param[in] type     フィルタの種類です (0 ~ BIQUAD_FILTER_TYPE_USER_MAX)。
455     //! @param[in] value    フィルタのかかり具合です (0.0f ~ 1.0f)。
456     //!
457     //! @see BiquadFilterType
458     //!
459     //! @date 2010/10/15 初版
460     //---------------------------------------------------------------------------
SetBiquadFilter(int type,f32 value)461     void SetBiquadFilter( int type, f32 value )
462     {
463         NW_MINMAX_ASSERT( type, 0 , BIQUAD_FILTER_TYPE_USER_MAX );
464         if ( IsAttachedSound() )
465         {
466             m_pSound->SetBiquadFilter( type, value );
467         }
468     }
469     // MEMO: 以下は NW4R 時代にあった記述。
470     //       現状 LPF が未サポートなので、リファレンスには追記しない。
471     // -----
472     // biquad フィルタは従来の LPF に比べ3倍強の DSP 負荷がかかります。
473     // これは、AUX バス1本分のミキサーの負荷とほぼ同等です。
474     //
475     // TODO: プリセットに対して value がどんな影響を持つのか、それぞれ説明が必要そう。
476 
477 
478     //---------------------------------------------------------------------------
479     //! @brief    プレイヤープライオリティを変更します。
480     //!
481     //!           ハンドルに関連付けられたサウンドのプレイヤープライオリティを変更します。
482     //!           ハンドルが無効の場合は、何もしません。
483     //!
484     //!           この関数は、サウンドアーカイブ中のデータで指定されている
485     //!           プレイヤープライオリティの値を変更します。
486     //!
487     //!           priority の値の範囲は 0~127 で、大きいほど優先度が高くなります。
488     //!
489     //! @param[in] priority   プレイヤープライオリティの値です。
490     //!
491     //! @date 2010/01/25 初版
492     //---------------------------------------------------------------------------
SetPlayerPriority(int priority)493     void SetPlayerPriority( int priority )
494     {
495         if ( IsAttachedSound() ) m_pSound->SetPlayerPriority( priority );
496     }
497     //@}
498 
499     //----------------------------------------
500     //! @name 出力パラメータ
501     //@{
502 
503     //---------------------------------------------------------------------------
504     //! @brief    サウンドのメインセンド量を変更します。
505     //!
506     //!           ハンドルに関連付けられたサウンドのメインセンド量を変更します。
507     //!           ハンドルが無効の場合は、何もしません。
508     //!
509     //!           この関数で指定する値は、他のどのメインセンド量とも独立して動作し、
510     //!           それらは全て重ね合わされます。
511     //!
512     //!           メインセンドは、
513     //!           出力に送るサウンドの音量をエフェクトセンドの後で調節するパラメータです。
514     //!           主に、エフェクトのドライ・ウェット成分のバランスを調整するために使用されます。
515     //!
516     //!           センド量 send は、相対変化の値を指定します。
517     //!           すなわち、0.0 を指定するとセンド量を変更しません。
518     //!           -1.0 を指定するとメインバスに最大のセンド量で送られていたサウンドが、
519     //!           メインバスに送られないようになります。 デフォルト値は 0.0 です。
520     //!
521     //! @param[in] send   0.0 を基準としたセンド量の相対変化の値です。
522     //!
523     //! @see SetFxSend
524     //!
525     //! @date 2010/06/16 初版
526     //---------------------------------------------------------------------------
SetMainSend(float send)527     void SetMainSend( float send )
528     {
529         if ( IsAttachedSound() ) m_pSound->SetMainSend( send );
530     }
531 
532     //---------------------------------------------------------------------------
533     //! @brief    サウンドのエフェクトセンド量を変更します。
534     //!
535     //!           ハンドルに関連付けられたサウンドのエフェクトセンド量を変更します。
536     //!           ハンドルが無効の場合は、何もしません。
537     //!
538     //!           この関数で指定する値は、他のどのエフェクトセンド量とも独立して動作し、
539     //!           それらは全て重ね合わされます。
540     //!
541     //!           センド量 send は、相対変化の値を指定します。
542     //!           すなわち、0.0 を指定するとセンド量を変更しません。
543     //!           1.0 を指定すると AUX バスに送られていなかったサウンドが、
544     //!           最大のセンド量で送られるようになります。 デフォルト値は 0.0 です。
545     //!
546     //! @param[in] bus    センド量を設定する AUX のバスです。
547     //! @param[in] send   0.0 を基準としたセンド量の相対変化の値です。
548     //!
549     //! @see AuxBus
550     //! @see SetMainSend
551     //!
552     //! @date 2010/06/16 初版
553     //---------------------------------------------------------------------------
SetFxSend(AuxBus bus,float send)554     void SetFxSend( AuxBus bus, float send )
555     {
556         if ( IsAttachedSound() ) m_pSound->SetFxSend( bus, send );
557     }
558     //@}
559 
560     //----------------------------------------
561     //! @name ハンドル操作
562     //@{
563     //---------------------------------------------------------------------------
564     //! @brief    ハンドルにサウンドが関連付けられているかどうかを調べます。
565     //!
566     //! @return   ハンドルに関連付けられているサウンドがあれば true を返します。
567     //!
568     //! @date 2010/01/15 初版
569     //---------------------------------------------------------------------------
IsAttachedSound()570     bool IsAttachedSound() const { return m_pSound != NULL; }
571 
572     // サウンドハンドルからサウンドを解放
573     //---------------------------------------------------------------------------
574     //! @brief    ハンドルからサウンドを解放します。
575     //!
576     //!           ハンドルから開放されたサウンドは、
577     //!           その後ハンドルを通して操作できないようになります。
578     //!
579     //! @date 2010/01/15 初版
580     //---------------------------------------------------------------------------
581     void DetachSound();
582     //@}
583 
584     //----------------------------------------
585     //! @name ハンドル操作
586     //@{
587     //---------------------------------------------------------------------------
588     //! @brief    サウンドの ID を設定します。
589     //!
590     //!           ハンドルに関連付けられたサウンドの ID を設定します。
591     //!           ハンドルが無効の場合は、何もしません。
592     //!
593     //!           @ref SoundArchivePlayer でサウンドを再生すると、
594     //!           再生開始時にサウンド ID が自動的に設定されます。
595     //!           この関数を呼び出すと、 ID を上書きして変更します。
596     //!
597     //!           設定した ID を取得するためには @ref GetId を呼び出します。
598     //!
599     //! @param[in]    id      サウンドを識別する ID です。
600     //!
601     //! @see      @ref SoundArchivePlayer, @ref GetId
602     //!
603     //! @date 2010/01/15 初版
604     //---------------------------------------------------------------------------
SetId(u32 id)605     void SetId( u32 id )
606     {
607         if ( IsAttachedSound() ) m_pSound->SetId( id );
608     }
609 
610     //---------------------------------------------------------------------------
611     //! @brief    サウンドに設定されている ID を取得します。
612     //!
613     //!           ハンドルに関連付けられたサウンドに設定されている ID を取得します。
614     //!           ハンドルが無効の場合は 0xffffffff を返します。
615     //!
616     //!           この関数で取得できる ID は @ref SetId で設定された ID です。
617     //!
618     //! @return   SetId
619     //!
620     //! @date 2010/01/15 初版
621     //---------------------------------------------------------------------------
GetId()622     u32 GetId() const
623     {
624         if ( IsAttachedSound() ) return m_pSound->GetId();
625         return internal::BasicSound::INVALID_ID;
626     }
627 
628     // アンビエントパラメータ取得
629     //! @details :private
GetAmbientParam()630     const SoundParam* GetAmbientParam() const
631     {
632         if ( ! IsAttachedSound() ) return NULL;
633         return &m_pSound->GetAmbientParam();
634     }
635     //@}
636 
637     // -----------------------------------------------------------------
638     // 非公開関数
639 
640     // ハンドルをサウンドに関連付ける
641     //! @details :private
642     void detail_AttachSound( internal::BasicSound* sound );
643     //! @details :private
644     void detail_AttachSoundAsTempHandle( internal::BasicSound* sound );
645 
646     //! @details :private
detail_GetAttachedSound()647     internal::BasicSound* detail_GetAttachedSound() { return m_pSound; }
648     //! @details :private
detail_GetAttachedSound()649     const internal::BasicSound* detail_GetAttachedSound() const { return m_pSound; }
650 
651     // 一時ハンドルを生成する
652     //! @details :private
653     void detail_DuplicateHandle( SoundHandle* handle );
654 
655 private:
656     NW_DISALLOW_COPY_AND_ASSIGN( SoundHandle );
657 
658     internal::BasicSound* m_pSound;
659 };
660 
661 } // namespace nw::snd
662 } // namespace nw
663 
664 
665 #endif /* NW_SND_SOUND_HANDLE_H_ */
666 
667