1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SoundStartable.h
4 
5   Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Revision: 20576 $
14  *---------------------------------------------------------------------------*/
15 /**
16  * :include nw/snd/snd_SoundStartable.h
17  *
18  * @file snd_SoundStartable.h
19  */
20 
21 #ifndef NW_SND_SOUND_STARTABLE_H_
22 #define NW_SND_SOUND_STARTABLE_H_
23 
24 #include <nw/snd/snd_SoundArchive.h>
25 
26 namespace nw {
27 namespace snd {
28 
29 class SoundHandle;
30 
31 
32 // 再生可能なことを表すインターフェイスです。
33 // 純粋仮想関数 detail_SetupSoundImpl() 及び detail_ConvertLabelStringToItemId() を
34 // 継承したクラスで実装することにより、そのクラスで
35 // StartSound(), HoldSound(), PrepareSound() 関数が使用できるようになります。
36 
37 //---------------------------------------------------------------------------
38 //! @brief        サウンドの再生が可能なことを表す抽象クラスです。
39 //!
40 //! @date 2010/01/15 初版
41 //---------------------------------------------------------------------------
42 class SoundStartable
43 {
44   public:
45     //---------------------------------------------------------------------------
46     //! @brief    サウンド再生処理結果を表すクラスです。
47     //!
48     //!           START_ERR_NOT_ENOUGH_INSTANCE は、
49     //!           再生しようとしたサウンドに必要な数のインスタンスが
50     //!           作られていないことを表します。
51     //!           サウンドアーカイブを使って再生している場合は、
52     //!           サウンドアーカイブ中に設定されている
53     //!           インスタンス数を増やす必要があります。
54     //!
55     //! @see SoundStartable::StartSound.
56     //! @see SoundStartable::HoldSound
57     //! @see SoundStartable::PrepareSound
58     //!
59     //! @date 2010/01/15 初版
60     //---------------------------------------------------------------------------
61     class StartResult
62     {
63     public:
64         //---------------------------------------------------------------------------
65         //! @brief    サウンド再生処理結果を表すコードです。
66         //!
67         //! @date 2010/01/15 初版
68         //---------------------------------------------------------------------------
69         enum ResultCode
70         {
71             //! 再生は成功しました。
72             START_SUCCESS = 0,
73 
74             START_ERR_LOW_PRIORITY,
75             START_ERR_INVALID_LABEL_STRING,
76             START_ERR_INVALID_SOUNDID,
77             START_ERR_NOT_DATA_LOADED,
78             START_ERR_NOT_SEQ_LOADED,
79             START_ERR_NOT_BANK_LOADED,
80             START_ERR_NOT_WSD_LOADED,
81             START_ERR_NOT_WARC_LOADED,
82             START_ERR_NOT_ENOUGH_PLAYER_HEAP,
83             START_ERR_CANNOT_OPEN_FILE,
84             START_ERR_NOT_AVAILABLE,
85             START_ERR_CANNOT_ALLOCATE_TRACK,    // 未使用
86             START_ERR_NOT_ENOUGH_INSTANCE,
87             START_ERR_INVALID_PARAMETER,
88             START_ERR_INVALID_SEQ_START_LOCATION_LABEL,
89             START_ERR_ACTOR_NOT_INITIALIZED,
90             START_ERR_USER = 128,
91             START_ERR_UNKNOWN = 255
92         };
93 
94         //! @details :private
StartResult()95         StartResult() : m_Code( START_ERR_UNKNOWN ) {}
96 
97         //! @details :private
StartResult(ResultCode code)98         StartResult( ResultCode code ) : m_Code( code ) {}
99 
100         //---------------------------------------------------------------------------
101         //! @brief    再生成功したかどうかを取得します。
102         //!
103         //! @return   再生成功したら true, 失敗したら false を返します。
104         //!
105         //! @see SoundStartable::StartSound
106         //! @see SoundStartable::HoldSound
107         //! @see SoundStartable::PrepareSound
108         //!
109         //! @date 2010/01/15 初版
110         //---------------------------------------------------------------------------
IsSuccess()111         bool IsSuccess() const { return m_Code == START_SUCCESS; }
112 
113         //---------------------------------------------------------------------------
114         //! @brief    再生処理結果コードを取得します。
115         //!
116         //! @return   再生処理結果コードを返します。
117         //!
118         //! @date 2010/01/15 初版
119         //---------------------------------------------------------------------------
GetCode()120         ResultCode GetCode() const { return m_Code; }
121 
122     private:
123         ResultCode m_Code;
124     };
125 
126     // static const char* detail_ConvertStartResultToString( StartResult startResult );
127 
128     //---------------------------------------------------------------------------
129     //! @brief    サウンド再生時に渡される、詳細な再生パラメータです。
130     //!
131     //!           @ref SoundStartable::StartSound 等の関数に渡して使用します。
132     //!           この構造体を使用しなくてもサウンドは再生出来ます。
133     //!
134     //!           startOffsetType, startOffset を設定すると、
135     //!           サウンドを途中から再生することが可能です。
136     //!           この 2 つのパラメータは同時に設定する必要があります。
137     //!           設定した値を有効にするには、
138     //!           enableFlag の ENABLE_START_OFFSET ビットを設定してください。
139     //!
140     //!           オフセット値が同じでも、
141     //!           データの種類によって途中再生のために必要な処理時間が異なります。
142     //!           大きな処理時間がかかる場合があることに注意してください。
143     //!
144     //!           【シーケンスサウンド】 @n
145     //!           シーケンスを途中まで空回しするため、
146     //!           開始オフセットの大きさに応じた処理時間がかかります。
147     //!
148     //!           【ストリームサウンド】 @n
149     //!           データが PCM の場合は、開始オフセットの大きさに関わらず、
150     //!           途中再生のための処理時間はほとんどかかりません。
151     //!           データが ADPCM の場合は、最大 14336 サンプルのデータを
152     //!           CPU でデコードするための処理がかかります。
153     //!
154     //!           【ウェーブサウンド】 @n
155     //!           データが PCM の場合は、開始オフセットの大きさに関わらず、
156     //!           途中再生のための処理時間はほとんどかかりません。
157     //!           データが ADPCM の場合は、
158     //!           データ先頭から再生開始位置までの全てのサンプルを
159     //!           CPU でデコードする必要があるため、
160     //!           開始オフセットの大きさに応じた処理時間がかかります。
161     //!
162     //!           サウンドはサウンドアーカイブ中で設定された
163     //!           ID のプレイヤーを使用して再生されますが、
164     //!           これとは異なるプレイヤーを指定して再生したい場合、
165     //!           playerId を設定します。設定した値を有効にするには、
166     //!           enableFlag の ENABLE_PLAYER_ID ビットを設定してください。
167     //!
168     //!           サウンドはサウンドアーカイブ中で設定された
169     //!           プレイヤープライオリティを使用して再生されますが、
170     //!           これとは異なるプライオリティ値を指定して再生したい場合、
171     //!           playerPriority を設定します。設定した値を有効にするには、
172     //!           enableFlag の ENABLE_PLAYER_PRIORITY ビットを設定してください。
173     //!
174     //!           actorPlayerId は、@ref SoundActor
175     //!           クラスで再生する際に使用するアクタープレイヤー番号を設定します。
176     //!           値の範囲は 0 ~ 3 です。設定した値を有効にするには、
177     //!           enableFlag の ENABLE_ACTOR_PLAYER_ID ビットを設定してください。
178     //!           (NW4C-0.4.1 現在、この値を設定しても効果はありません)
179     //!
180     //!           seqSoundInfo は、シーケンスサウンドに関するパラメータです。
181     //!           シーケンスサウンドを再生するときにのみ有効です。
182     //!           サウンドアーカイブ中で設定されている、
183     //!           シーケンスサウンドに関する情報を上書きすることができます。
184     //!           詳しくは SeqSoundInfo 構造体を参照してください。
185     //!           設定した値を有効にするには、 enableFlag の ENABLE_SEQ_SOUND_INFO
186     //!           ビットを設定してください。
187     //!
188     //! @see  SoundStartable::StartSound
189     //!
190     //! @date 2010/01/25 初版
191     //---------------------------------------------------------------------------
192     struct StartInfo
193     {
194         //---------------------------------------------------------------------------
195         //! @brief    StartInfo 構造体のパラメータを有効にするためのビットフラグの定義です。
196         //!
197         //!           それぞれの値の論理和をとって使用します。
198         //!
199         //! @see      SoundStartable::StartInfo
200         //!
201         //! @date 2010/01/15 初版
202         //---------------------------------------------------------------------------
203         enum EnableFlagBit
204         {
205             /*!
206               @brief    startOffsetType, startOffset に設定された値を有効にします。
207                         2 つのパラメータは同時に設定する必要があります。
208              */
209             ENABLE_START_OFFSET      = 0x00000001,
210 
211             //! playerId に設定された値を有効にします。
212             ENABLE_PLAYER_ID         = 0x00000002,
213 
214             //! playerPriority に設定された値を有効にします。
215             ENABLE_PLAYER_PRIORITY   = 0x00000004,
216 
217             //!  actorPlayerId に設定された値を有効にします。
218             ENABLE_ACTOR_PLAYER_ID   = 0x00000008,
219 
220             //! seqSoundInfo に設定された値を有効にします。
221             ENABLE_SEQ_SOUND_INFO    = 0x00000010
222         };
223 
224         //---------------------------------------------------------------------------
225         //! @brief    サウンドの開始オフセット値の単位の定義です。
226         //!
227         //! @see      SoundStartable::StartInfo
228         //!
229         //! @date 2010/01/15 初版
230         //---------------------------------------------------------------------------
231         enum StartOffsetType
232         {
233             START_OFFSET_TYPE_MILLISEC, //!< オフセット値の単位はミリ秒です。
234 
235             /*!
236                 @brief  オフセット値の単位は Tick です。
237                         この指定はシーケンスサウンドに対してのみ有効です。
238                         それ以外では、オフセット値の指定が無効になります。
239              */
240             START_OFFSET_TYPE_TICK,
241 
242             /*!
243                 @brief  オフセット値の単位は波形のサンプル数です。
244                         この指定はストリームサウンドとウェーブサウンドに対して有効です。
245                         それ以外では、オフセット値の指定が無効になります。
246              */
247             START_OFFSET_TYPE_SAMPLE
248         };
249 
250         //---------------------------------------------------------------------------
251         //! @brief    シーケンスサウンドに関するパラメータ構造体です。
252         //!
253         //!           シーケンスサウンド再生時に渡されるます。
254         //!
255         //!           seqDataAddress にシーケンスデータのアドレスを指定すると、
256         //!           サウンドアーカイブ中で設定されているシーケンスデータの代わりに、
257         //!           メモリ上に置かれたシーケンスデータをアドレスで指定して再生することができます。
258         //!           NULL を指定すると、
259         //!           元々サウンドアーカイブで設定されているシーケンスデータを再生します。
260         //!
261         //!           startLocationLabel には、シーケンスデータ内の再生開始位置を指定します。
262         //!           サウンドアーカイブ中で設定されているラベル文字列の代わりに、
263         //!           ここで指定した文字列を使用するようになります。
264         //!           NULL を指定すると、
265         //!           元々サウンドアーカイブで設定されている再生開始位置を使用して再生します。
266         //!
267         //!           bankIds には、シーケンスデータと関連付けるバンク ID を指定します。
268         //!           サウンドアーカイブ中で設定されているバンク ID の代わりに、
269         //!           ここで指定した ID を仕様するようになります。
270         //!           NULL を指定すると、
271         //!           元々サウンドアーカイブで設定されているバンク ID を仕様して再生します。
272         //!
273         //! @see      SoundStartable::StartInfo
274         //!
275         //! @date 2010/01/15 初版
276         //---------------------------------------------------------------------------
277         struct SeqSoundInfo
278         {
279             //! シーケンスデータのアドレスです。
280             const void* seqDataAddress;
281 
282             //! シーケンスデータ内の再生開始位置を示すラベル文字列です。
283             const char* startLocationLabel;
284 
285             //! シーケンスデータと関連付けるバンク ID です。
286             SoundArchive::ItemId bankIds[ SoundArchive::SEQ_BANK_MAX ];
287 
288             //! コンストラクタです。
SeqSoundInfoStartInfo::SeqSoundInfo289             SeqSoundInfo() : seqDataAddress( NULL ), startLocationLabel( NULL )
290             {
291                 for ( int i = 0; i < SoundArchive::SEQ_BANK_MAX; i++ )
292                 {
293                     bankIds[ i ] = SoundArchive::INVALID_ID;
294                 }
295             }
296         };
297 
298         /*!
299             @brief  構造体に設定された値を有効にするためのビットフラグです。
300                     デフォルト値では全て無効になっています。
301          */
302         u32 enableFlag;
303 
304         //! サウンドの開始オフセット値の単位です。
305         StartOffsetType startOffsetType;
306 
307         //! サウンドの開始オフセット値です。
308         int startOffset;
309 
310         //! サウンドの再生に使用するプレイヤーの ID です。
311         SoundArchive::ItemId playerId;
312 
313         //! サウンドに設定するプレイヤープライオリティです。
314         int playerPriority;
315 
316         /*!
317             @brief  SoundActorで再生する場合に使用するアクタープレイヤーの番号です。
318                     (NW4C-0.4.1 現在、設定しても効果はありません)
319          */
320         int actorPlayerId;
321 
322         //! シーケンスサウンドに関するパラメータです。
323         SeqSoundInfo seqSoundInfo;
324 
325         //! コンストラクタです
StartInfoStartInfo326         StartInfo() : enableFlag( 0 ) {}
327     };
328 
329     /* ------------------------------------------------------------------------
330             member definition
331        ------------------------------------------------------------------------ */
332     // デストラクタ
333     //! @details :private
~SoundStartable()334     virtual ~SoundStartable() {};
335 
336     //----------------------------------------
337     //! @name 再生
338     //@{
339     // 再生関数
340     //---------------------------------------------------------------------------
341     //! @brief  指定した ID のサウンドを再生します。
342     //!
343     //!         第一引数には、サウンドハンドルを指定します。
344     //!         再生に成功したサウンドは、このサウンドハンドルと関連付けられます。
345     //!
346     //!         第二引数には、再生するサウンドの識別子としてサウンド ID を指定します。
347     //!
348     //!         pStartInfo は、再生時に設定できる詳細なパラメータです。
349     //!         このパラメータは、設定せずに再生を開始することが可能です。
350     //!
351     //!         この関数を呼び出すことは、@ref PrepareSound を呼び出した後、
352     //!         すぐにハンドルクラスの @ref SoundHandle::StartPrepared
353     //!         を呼び出すことと同じです。
354     //!
355     //!         現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。
356     //!
357     //! @param[in] pHandle        再生されるサウンドと関連付けられるハンドルです。
358     //! @param[in] soundId        再生するサウンドの ID です。
359     //! @param[in] pStartInfo     詳細な再生パラメータです。
360     //!
361     //! @return   再生処理結果を @ref StartResult 型で返します。
362     //!
363     //! @see SoundHandle クラス
364     //! @see StartResult
365     //! @see PrepareSound
366     //! @see StartInfo
367     //!
368     //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記
369     //! @date 2010/01/15 初版
370     //---------------------------------------------------------------------------
371     StartResult StartSound(
372             SoundHandle* pHandle,
373             SoundArchive::ItemId soundId,
374             const StartInfo* pStartInfo = NULL );
375 
376     //---------------------------------------------------------------------------
377     //! @brief  指定したラベル文字列のサウンドを再生します。
378     //!
379     //!         第一引数には、サウンドハンドルを指定します。
380     //!         再生に成功したサウンドは、このサウンドハンドルと関連付けられます。
381     //!
382     //!         第二引数には、再生するサウンドの識別子として、
383     //!         サウンドのラベル文字列を指定します。
384     //!
385     //!         pStartInfo は、再生時に設定できる詳細なパラメータです。
386     //!         このパラメータは、設定せずに再生を開始することが可能です。
387     //!
388     //!         この関数を呼び出すことは、@ref PrepareSound を呼び出した後、
389     //!         すぐにハンドルクラスの @ref SoundHandle::StartPrepared
390     //!         を呼び出すことと同じです。
391     //!
392     //!         現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。
393     //!
394     //! @param[in] pHandle        再生されるサウンドと関連付けられるハンドルです。
395     //! @param[in] pSoundName     再生するサウンドのラベル文字列です。
396     //! @param[in] pStartInfo     詳細な再生パラメータです。
397     //!
398     //! @return   再生処理結果を @ref StartResult 型で返します。
399     //!
400     //! @see SoundHandle クラス
401     //! @see StartResult
402     //! @see PrepareSound
403     //! @see StartInfo
404     //!
405     //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記
406     //! @date 2010/01/15 初版
407     //---------------------------------------------------------------------------
408     StartResult StartSound(
409             SoundHandle* pHandle,
410             const char* pSoundName,
411             const StartInfo* pStartInfo = NULL );
412 
413     //---------------------------------------------------------------------------
414     //! @brief  指定した ID のサウンドを再生または継続します。
415     //!
416     //!         同じ ID で毎フレームこの関数を呼び続けている間、
417     //!         サウンドを再生することができます。
418     //!         呼び出しが途切れた時はサウンドが停止します。
419     //!
420     //!         第一引数には、サウンドハンドルを指定します。
421     //!
422     //!         第二引数には、再生するサウンドの識別子としてサウンド ID を指定します。
423     //!
424     //!         pHoldInfo は、再生時に設定できる詳細なパラメータです。
425     //!         このパラメータは、設定せずに再生を開始することが可能です。
426     //!
427     //!         現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。
428     //!
429     //! @param[in] pHandle        再生されるサウンドと関連付けられるハンドルです。
430     //! @param[in] soundId        再生するサウンドの ID です。
431     //! @param[in] pHoldInfo      詳細な再生パラメータです。
432     //!
433     //! @return   再生処理結果を @ref StartResult 型で返します。
434     //!
435     //! @see SoundHandle クラス
436     //! @see StartResult
437     //! @see StartInfo
438     //!
439     //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記
440     //! @date 2010/01/15 初版
441     //---------------------------------------------------------------------------
442     StartResult HoldSound(
443             SoundHandle* pHandle,
444             SoundArchive::ItemId soundId,
445             const StartInfo* pHoldInfo = NULL );
446 
447     //---------------------------------------------------------------------------
448     //! @brief  指定したラベル文字列のサウンドを再生または継続します。
449     //!
450     //!         同じ ID で毎フレームこの関数を呼び続けている間、
451     //!         サウンドを再生することができます。
452     //!         呼び出しが途切れた時はサウンドが停止します。
453     //!
454     //!         第一引数には、サウンドハンドルを指定します。
455     //!
456     //!         第二引数には、再生するサウンドの識別子として、
457     //!         サウンドのラベル文字列を指定します。
458     //!
459     //!         pHoldInfo は、再生時に設定できる詳細なパラメータです。
460     //!         このパラメータは、設定せずに再生を開始することが可能です。
461     //!
462     //!         現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。
463     //!
464     //! @param[in] pHandle        再生されるサウンドと関連付けられるハンドルです。
465     //! @param[in] pSoundName     再生するサウンドのラベル文字列です。
466     //! @param[in] pHoldInfo      詳細な再生パラメータです。
467     //!
468     //! @return   再生処理結果を @ref StartResult 型で返します。
469     //!
470     //! @see SoundHandle クラス
471     //! @see StartResult
472     //! @see StartInfo
473     //!
474     //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記
475     //! @date 2010/01/15 初版
476     //---------------------------------------------------------------------------
477     StartResult HoldSound(
478             SoundHandle* pHandle,
479             const char* pSoundName,
480             const StartInfo* pHoldInfo = NULL );
481 
482     //---------------------------------------------------------------------------
483     //! @brief  指定した ID のサウンドを再生する準備をします。
484     //!
485     //!         準備が完了したサウンドは、ハンドルクラスの
486     //!         @ref SoundHandle::StartPrepared
487     //!         を呼び出して再生を開始することができます。
488     //!
489     //!         第一引数には、サウンドハンドルを指定します。
490     //!         再生に成功したサウンドは、このサウンドハンドルと関連付けられます。
491     //!
492     //!         第二引数には、再生するサウンドの識別子としてサウンド ID を指定します。
493     //!
494     //!         pStartInfo は、再生時に設定できる詳細なパラメータです。
495     //!         このパラメータは、設定せずに再生を開始することが可能です。
496     //!
497     //!         現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。
498     //!
499     //! @param[in] pHandle        再生されるサウンドと関連付けられるハンドルです。
500     //! @param[in] soundId        再生するサウンドの ID です。
501     //! @param[in] pStartInfo     詳細な再生パラメータです。
502     //!
503     //! @return   再生準備処理結果を @ref StartResult 型で返します。
504     //!
505     //! @see SoundHandle クラス
506     //! @see StartResult
507     //! @see StartSound
508     //! @see StartInfo
509     //!
510     //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記
511     //! @date 2010/01/15 初版
512     //---------------------------------------------------------------------------
513     StartResult PrepareSound(
514             SoundHandle* pHandle,
515             SoundArchive::ItemId soundId,
516             const StartInfo* pStartInfo = NULL );
517 
518     //---------------------------------------------------------------------------
519     //! @brief  指定したラベル文字列のサウンドを再生する準備をします。
520     //!
521     //!         準備が完了したサウンドは、ハンドルクラスの
522     //!         @ref SoundHandle::StartPrepared
523     //!         を呼び出して再生を開始することができます。
524     //!
525     //!         第一引数には、サウンドハンドルを指定します。
526     //!         再生に成功したサウンドは、このサウンドハンドルと関連付けられます。
527     //!
528     //!         第二引数には、再生するサウンドの識別子として、
529     //!         サウンドのラベル文字列を指定します。
530     //!
531     //!         pStartInfo は、再生時に設定できる詳細なパラメータです。
532     //!         このパラメータは、設定せずに再生を開始することが可能です。
533     //!
534     //!         現在、未実装のため、pStartInfo を使ったサウンドの途中再生には対応していません。
535     //!
536     //! @param[in] pHandle        再生されるサウンドと関連付けられるハンドルです。
537     //! @param[in] pSoundName     再生するサウンドのラベル文字列です。
538     //! @param[in] pStartInfo     詳細な再生パラメータです。
539     //!
540     //! @return   再生準備処理結果を @ref StartResult 型で返します。
541     //!
542     //! @see SoundHandle クラス
543     //! @see StartResult
544     //! @see StartSound
545     //! @see StartInfo
546     //!
547     //! @date 2010/07/27 pStartInfo を使ったサウンドの途中再生に未対応の旨、追記
548     //! @date 2010/01/15 初版
549     //---------------------------------------------------------------------------
550     StartResult PrepareSound(
551             SoundHandle* pHandle,
552             const char* pSoundName,
553             const StartInfo* pStartInfo = NULL );
554     //@}
555 
556   protected:
557     //! @details :private
558     virtual StartResult detail_SetupSound(
559         SoundHandle* handle,
560         u32 soundId,
561         bool holdFlag,
562         const StartInfo* startInfo
563     ) = 0;
564     //! @details :private
565     virtual SoundArchive::ItemId detail_GetItemId( const char* pString ) = 0;
566 };
567 
568 } // namespace nw::snd
569 } // namespace nw
570 
571 #endif /* NW_SND_SOUND_STARTABLE_H_ */
572 
573