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