1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_StreamSoundHandle.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_StreamSoundHandle.h
20  *
21  * @file snd_StreamSoundHandle.h
22  */
23 
24 #ifndef NW_SND_STREAM_SOUND_HANDLE_H_
25 #define NW_SND_STREAM_SOUND_HANDLE_H_
26 
27 #include <nw/ut/ut_PreProcessor.h>
28 #include <nw/snd/snd_StreamSound.h>
29 
30 namespace nw {
31 namespace snd {
32 
33 //---------------------------------------------------------------------------
34 //! @brief    再生したストリームサウンドの操作を行うためのハンドルクラスです。
35 //!
36 //!           サウンドは再生時に汎用サウンドハンドル
37 //!           @ref SoundHandle と関連付けられますが、
38 //!           ストリームサウンドに固有の処理は汎用サウンドハンドルには実装されていません。
39 //!
40 //!           ストリームサウンドに固有の処理を行いたい場合は、
41 //!           汎用サウンドハンドルを引数にとるコンストラクタを用いて、
42 //!           ストリームサウンドハンドルを生成し、使用してください。
43 //!
44 //!           ハンドルの使い方は、汎用サウンドハンドル @ref SoundHandle と同じです。
45 //!
46 //! @see      SoundHandle クラス
47 //!
48 //! @date 2010/01/22 初版
49 //---------------------------------------------------------------------------
50 class StreamSoundHandle
51 {
52 public:
53     //! @name コンストラクタ/デストラクタ
54     //@{
55 
56     //---------------------------------------------------------------------------
57     //! @brief    コンストラクタです。
58     //!
59     //!           引数の無いコンストラクタは、
60     //!           どのサウンドとも関連付けられていないハンドルを構築します。
61     //!
62     //! @date 2010/01/22 初版
63     //---------------------------------------------------------------------------
StreamSoundHandle()64     StreamSoundHandle() : m_pSound( NULL ) { }
65 
66     //---------------------------------------------------------------------------
67     //! @brief    コンストラクタです。
68     //!
69     //!           引数付きコンストラクタは、
70     //!           引数 handle で指定したサウンドハンドルが参照しているサウンドを用いて、
71     //!           ストリームサウンドハンドルを構築します。
72     //!           ストリームサウンド以外のサウンドがサウンドハンドルに関連付けられているときは、
73     //!           引数の無いコンストラクタと同様に構築します。
74     //!
75     //!           引数付きコンストラクタで構築した時、
76     //!           サウンドが既に別のストリームサウンドハンドルと関連付けられている場合は、
77     //!           その関連付けが切られる点に注意してください。
78     //!           ただし、引数に渡したサウンドハンドルとの関連付けは切れません。
79     //!
80     //! @param[in] pHandle ストリームサウンドと関連付けられたサウンドハンドル。
81     //!
82     //! @see      SoundHandle クラス
83     //!
84     //! @date 2010/01/22 初版
85     //---------------------------------------------------------------------------
86     StreamSoundHandle( SoundHandle* pHandle );
87 
88     //---------------------------------------------------------------------------
89     //! @brief    デストラクタです。
90     //!
91     //! @date 2010/01/22 初版
92     //---------------------------------------------------------------------------
~StreamSoundHandle()93     ~StreamSoundHandle() { DetachSound(); }
94 
95     //@}
96 
97 
98     //! @name 再生/停止/一時停止/再開
99     //@{
100 
101     //---------------------------------------------------------------------------
102     //! @brief    再生準備が完了したサウンドを再生します。
103     //!
104     //!           ハンドルが無効の場合は、何もしません。
105     //!
106     //!           サウンドの再生を開始するためには、
107     //!           @ref SoundArchivePlayer::PrepareSound を呼び出した後、
108     //!           再生準備が完了していなければなりません。
109     //!           この関数は、再生準備が完了したサウンドの再生を開始します。
110     //!           再生準備が完了していないサウンドは、完了するまで待ってから再生を開始します。
111     //!
112     //! @see nw::snd::SoundArchivePlayer::PrepareSound
113     //!
114     //! @date 2010/01/22 初版
115     //---------------------------------------------------------------------------
StartPrepared()116     void StartPrepared()
117     {
118         if ( IsAttachedSound() ) m_pSound->StartPrepared();
119     }
120 
121     //---------------------------------------------------------------------------
122     //! @brief    サウンドを停止します。
123     //!
124     //!           ハンドルに関連付けられたサウンドを停止します。
125     //!           ハンドルが無効の場合は、何もしません。
126     //!
127     //!           fadeFrames で指定したフレーム数をかけてフェードアウトさせることができます。
128     //!           0 を指定した場合はフェードアウトを行わず、
129     //!           エンベロープのリリースを発音し全ての減衰が完了した後にサウンドが停止します。
130     //!
131     //!           フェードアウトの音量制御は、フェードインと共有されます。
132     //!           フェードアウトにかかるフレーム数は、
133     //!           最大音量から音が消えるまでにかかる変化速度を表しますので、
134     //!           フェードイン中にフェードアウトを指定した時などは、
135     //!           指定したフレーム数よりも短い時間でフェードアウトが完了する可能性があります。
136     //!
137     //! @param[in] fadeFrames フェードアウトにかけるフレーム数です。
138     //!                       フレーム数は @ref SoundArchivePlayer::Update
139     //!                       の呼び出し回数で換算されます。
140     //!
141     //! @date 2010/12/24 フレーム数について追記
142     //! @date 2010/01/22 初版
143     //---------------------------------------------------------------------------
Stop(int fadeFrames)144     void Stop( int fadeFrames )
145     {
146         if ( IsAttachedSound() ) m_pSound->Stop( fadeFrames );
147     }
148 
149     //---------------------------------------------------------------------------
150     //! @brief    サウンドを一時停止または再開します。
151     //!
152     //!           ハンドルに関連付けられたサウンドを一時停止または再開します。
153     //!           ハンドルが無効の場合は、何もしません。
154     //!
155     //!           fadeFrames で指定したフレーム数をかけてフェードアウトしながら一時停止、
156     //!           またはフェードインしながら再開させることができます。
157     //!           0 を指定した場合は、即座に一時停止または再開します。
158     //!
159     //!           一時停止・再開時のフェードは、再生開始時のフェードイン、
160     //!           停止時のフェードアウトとは独立してはたらきます。
161     //!           フェードにかかるフレーム数は、最大音量から音が消えるまで、
162     //!           あるいは、
163     //!           発音していない状態から最大音量に達するまでにかかる変化速度を表しますので、
164     //!           フェード中にさらにフェードを指定した時などは、
165     //!           指定したフレーム数よりも短い時間でフェードが完了する可能性があります。
166     //!
167     //! @param[in]    flag        true なら一時停止、false なら再開します。
168     //! @param[in]    fadeFrames  フェードイン・フェードアウトにかけるフレーム数です。
169     //!                           フレーム数は @ref SoundArchivePlayer::Update
170     //!                           の呼び出し回数で換算されます。
171     //!
172     //! @see  IsPause
173     //!
174     //! @date 2010/12/24 フレーム数について追記
175     //! @date 2010/01/22 初版
176     //---------------------------------------------------------------------------
Pause(bool flag,int fadeFrames)177     void Pause( bool flag, int fadeFrames )
178     {
179         if ( IsAttachedSound() ) m_pSound->Pause( flag, fadeFrames );
180     }
181 
182     //---------------------------------------------------------------------------
183     //! @brief    サウンドの再生準備が完了しているかどうかを調べます。
184     //!
185     //!           @ref SoundArchivePlayer::PrepareSound を呼び出した後、
186     //!           そのサウンドの再生準備が完了しているかどうかを調べます。
187     //!           再生準備が完了したサウンドは、@ref StartPrepared を呼び出した際に、
188     //!           すぐに再生を始めることができます。
189     //!
190     //! @return   サウンドの再生準備が完了していれば true を返します。
191     //!
192     //! @see  SoundArchivePlayer::PrepareSound
193     //! @see  StartPrepared
194     //!
195     //! @date 2010/01/22 初版
196     //---------------------------------------------------------------------------
IsPrepared()197     bool IsPrepared() const { return IsAttachedSound() && m_pSound->IsPrepared(); }
198 
199     //---------------------------------------------------------------------------
200     //! @brief    サウンドが一時停止中かどうかを調べます。
201     //!
202     //! @return   サウンドが一時停止状態であれば true を返します。
203     //!
204     //! @see Pause
205     //!
206     //! @date 2010/01/22 初版
207     //---------------------------------------------------------------------------
IsPause()208     bool IsPause() const { return IsAttachedSound() && m_pSound->IsPause(); }
209 
210     //---------------------------------------------------------------------------
211     //! @brief    ストリームがロードの遅延によって停止しているかどうかを調べます。
212     //!
213     //! @return   サウンドがロードの遅延によって停止していれば true を返します。
214     //!
215     //! @see GetFilledBufferPercentage
216     //!
217     //! @date 2011/02/04 参照に @ref GetFilledBufferPercentage を追加
218     //! @date 2010/01/22 初版
219     //---------------------------------------------------------------------------
IsSuspendByLoadingDelay()220     bool IsSuspendByLoadingDelay() const
221     {
222         if ( ! IsAttachedSound() ) return false;
223         return m_pSound->IsSuspendByLoadingDelay();
224     }
225 
226     //---------------------------------------------------------------------------
227     //! @brief    サウンドを再生開始時にフェードインさせます。
228     //!
229     //!           この関数でフェードインの指定を行うと、
230     //!           @ref SoundArchivePlayer::StartSound または
231     //!           @ref StartPrepared を呼び出して再生を開始してから、
232     //!           最初の @ref SoundArchivePlayer::Update
233     //!           が呼び出されたときにフェードインが設定されます。
234     //!
235     //!           サウンドの再生が開始され、最初の @ref SoundArchivePlayer::Update
236     //!           が呼ばれた後に、この関数を呼び出しても効果がありません。
237     //!
238     //!           フェードインの音量制御は、停止時のフェードアウトと共有されます。
239     //!
240     //! @param[in] frames フェードインにかけるフレーム数です。
241     //!                   フレーム数は @ref SoundArchivePlayer::Update
242     //!                   の呼び出し回数で換算されます。
243     //!
244     //! @see  SoundArchivePlayer::StartSound
245     //! @see  StartPrepared
246     //!
247     //! @date 2010/12/24 フレーム数について追記
248     //! @date 2010/01/22 初版
249     //---------------------------------------------------------------------------
FadeIn(int frames)250     void FadeIn( int frames )
251     {
252         if ( IsAttachedSound() ) m_pSound->FadeIn( frames );
253     }
254 
255     //@}
256 
257 
258     //! @name パラメータ変更
259     //@{
260 
261     //---------------------------------------------------------------------------
262     //! @brief    サウンドの音量を変更します。
263     //!
264     //!           ハンドルに関連付けられたサウンドの音量を変更します。
265     //!           ハンドルが無効の場合は、何もしません。
266     //!
267     //!           この関数で指定する値は、他のどの音量パラメータとも独立して動作し、
268     //!           それらは全て重ね合わされます。
269     //!
270     //!           音量 volume は、0.0 以上の倍率で指定します。
271     //!           すなわち、1.0 を指定すると音量に影響を与えません。
272     //!           0.0 を指定すると発音されなくなります。デフォルト値は 1.0 です。
273     //!
274     //!           他の音量パラメータと重ね合わされたあと、
275     //!           最終的な音量は 0.0 ~ 2.0 の範囲でクランプされます。
276     //!           この関数で 2.0 を設定したとしても、
277     //!           元の音量の 2 倍にならない可能性があることに注意してください。
278     //!
279     //!           音量の変化は frames で指定したフレーム数をかけて行われます。
280     //!           音量の変化途中にさらにこの関数を呼び出した場合は、
281     //!           その時点での変化途中の音量値を基点として、
282     //!           新しく指定したフレーム数をかけて音量を変化させます。
283     //!
284     //! @param[in] volume 変更する音量の倍率 (0.0~) です。
285     //! @param[in] frames 音量変化にかけるフレーム数です。
286     //!                   フレーム数は @ref SoundArchivePlayer::Update
287     //!                   の呼び出し回数で換算されます。
288     //!
289     //! @date 2010/12/24 フレーム数について追記
290     //! @date 2010/01/22 初版
291     //---------------------------------------------------------------------------
292     void SetVolume( f32 volume, int frames = 0 )
293     {
294         if ( IsAttachedSound() ) m_pSound->SetVolume( volume, frames );
295     }
296 
297     //---------------------------------------------------------------------------
298     //! @brief    サウンドの音程を変更します。
299     //!
300     //!           ハンドルに関連付けられたサウンドの音程を変更します。
301     //!           ハンドルが無効の場合は、何もしません。
302     //!
303     //!           この関数で指定する値は、他のどの音程パラメータとも独立して動作し、
304     //!           それらは全て重ね合わされます。
305     //!
306     //!           音程 pitch は、周波数の比率で指定します。
307     //!           すなわち、1.0 を指定すると音程に影響を与えません。
308     //!           2.0 を指定すると再生される周波数が 2 倍になり、
309     //!           1 オクターブ高い音程になります。
310     //!           0.5 を指定すると 1 オクターブ低い音程になります。
311     //!           デフォルト値は 1.0 です。
312     //!
313     //! @param[in] pitch  変更する音程の周波数比率です。
314     //!
315     //! @date 2010/01/22 初版
316     //---------------------------------------------------------------------------
SetPitch(f32 pitch)317     void SetPitch( f32 pitch )
318     {
319         if ( IsAttachedSound() ) m_pSound->SetPitch( pitch );
320     }
321 
322     //---------------------------------------------------------------------------
323     //! @brief    サウンドのパン (左右の定位) を変更します。
324     //!
325     //!           ハンドルに関連付けられたサウンドのパンを変更します。
326     //!           ハンドルが無効の場合は、何もしません。
327     //!
328     //!           この関数で指定する値は、他のどのパンパラメータとも独立して動作し、
329     //!           それらは全て重ね合わされます。
330     //!
331     //!           pan は、定位の相対変化の値を設定します。
332     //!           0.0 を指定するとデータで設定されたパンの値から変化しません。
333     //!           1.0 を指定すると中央に定位していた音が右端に定位するようになり、
334     //!           -1.0 を指定すると中央に定位していた音が左端に定位するようになります。
335     //!           デフォルト値は 0.0 です。
336     //!
337     //! @param[in] pan    0.0 を基準としたパンの相対変化の値です。
338     //!
339     //! @date 2010/01/22 初版
340     //---------------------------------------------------------------------------
SetPan(f32 pan)341     void SetPan( f32 pan )
342     {
343         if ( IsAttachedSound() ) m_pSound->SetPan( pan );
344     }
345 
346 #ifdef NW_PLATFORM_RVL
347     //---------------------------------------------------------------------------
348     //! :private
349     //!
350     //! @brief    サウンドのサラウンドパン (前後の定位) を変更します。
351     //!
352     //!           ハンドルに関連付けられたサウンドのサラウンドパンを変更します。
353     //!           ハンドルが無効の場合は、何もしません。
354     //!
355     //!           この関数で指定する値は、他のどのサラウンドパンパラメータとも独立して動作し、
356     //!           それらは全て重ね合わされます。
357     //!
358     //!           surroundPan は、定位の相対変化の値を設定します。
359     //!           0.0 を指定するとデータで設定されたパンの値から変化しません。
360     //!           1.0 を指定すると最前方に定位していた音が中央に定位するようになり、
361     //!           2.0 を指定すると最前方に定位していた音が最後方に定位するようになります。
362     //!           前方へ定位を移動させたい場合は負の値を指定してください。
363     //!           デフォルト値は 0.0 です。
364     //!
365     //! @param[in] surroundPan    0.0 を基準としたサラウンドパンの相対変化の値です。
366     //!
367     //! @date 2010/01/22 初版
368     //---------------------------------------------------------------------------
SetSurroundPan(f32 surroundPan)369     void SetSurroundPan( f32 surroundPan )
370     {
371         if ( IsAttachedSound() ) m_pSound->SetSurroundPan( surroundPan );
372     }
373 #endif /* NW_PLATFORM_RVL */
374 
375     //---------------------------------------------------------------------------
376     //! :private
377     //!
378     //! @brief    サウンドのローパスフィルタカットオフ値を変更します。
379     //!
380     //!           ハンドルに関連付けられたローパスフィルタカットオフ値を変更します。
381     //!           ハンドルが無効の場合は、何もしません。
382     //!
383     //!           この関数で指定する値は、
384     //!           他のどのローパスフィルタカットオフパラメータとも独立して動作し、
385     //!           それらは全て重ね合わされます。
386     //!
387     //!           lpfFreq は、カットオフの相対変化の値を指定します。
388     //!           0.0 を指定するとカットオフの値を変更しません。
389     //!           -1.0 を指定すると、フィルタがかかっていない状態から、
390     //!           もっともフィルタがかかっている状態 (カットオフ周波数が下がる方向)
391     //!           に変更します。
392     //!
393     //! @param[in] lpfFreq    0.0 を基準としたフィルタカットオフの相対変化の値です。
394     //!
395     //! @date 2010/01/22 初版
396     //---------------------------------------------------------------------------
SetLpfFreq(f32 lpfFreq)397     void SetLpfFreq( f32 lpfFreq )
398     {
399         if ( IsAttachedSound() ) m_pSound->SetLpfFreq( lpfFreq );
400     }
401 
402     //---------------------------------------------------------------------------
403     //! @brief    プレイヤープライオリティを変更します。
404     //!
405     //!           ハンドルに関連付けられたサウンドのプレイヤープライオリティを変更します。
406     //!           ハンドルが無効の場合は、何もしません。
407     //!
408     //!           この関数は、サウンドアーカイブ中のデータで指定されている
409     //!           プレイヤープライオリティの値を変更します。
410     //!
411     //!           priority の値の範囲は 0~127 で、大きいほど優先度が高くなります。
412     //!
413     //! @param[in] priority   プレイヤープライオリティの値です。
414     //!
415     //! @date 2010/01/22 初版
416     //---------------------------------------------------------------------------
SetPlayerPriority(int priority)417     void SetPlayerPriority( int priority )
418     {
419         if ( IsAttachedSound() ) m_pSound->SetPlayerPriority( priority );
420     }
421 
422     //---------------------------------------------------------------------------
423     //! @brief    サウンドのメインセンド量を変更します。
424     //!
425     //!           ハンドルに関連付けられたサウンドのメインセンド量を変更します。
426     //!           ハンドルが無効の場合は、何もしません。
427     //!
428     //!           この関数で指定する値は、他のどのメインセンド量とも独立して動作し、
429     //!           それらは全て重ね合わされます。
430     //!
431     //!           メインセンドは、
432     //!           出力に送るサウンドの音量をエフェクトセンドの後で調節するパラメータです。
433     //!           主に、エフェクトのドライ・ウェット成分のバランスを調整するために使用されます。
434     //!
435     //!           センド量 send は、相対変化の値を指定します。
436     //!           すなわち、0.0 を指定するとセンド量を変更しません。
437     //!           -1.0 を指定するとメインバスに最大のセンド量で送られていたサウンドが、
438     //!           メインバスに送られないようになります。 デフォルト値は 0.0 です。
439     //!
440     //! @param[in] send   0.0 を基準としたセンド量の相対変化の値です。
441     //!
442     //! @see SetFxSend
443     //!
444     //! @date 2010/06/16 初版
445     //---------------------------------------------------------------------------
SetMainSend(f32 send)446     void SetMainSend( f32 send )
447     {
448         if ( IsAttachedSound() ) m_pSound->SetMainSend( send );
449     }
450 
451     //---------------------------------------------------------------------------
452     //! @brief    サウンドのエフェクトセンド量を変更します。
453     //!
454     //!           ハンドルに関連付けられたサウンドのエフェクトセンド量を変更します。
455     //!           ハンドルが無効の場合は、何もしません。
456     //!
457     //!           この関数で指定する値は、他のどのエフェクトセンド量とも独立して動作し、
458     //!           それらは全て重ね合わされます。
459     //!
460     //!           センド量 send は、相対変化の値を指定します。
461     //!           すなわち、0.0 を指定するとセンド量を変更しません。
462     //!           1.0 を指定すると AUX バスに送られていなかったサウンドが、
463     //!           最大のセンド量で送られるようになります。 デフォルト値は 0.0 です。
464     //!
465     //! @param[in] bus    センド量を設定する AUX のバスです。
466     //! @param[in] send   0.0 を基準としたセンド量の相対変化の値です。
467     //!
468     //! @see AuxBus
469     //! @see SetMainSend
470     //!
471     //! @date 2010/06/16 初版
472     //---------------------------------------------------------------------------
SetFxSend(AuxBus bus,f32 send)473     void SetFxSend( AuxBus bus, f32 send )
474     {
475         if ( IsAttachedSound() ) m_pSound->SetFxSend( bus, send );
476     }
477     //@}
478 
479 
480     //! @name トラックパラメータ変更
481     //@{
482 
483     //---------------------------------------------------------------------------
484     //! @brief    ストリームサウンドのトラックの音量を変更します。
485     //!
486     //!           ハンドルに関連付けられたサウンドのストリームトラックの音量を変更します。
487     //!           ハンドルが無効の場合は、何もしません。
488     //!
489     //!           この関数で指定する値は、他のどの音量パラメータとも独立して動作し、
490     //!           それらは全て重ね合わされます。
491     //!
492     //!           trackBitFlag で、設定するトラックを指定します。
493     //!           下位ビットから順にトラック 0、トラック 1、トラック 2 … を表し、
494     //!           ビットが立っているトラック全てに対して、サイレント状態を変更します。
495     //!           例えば、トラック 2 とトラック 5 のサイレント状態を変更したい場合は
496     //!           (1 << 2) | (1 << 5) すなわち、0x0024 とします。
497     //!
498     //!           音量 volume は、0.0 以上の倍率で指定します。
499     //!           すなわち、1.0 を指定すると音量に影響を与えません。
500     //!           0.0 を指定すると発音されなくなります。デフォルト値は 1.0 です。
501     //!
502     //!           他の音量パラメータと重ね合わされたあと、
503     //!           最終的な音量は 0.0 ~ 2.0 の範囲でクランプされます。
504     //!           この関数で 2.0 を設定したとしても、
505     //!           元の音量の 2 倍にならない可能性があることに注意してください。
506     //!
507     //! @param[in] trackBitFlag   トラックごとのビットフラグです。
508     //! @param[in] volume         変更する音量の倍率です。
509     //! @param[in] frames         音量変化にかけるフレーム数。
510     //!                           フレーム数は @ref SoundArchivePlayer::Update
511     //!                           の呼び出し回数で換算されます。
512     //!
513     //! @date 2010/12/24 フレーム数について追記
514     //! @date 2010/01/22 初版
515     //---------------------------------------------------------------------------
516     void SetTrackVolume( u32 trackBitFlag, f32 volume, int frames = 0 )
517     {
518         if ( IsAttachedSound() ) m_pSound->SetTrackVolume( trackBitFlag, volume, frames );
519     }
520 
521     //---------------------------------------------------------------------------
522     //! @brief    ストリームサウンドのトラックのパン (左右の定位) を変更します。
523     //!
524     //!           ハンドルに関連付けられたサウンドのストリームトラックのパンを変更します。
525     //!           ハンドルが無効の場合は、何もしません。
526     //!
527     //!           この関数で指定する値は、他のどのパンパラメータとも独立して動作し、
528     //!           それらは全て重ね合わされます。
529     //!
530     //!           trackBitFlag で、設定するトラックを指定します。
531     //!           下位ビットから順にトラック 0、トラック 1、トラック 2 … を表し、
532     //!           ビットが立っているトラック全てに対して、サイレント状態を変更します。
533     //!           例えば、トラック 2 とトラック 5 のサイレント状態を変更したい場合は
534     //!           (1 << 2) | (1 << 5) すなわち、0x0024 とします。
535     //!
536     //!           pan は、定位の相対変化の値を設定します。
537     //!           0.0 を指定するとデータで設定されたパンの値から変化しません。
538     //!           1.0 を指定すると中央に定位していた音が右端に定位するようになり、
539     //!           -1.0 を指定すると中央に定位していた音が左端に定位するようになります。
540     //!           デフォルト値は 0.0 です。
541     //!
542     //! @param[in] trackBitFlag   トラックごとのビットフラグです。
543     //! @param[in] pan            0.0 を基準としたパンの相対変化の値です。
544     //!
545     //! @date 2010/01/22 初版
546     //---------------------------------------------------------------------------
SetTrackPan(u32 trackBitFlag,f32 pan)547     void SetTrackPan( u32 trackBitFlag, f32 pan )
548     {
549         if ( IsAttachedSound() ) m_pSound->SetTrackPan( trackBitFlag, pan );
550     }
551 
552     //---------------------------------------------------------------------------
553     //! @brief    ストリームサウンドのトラックのサラウンドパン (前後の定位) を変更します。
554     //!
555     //!           ハンドルに関連付けられたサウンドのストリームトラックのサラウンドパンを変更します。
556     //!           ハンドルが無効の場合は、何もしません。
557     //!
558     //!           この関数で指定する値は、他のどのサラウンドパンパラメータとも独立して動作し、
559     //!           それらは全て重ね合わされます。
560     //!
561     //!           trackBitFlag で、設定するトラックを指定します。
562     //!           下位ビットから順にトラック 0、トラック 1、トラック 2 … を表し、
563     //!           ビットが立っているトラック全てに対して、サイレント状態を変更します。
564     //!           例えば、トラック 2 とトラック 5 のサイレント状態を変更したい場合は
565     //!           (1 << 2) | (1 << 5) すなわち、0x0024 とします。
566     //!
567     //!           surroundPan は、定位の相対変化の値を設定します。
568     //!           0.0 を指定すると変化しません。
569     //!           1.0 を指定すると最前方に定位していた音が中央に定位するようになり、
570     //!           2.0 を指定すると最前方に定位していた音が最後方に定位するようになります。
571     //!           前方へ定位を移動させたい場合は負の値を指定してください。
572     //!           デフォルト値は 0.0 です。
573     //!
574     //! @param[in] trackBitFlag   トラックごとのビットフラグです。
575     //! @param[in] surroundPan    0.0 を基準としたサラウンドパンの相対変化の値です。
576     //!
577     //! @date 2010/08/16 初版
578     //---------------------------------------------------------------------------
SetTrackSurroundPan(u32 trackBitFlag,f32 surroundPan)579     void SetTrackSurroundPan( u32 trackBitFlag, f32 surroundPan )
580     {
581         if ( IsAttachedSound() ) m_pSound->SetTrackSurroundPan( trackBitFlag, surroundPan );
582     }
583 
584     //@}
585 
586 
587     //! @name ハンドル操作
588     //@{
589 
590     //---------------------------------------------------------------------------
591     //! @brief    ハンドルにサウンドが関連付けられているかどうかを調べます。
592     //!
593     //! @return   ハンドルに関連付けられているサウンドがあれば true を返します。
594     //!
595     //! @date 2010/01/22 初版
596     //---------------------------------------------------------------------------
IsAttachedSound()597     bool IsAttachedSound() const { return m_pSound != NULL; }
598 
599     //---------------------------------------------------------------------------
600     //! @brief    ハンドルからサウンドを解放します。
601     //!
602     //!           ハンドルから開放されたサウンドは、
603     //!           その後ハンドルを通して操作できないようになります。
604     //!
605     //! @date 2010/01/22 初版
606     //---------------------------------------------------------------------------
607     void DetachSound();
608 
609     //@}
610 
611 
612     //! @name 情報設定 / 取得
613     //@{
614 
615     //---------------------------------------------------------------------------
616     //! @brief    サウンドの ID を設定します。
617     //!
618     //!           ハンドルに関連付けられたサウンドの ID を設定します。
619     //!           ハンドルが無効の場合は、何もしません。
620     //!
621     //!           @ref SoundArchivePlayer でサウンドを再生すると、
622     //!           再生開始時にサウンド ID が自動的に設定されます。
623     //!           この関数を呼び出すと、ID を上書きして変更します。
624     //!
625     //!           設定した ID を取得するためには @ref GetId を呼び出します。
626     //!
627     //! @param[in] id サウンドを識別する ID です。
628     //!
629     //! @see SoundArchivePlayer クラス
630     //! @see GetId
631     //!
632     //! @date 2010/01/22 初版
633     //---------------------------------------------------------------------------
SetId(u32 id)634     void SetId( u32 id )
635     {
636         if ( IsAttachedSound() ) m_pSound->SetId( id );
637     }
638 
639     //---------------------------------------------------------------------------
640     //! @brief    サウンドの ID を取得します。
641     //!
642     //!           ハンドルに関連付けられたサウンドに設定されている ID を取得します。
643     //!           ハンドルが無効の場合は 0xffffffff を返します。
644     //!
645     //!           この関数で取得できる ID は @ref SetId で設定された ID です。
646     //!
647     //! @return   サウンドに設定されている ID を返します。
648     //!
649     //! @date 2010/01/22 初版
650     //---------------------------------------------------------------------------
GetId()651     u32 GetId() const
652     {
653         if ( IsAttachedSound() ) return m_pSound->GetId();
654         return internal::BasicSound::INVALID_ID;
655     }
656 
657     // TODO: 3D サウンド
658     //---------------------------------------------------------------------------
659     //! :private
660     //!
661     //! @brief    アンビエントパラメータの値を取得します。
662     //!
663     //!           3D サウンドを利用している際は、
664     //!           3D サウンドで計算された結果がアンビエントパラメータに格納されますので、
665     //!           アンビエントパラメータを取得して 3D
666     //!           サウンドによるサウンドパラメータの値を知ることができます。
667     //!
668     //! @return   現在のアンビエントパラメータの値を返します。
669     //!           ハンドルが無効の場合は NULL を返します。
670     //!
671     //! @see      nw::snd::SoundParam 構造体
672     //!
673     //! @date 2010/01/22 初版
674     //---------------------------------------------------------------------------
GetAmbientParam()675     const SoundParam* GetAmbientParam() const
676     {
677         if ( ! IsAttachedSound() ) return NULL;
678         return &m_pSound->GetAmbientParam();
679     }
680 
681     //---------------------------------------------------------------------------
682     //! @brief    ストリームデータの情報を取得します。
683     //!
684     //!           ハンドルに関連付けられたサウンドで再生している
685     //!           ストリームデータの情報を取得します。
686     //!           ハンドルが無効の場合は false を返します。
687     //!
688     //!           ストリームデータの情報は、
689     //!           ストリームのプリペア処理が完了するまでは取得することができず、
690     //!           その場合は false を返します。
691     //!           プリペア処理が完了しているかどうかは @ref IsPrepared で取得できます。
692     //!
693     //! @param[out] pInfo 結果を格納するストリームデータ情報構造体。
694     //!
695     //! @return   ストリームデータの情報を取得に成功したら true を、
696     //!           取得に失敗したら false を返します。
697     //!
698     //! @see StreamDataInfo 構造体
699     //! @see IsPrepared
700     //!
701     //! @date 2010/01/22 初版
702     //---------------------------------------------------------------------------
ReadStreamDataInfo(StreamDataInfo * pInfo)703     bool ReadStreamDataInfo( StreamDataInfo* pInfo ) const
704     {
705         if ( ! IsAttachedSound() ) return false;
706         return m_pSound->ReadStreamDataInfo( pInfo );
707     }
708 
709     //---------------------------------------------------------------------------
710     //! @brief    再生中のストリームデータのループ回数を取得します。
711     //!
712     //!           ハンドルに関連付けられたサウンドで再生している、
713     //!           ストリームデータのループ回数を取得します。
714     //!           ハンドルが無効の場合は、負の値を返します。
715     //!
716     //! @return   ストリームデータのループ回数を返します。
717     //!
718     //! @date 2010/01/22 初版
719     //---------------------------------------------------------------------------
GetPlayLoopCount()720     long GetPlayLoopCount() const
721     {
722         if ( ! IsAttachedSound() ) return -1;
723         return m_pSound->GetPlayLoopCount();
724     }
725 
726     //---------------------------------------------------------------------------
727     //! @brief    再生中のストリームデータの再生位置を取得します。
728     //!
729     //!           ハンドルに関連付けられたサウンドで再生している、
730     //!           ストリームデータの再生位置をサンプル数で取得します。
731     //!           ハンドルが無効の場合は、負の値を返します。
732     //!
733     //! @return   ストリームデータの再生位置をサンプル数で返します。
734     //!
735     //! @date 2010/01/22 初版
736     //---------------------------------------------------------------------------
GetPlaySamplePosition()737     long GetPlaySamplePosition() const
738     {
739         if ( ! IsAttachedSound() ) return -1;
740         return m_pSound->GetPlaySamplePosition();
741     }
742 
743     //---------------------------------------------------------------------------
744     //! @brief    ストリームバッファに波形データが満たされている割合を取得します。
745     //!
746     //!           ストリームサウンドは、バッファ中の波形データが消費しながら再生します。
747     //!           バッファが空になる前にデータをバッファにロードして、
748     //!           次の波形データ補充しています。ロードが間に合わない場合、
749     //!           データのロードが完了するまでサウンドの再生は停止します。
750     //!
751     //!           この関数で取得できる値は、
752     //!           ストリームサウンドの再生に対して、
753     //!           データのロードが間に合っているかどうかを判断する指標となります。
754     //!           この値が 0.0f になると、
755     //!           ストリームサウンドの再生がロードの遅延によって停止してしまいます。
756     //!           値が大きいほど、
757     //!           ストリームサウンドがロード遅延によって停止する危険性が低いことを表します。
758     //!
759     //! @return   ストリームバッファに波形データが満たされている割合を
760     //!           0.0f ~ 100.0f の値で返します。
761     //!
762     //! @see IsSuspendByLoadingDelay
763     //!
764     //! @date 2011/02/04 初版
765     //---------------------------------------------------------------------------
GetFilledBufferPercentage()766     f32 GetFilledBufferPercentage() const
767     {
768         if ( ! IsAttachedSound() ) return 0.0f;
769         return m_pSound->GetFilledBufferPercentage();
770     }
771     //@}
772 
773 
774     // -----------------------------------------------------------------
775     // 非公開関数
776 
777     // ハンドルをサウンドに関連付ける
778     //! @details :private
779     void detail_AttachSoundAsTempHandle( internal::StreamSound* pSound );
780 
781     //! @details :private
detail_GetAttachedSound()782     internal::StreamSound* detail_GetAttachedSound() { return m_pSound; }
783 
784     //! @details :private
detail_GetAttachedSound()785     const internal::StreamSound* detail_GetAttachedSound() const { return m_pSound; }
786 
787 private:
788     NW_DISALLOW_COPY_AND_ASSIGN( StreamSoundHandle );
789 
790     internal::StreamSound* m_pSound;
791 };
792 
793 } // namespace nw::snd
794 } // namespace nw
795 
796 
797 #endif /* NW_SND_STREAM_SOUND_HANDLE_H_ */
798 
799