1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SoundArchive.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: 27990 $
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * :include nw/snd/snd_SoundArchive.h
18  *
19  * @file snd_SoundArchive.h
20  */
21 
22 #ifndef NW_SND_SOUND_ARCHIVE_H_
23 #define NW_SND_SOUND_ARCHIVE_H_
24 
25 #include <nn/types.h>
26 #include <nw/snd/snd_Global.h>
27 #include <nw/snd/snd_Util.h>
28 #include <nw/snd/snd_ItemType.h>
29 
30 namespace nw {
31 
32 namespace io {
33 class FileStream;
34 } // namespace nw::io
35 
36 namespace snd {
37 
38 namespace internal {
39 class SoundArchiveFileReader;
40 } // namespace nw::snd::internal
41 
42 
43 //---------------------------------------------------------------------------
44 //! @brief        サウンドアーカイブを扱うクラスです。
45 //!
46 //!               ユーザーがこのクラスを直接扱うことはできません。
47 //!               このクラスを継承した @ref RomSoundArchive クラス、
48 //!               または @ref MemorySoundArchive クラスを使用してください。
49 //!
50 //! @see RomSoundArchive
51 //! @see MemorySoundArchive
52 //!
53 //! @date 2010/02/23 ヘッダーを追記
54 //! @date 2010/01/29 「参照」追加
55 //! @date 2010/01/15 初版
56 //---------------------------------------------------------------------------
57 class SoundArchive
58 {
59   public:
60     //---------------------------------------------------------------------------
61     //! @brief    サウンドアーカイブの中でのアイテム ID を示す型です。
62     //!
63     //!           サウンド、バンク、プレイヤー、グループ、波形アーカイブに、
64     //!           重複しないアイテム ID が割り振られています。
65     //!
66     //! @see GetItemLabel
67     //! @see GetItemId
68     //!
69     //! @date 2010/01/15 初版
70     //---------------------------------------------------------------------------
71     typedef u32 ItemId;
72 
73     //---------------------------------------------------------------------------
74     //! @brief    無効な ID を表す値です。
75     //!
76     //! @date 2010/01/15 初版
77     //---------------------------------------------------------------------------
78     static const ItemId INVALID_ID = 0xffffffff;
79 
80     //---------------------------------------------------------------------------
81     //! @brief    サウンドの種類を表す型です。
82     //!
83     //! @see GetSoundType
84     //!
85     //! @date 2010/01/15 初版
86     //---------------------------------------------------------------------------
87     enum SoundType
88     {
89         SOUND_TYPE_INVALID = 0,     //!< 不正な種類のサウンドです。
90 
91         SOUND_TYPE_SEQ,             //!< シーケンスサウンドです。
92         SOUND_TYPE_STRM,            //!< ストリームサウンドです。
93         SOUND_TYPE_WAVE             //!< ウェーブサウンドです。
94     };
95 
96     //---------------------------------------------------------------------------
97     //! @brief    サウンドアーカイブの中でのファイル ID を示す型です。
98     //!
99     //! @date 2010/01/15 初版
100     //---------------------------------------------------------------------------
101     typedef ItemId FileId;
102 
103     //---------------------------------------------------------------------------
104     //! @brief    サウンドアーカイブの中での文字列 ID を示す型です。
105     //!
106     //! @date 2010/01/15 初版
107     //---------------------------------------------------------------------------
108     typedef ItemId StringId;
109 
110     //---------------------------------------------------------------------------
111     //! @brief  サウンドの設定情報の構造体です。
112     //!
113     //!         isFrontBypass が true で、@ref SoundSystem::SetOutputMode
114     //!         で設定する出力モードが OUTPUT_MODE_SURROUND の場合、
115     //!         当該サウンドはフロントチャンネルをバイパスします。
116     //!
117     //! @see ReadSoundInfo
118     //! @see FileId
119     //! @see ItemId
120     //! @see PanMode
121     //! @see PanCurve
122     //! @see nn::snd::Voice::SetFrontBypassFlag
123     //!
124     //! @date 2010/07/14 isFrontBypass 追加
125     //! @date 2010/01/15 初版
126     //---------------------------------------------------------------------------
127     struct SoundInfo
128     {
129         FileId fileId;      //!< サウンドアーカイブ内でのファイル ID です。
130         ItemId playerId;    //!< サウンドを再生するときに使用されるプレイヤーの ID です。
131 
132         //! アクターでサウンドを再生するときに使用されるアクタープレイヤーの番号です。
133         int actorPlayerId;
134 
135         int playerPriority; //!< サウンドを再生するときのプレイヤープライオリティの値です。
136         int volume;         //!< サウンドを再生するときの音量です。
137         PanMode panMode;    //!< パンモードの種類です。
138         PanCurve panCurve;  //!< パンのカーブの種類です。
139 
140         bool isFrontBypass; //!< フロントバイパスするか否かを示すフラグです。
141     };
142 
143     //---------------------------------------------------------------------------
144     //! @brief    サウンドの 3D サウンド設定情報の構造体です。
145     //!
146     //! @see ReadSound3DInfo
147     //!
148     //! @date 2010/11/30 FLAG_CTRL_*** を static const u32 から enum に変更
149     //! @date 2010/03/05 初版
150     //---------------------------------------------------------------------------
151     struct Sound3DInfo
152     {
153         //---------------------------------------------------------------------------
154         //! @brief    3D 減衰カーブの形状を示す列挙体です。
155         //!
156         //! @date 2010/03/05 初版
157         //---------------------------------------------------------------------------
158         enum DecayCurve
159         {
160             DECAY_CURVE_LOG    = 1, //!< 対数カーブです。
161             DECAY_CURVE_LINEAR = 2  //!< リニア (直線) です。
162         };
163 
164         //---------------------------------------------------------------------------
165         //! @brief    3D サウンドで各パラメータを計算するかどうかを示すフラグです。
166         //!
167         //! @date 2010/11/30 初版
168         //---------------------------------------------------------------------------
169         enum FlagCtrl
170         {
171             FLAG_CTRL_VOLUME   = (1 << 0), //!< 音量を計算するかどうかを示すフラグです。
172             FLAG_CTRL_PRIORITY = (1 << 1), //!< プライオリティを計算するかどうかを示すフラグです。
173             FLAG_CTRL_PAN      = (1 << 2), //!< パンを計算するかどうかを示すフラグです。
174             FLAG_CTRL_SPAN     = (1 << 3), //!< サラウンドパンを計算するかどうかを示すフラグです。
175             FLAG_CTRL_FILTER   = (1 << 4)  //!< biquad フィルタを計算するかどうかを示すフラグです。
176         };
177 
178         //---------------------------------------------------------------------------
179         //! @brief    3D 計算で処理するパラメータを表現するビットフラグです。
180         //!           FLAG_CTRL_*** の論理和で表現されます。
181         //---------------------------------------------------------------------------
182         u32 flags;
183         f32 decayRatio;     //!< 3D 減衰率です。
184         u8 decayCurve;      //!< 3D 減衰カーブの形状です。@ref DecayCurve が格納されます。
185         u8 dopplerFactor;   //!< 3D ドップラーファクターです。
186     };
187 
188     //---------------------------------------------------------------------------
189     //! @brief    シーケンスサウンドに関連付けられるバンクの最大数です。
190     //!
191     //! @date 2010/01/15 初版
192     //---------------------------------------------------------------------------
193     static const u32 SEQ_BANK_MAX = 4;
194 
195     //---------------------------------------------------------------------------
196     //! @brief    シーケンスサウンドの設定情報の構造体です。
197     //!
198     //!           サウンドアーカイブで定義されている、
199     //!           シーケンスサウンドの情報を取得するための構造体です。
200     //!
201     //! @see ReadSequenceSoundInfo
202     //!
203     //! @date 2010/01/15 初版
204     //---------------------------------------------------------------------------
205     struct SequenceSoundInfo
206     {
207         u32 startOffset;                //!< 非公開です。ライブラリ内部で使用されています。
208         u32 bankIds[ SEQ_BANK_MAX ];    //!< シーケンスサウンドで使用されるバンク ID です。
209 
210         //---------------------------------------------------------------------------
211         //! @brief    シーケンスサウンドに含まれるトラックのビットフラグです。
212         //!           下位ビットから順にトラック 0, トラック 1, トラック 2,... を表します。
213         //---------------------------------------------------------------------------
214         u32 allocateTrackFlags;
215 
216         //! シーケンスサウンドで発音される音のチャンネルプライオリティの値です。
217         u8  channelPriority;
218 
219         //---------------------------------------------------------------------------
220         //! @brief    シーケンスサウンドで発音される音が、
221         //!           リリース時にプライオリティを固定されるかどうかのフラグです。
222         //!           固定しない場合はリリース時にプライオリティが下がります。
223         //---------------------------------------------------------------------------
224         bool isReleasePriorityFix;
225 
226         //! コンストラクタです。
SequenceSoundInfoSequenceSoundInfo227         SequenceSoundInfo()
228         : startOffset( 0 ),
229           allocateTrackFlags( 0 ),
230           channelPriority( 0 ),
231           isReleasePriorityFix( false )
232         {
233             for ( u32 i = 0; i < SEQ_BANK_MAX; i++ )
234             {
235                 bankIds[ i ] = INVALID_ID;
236             }
237         }
238     };
239 
240     //---------------------------------------------------------------------------
241     //! :private
242     //!
243     //! @brief    ストリームサウンドの設定情報の構造体です。
244     //!
245     //!           サウンドアーカイブで定義されている、
246     //!           ストリームサウンドの情報を取得するための構造体です。
247     //!
248     //! @see detail_ReadStreamSoundInfo
249     //!
250     //! @date 2010/01/15 初版
251     //---------------------------------------------------------------------------
252     struct StreamSoundInfo
253     {
254         u16 allocTrackCount;
255         u16 allocChannelCount;
256 
257         //! コンストラクタです。
StreamSoundInfoStreamSoundInfo258         StreamSoundInfo()
259         : allocTrackCount( 0 ),
260           allocChannelCount( 0 )
261         {}
262     };
263 
264     //---------------------------------------------------------------------------
265     //! :private
266     //!
267     //! @brief    ウェーブサウンドの設定情報の構造体です。
268     //!
269     //!           サウンドアーカイブで定義されている、
270     //!           ウェーブサウンドの情報を取得するための構造体です。
271     //!
272     //! @see detail_ReadWaveSoundInfo
273     //!
274     //! @date 2010/01/15 初版
275     //---------------------------------------------------------------------------
276     struct WaveSoundInfo
277     {
278         u32     index;              // ウェーブサウンドセットファイル (bcwsd) 内で何番目か
279         u32     allocTrackCount;    // 現状は 1。今後マルチトラック化した場合、ほかの値が入る
280         u8      channelPriority;
281         bool    isReleasePriorityFix;
282 
283         //! コンストラクタです。
WaveSoundInfoWaveSoundInfo284         WaveSoundInfo()
285         : allocTrackCount( 0 ),
286           channelPriority( 0 ),
287           isReleasePriorityFix( false ) {}
288     };
289 
290     //---------------------------------------------------------------------------
291     //! @brief    バンクの設定情報の構造体です。
292     //!
293     //!           サウンドアーカイブで定義されている、
294     //!           バンクの情報を取得するための構造体です。
295     //!
296     //! @see ReadBankInfo
297     //! @see FileId
298     //!
299     //! @date 2010/01/15 初版
300     //---------------------------------------------------------------------------
301     struct BankInfo
302     {
303         FileId fileId;              //!< サウンドアーカイブ内でのファイル ID です。
304 
305         //! コンストラクタです。
BankInfoBankInfo306         BankInfo() : fileId( INVALID_ID ) {}
307     };
308 
309     //---------------------------------------------------------------------------
310     //! :private
311     //!
312     //! @brief    波形アーカイブの設定情報の構造体です。
313     //!
314     //!           サウンドアーカイブで定義されている、
315     //!           波形アーカイブの情報を取得するための構造体です。
316     //!
317     //! @see ReadWaveArchiveInfo
318     //!
319     //! @date 2010/01/15 初版
320     //---------------------------------------------------------------------------
321     struct WaveArchiveInfo
322     {
323         u32  fileId;
324         u32  waveCount;
325         bool isLoadIndividual;
326         u8   padding1;
327         u16  padding2;
328 
329         //! コンストラクタです。
WaveArchiveInfoWaveArchiveInfo330         WaveArchiveInfo() : fileId( INVALID_ID ), isLoadIndividual( false ) {}
331     };
332 
333     //---------------------------------------------------------------------------
334     //! @brief    プレイヤーの設定情報の構造体です。
335     //!
336     //!           サウンドアーカイブで定義されている、
337     //!           プレイヤーの情報を取得するための構造体です。
338     //!
339     //! @see ReadPlayerInfo
340     //!
341     //! @date 2010/01/15 初版
342     //---------------------------------------------------------------------------
343     struct PlayerInfo
344     {
345         int playableSoundMax;   //!< プレイヤーで同時に再生できるサウンドの数です。
346         u32 playerHeapSize;     //!< プレイヤーに割り当てられるプレイヤーヒープのサイズです。
347 
348         //! コンストラクタです。
PlayerInfoPlayerInfo349         PlayerInfo()
350         : playableSoundMax( 0 ),
351           playerHeapSize( 0 ) {}
352     };
353 
354     //---------------------------------------------------------------------------
355     //! :private
356     //!
357     //! @brief    ウェーブサウンドセット・シーケンスサウンドセットの設定情報の構造体です。
358     //!
359     //!           サウンドアーカイブで定義されている、
360     //!           ウェーブサウンドセット・シーケンスサウンドセットの情報を
361     //!           取得するための構造体です。
362     //!
363     //! @see detail_ReadSoundGroupInfo
364     //!
365     //! @date 2010/01/15 初版
366     //---------------------------------------------------------------------------
367     struct SoundGroupInfo
368     {
369         ItemId startId;
370         ItemId endId;
371         const internal::Util::Table<ut::ResU32>* fileIdTable;
372 
373         //! コンストラクタです。
SoundGroupInfoSoundGroupInfo374         SoundGroupInfo()
375         : startId( INVALID_ID ),
376           endId( INVALID_ID ),
377           fileIdTable( NULL ) {}
378     };
379 
380     //---------------------------------------------------------------------------
381     //! :private
382     //!
383     //! @brief    グループの設定情報の構造体です。
384     //!
385     //!           サウンドアーカイブで定義されている、
386     //!           グループの情報を取得するための構造体です。
387     //!
388     //! @see detail_ReadGroupInfo
389     //!
390     //! @date 2010/01/15 初版
391     //---------------------------------------------------------------------------
392     struct GroupInfo
393     {
394         FileId fileId;
GroupInfoGroupInfo395         GroupInfo() : fileId( INVALID_ID ) {}
396     };
397 
398     //---------------------------------------------------------------------------
399     //! @brief    サウンドアーカイブプレイヤーの設定情報の構造体です。
400     //!
401     //!           サウンドアーカイブで定義されている、
402     //!           サウンドアーカイブプレイヤーの情報を取得するための構造体です。
403     //!
404     //! @see ReadSoundArchivePlayerInfo
405     //!
406     //! @date 2010/01/15 初版
407     //---------------------------------------------------------------------------
408     struct SoundArchivePlayerInfo
409     {
410         int sequenceSoundMax;   //!< 確保するシーケンスサウンドインスタンスの数です。
411         int sequenceTrackMax;   //!< 確保するシーケンストラックインスタンスの数です。
412         int streamSoundMax;     //!< 確保するストリームサウンドインスタンスの数です。
413         int streamTrackMax;     //!< 確保するストリームトラックインスンスの数です。
414         int streamChannelMax;   //!< 確保するストリームチャンネルインスタンスの数です。
415         int waveSoundMax;       //!< 確保するウェーブサウンドインスタンスの数です。
416         int waveTrackMax;       //!< 確保するウェーブサウンドトラックの数です。
417     };
418 
419     //---------------------------------------------------------------------------
420     //! :private
421     //!
422     //! @brief    ファイルの設定情報の構造体です。
423     //!
424     //!           サウンドアーカイブで定義されている、
425     //!           ファイルの情報を取得するための構造体です。
426     //!
427     //! @see detail_ReadFileInfo
428     //!
429     //! @date 2010/01/15 初版
430     //---------------------------------------------------------------------------
431     struct FileInfo
432     {
433         u32 fileSize;
434         u32 offsetFromFileBlockHead;
435         const char* externalFilePath;
436 
FileInfoFileInfo437         FileInfo()
438         : fileSize( 0xffffffff ),
439           offsetFromFileBlockHead( 0xffffffff ),
440           externalFilePath( NULL )
441         {}
442     };
443 
444     //----------------------------------------
445     //! @name コンストラクタ / デストラクタ
446     //@{
447   protected:
448     //---------------------------------------------------------------------------
449     //! @brief    コンストラクタです。
450     //!
451     //! @date 2010/01/15 初版
452     //---------------------------------------------------------------------------
453     SoundArchive();
454 
455   public:
456     //---------------------------------------------------------------------------
457     //! @brief    デストラクタです。
458     //!
459     //! @date 2010/01/15 初版
460     //---------------------------------------------------------------------------
461     virtual ~SoundArchive();
462 
463     //@}
464 
465   public:
466     //----------------------------------------
467     //! @name 状態取得
468     //@{
469     //---------------------------------------------------------------------------
470     //! @brief    サウンドアーカイブ中のデータが利用可能な状態か調べます。
471     //!
472     //! @return   サウンドアーカイブ中のデータが利用可能な状態なら true を、
473     //!           そうでなければ false を返します。
474     //!
475     //! @date 2010/11/12 誤植修正 (サウンドアーカイブ中のの→サウンドアーカイブ中の)
476     //! @date 2010/01/15 初版
477     //---------------------------------------------------------------------------
478     bool IsAvailable() const;
479     //@}
480 
481     //----------------------------------------
482     //! @name ID / ラベル文字列
483     //@{
484     //---------------------------------------------------------------------------
485     //! @brief    サウンドアーカイブ中のサウンドの個数を取得します。
486     //!
487     //! @return   サウンドアーカイブ中のサウンドの個数を返します。
488     //!
489     //! @date 2010/01/15 初版
490     //---------------------------------------------------------------------------
491     u32 GetSoundCount() const;
492 
493     //---------------------------------------------------------------------------
494     //! @brief    サウンドアーカイブ中のグループの個数を取得します。
495     //!
496     //! @return   サウンドアーカイブ中のグループの個数を返します。
497     //!
498     //! @date 2010/01/15 初版
499     //---------------------------------------------------------------------------
500     u32 GetGroupCount() const;
501 
502     //---------------------------------------------------------------------------
503     //! @brief    サウンドアーカイブ中のプレイヤーの個数を取得します。
504     //!
505     //! @return   サウンドアーカイブ中のプレイヤーの個数を返します。
506     //!
507     //! @date 2010/01/15 初版
508     //---------------------------------------------------------------------------
509     u32 GetPlayerCount() const;
510 
511     //---------------------------------------------------------------------------
512     //! :private
513     //!
514     //! @brief    サウンドアーカイブ中のウェーブサウンドセット・
515     //!           シーケンスサウンドセットの個数を取得します。
516     //!
517     //! @return   サウンドアーカイブ中のウェーブサウンドセット・
518     //!           シーケンスサウンドセットの個数を返します。
519     //!
520     //! @date 2010/01/15 初版
521     //---------------------------------------------------------------------------
522     u32 GetSoundGroupCount() const;
523 
524     //---------------------------------------------------------------------------
525     //! @brief    サウンドアーカイブ中のバンクの個数を取得します。
526     //!
527     //! @return   サウンドアーカイブ中のバンクの個数を返します。
528     //!
529     //! @date 2010/01/15 初版
530     //---------------------------------------------------------------------------
531     u32 GetBankCount() const;
532 
533     //---------------------------------------------------------------------------
534     //! @brief    サウンドアーカイブ中の波形アーカイブの個数を取得します。
535     //!
536     //! @return   サウンドアーカイブ中の波形アーカイブの個数を返します。
537     //!
538     //! @date 2010/01/15 初版
539     //---------------------------------------------------------------------------
540     u32 GetWaveArchiveCount() const;
541 
542     //---------------------------------------------------------------------------
543     //! :private
544     //!
545     //! @brief    サウンドアーカイブ中のファイルの個数を取得します。
546     //!
547     //! @return   サウンドアーカイブ中のファイルの個数を返します。
548     //!
549     //! @date 2010/01/15 初版
550     //---------------------------------------------------------------------------
551     u32 detail_GetFileCount() const;
552 
553     //---------------------------------------------------------------------------
554     //! @brief  アイテム ID から、対応するラベル文字列を取得します。
555     //!
556     //!         指定したアイテム ID が存在しない場合は、NULL を返します。
557     //!
558     //!         @ref MemorySoundArchive、@ref RomSoundArchive 問わず、
559     //!         文字列情報を利用する場合は、
560     //!         サウンドアーカイブファイルに文字列テーブルが含まれている必要があります。
561     //!
562     //!         サウンドアーカイブファイルに文字列テーブルを含めるには、
563     //!         SoundMaker の [プロジェクト設定] - [サウンドアーカイブ] タブ -
564     //!         [文字列テーブルを出力する] にチェックをつけておいてください。
565     //!
566     //!         @ref RomSoundArchive 使用時は、あらかじめ
567     //!         @ref RomSoundArchive::LoadLabelStringData でラベル文字列データを
568     //!         ロードしておく必要があります。
569     //!         文字列データをロードしていない無い場合は、NULL を返します。
570     //!
571     //!         @ref MemorySoundArchive に文字列テーブルが含まれていない場合は、
572     //!         NULL を返します。
573     //!
574     //! @param[in]    id      サウンドアーカイブ内のアイテム ID です。
575     //!
576     //! @return   指定した ID に対応したラベル文字列を返します。
577     //!
578     //! @see ItemId
579     //! @see GetItemId
580     //! @see RomSoundArchive::LoadLabelStringData
581     //!
582     //! @date 2010/09/21 存在しない ID やラベル文字列が含まれていない場合など、NULL を返す旨追記
583     //! @date 2010/06/25 サウンドアーカイブの文字列テーブルに関する記述を追加
584     //! @date 2010/01/15 初版
585     //---------------------------------------------------------------------------
586     const char* GetItemLabel( ItemId id ) const;
587 
588     //---------------------------------------------------------------------------
589     //! @brief  ラベル文字列から、対応するアイテム ID に変換します。
590     //!
591     //!         指定したラベル文字列が存在しない場合は、
592     //!         @ref INVALID_ID を返します。
593     //!
594     //!         @ref MemorySoundArchive、@ref RomSoundArchive 問わず、
595     //!         文字列情報を利用する場合は、
596     //!         サウンドアーカイブファイルに文字列テーブルが含まれている必要があります。
597     //!
598     //!         サウンドアーカイブファイルに文字列テーブルを含めるには、
599     //!         SoundMaker の [プロジェクト設定] - [サウンドアーカイブ] タブ -
600     //!         [文字列テーブルを出力する] にチェックをつけておいてください。
601     //!
602     //!         @ref RomSoundArchive 使用時は、あらかじめ
603     //!         @ref RomSoundArchive::LoadLabelStringData でラベル文字列データを
604     //!         ロードしておく必要があります。
605     //!
606     //! @param[in]    pLabel  ラベル文字列です。
607     //!
608     //! @return   指定したラベル文字列に対応したアイテム ID を返します。
609     //!
610     //! @see GetItemLabel
611     //! @see RomSoundArchive::LoadLabelStringData
612     //!
613     //! @date 2010/06/25 サウンドアーカイブの文字列テーブルに関する記述を追加
614     //! @date 2010/01/15 初版
615     //---------------------------------------------------------------------------
616     ItemId GetItemId( const char* pLabel ) const;
617 
618     //---------------------------------------------------------------------------
619     //! @brief    アイテム ID から、対応するファイル ID を取得します。
620     //!
621     //! @param[in]    id      サウンドアーカイブ内のアイテム ID です。
622     //!
623     //! @return   指定したアイテム ID に対応したファイル ID を返します。
624     //!
625     //! @see FileId
626     //! @see ItemId
627     //!
628     //! @date 2010/01/15 初版
629     //---------------------------------------------------------------------------
630     FileId GetItemFileId( ItemId id ) const;
631 
632     //---------------------------------------------------------------------------
633     //! @brief      サウンドの通し番号をサウンド ID に変換します。
634     //!
635     //!             index に 0 以上 @ref GetSoundCount 未満の値を渡すと、
636     //!             全サウンドの ID を取得することができます。
637     //!
638     //!             最大値は範囲チェックされませんので、
639     //!             取得値を利用する場合は、アプリケーション側で注意してください。
640     //!
641     //! @param[in]  index   サウンドの通し番号です。
642     //!
643     //! @return     通し番号に対応したサウンド ID を返します。
644     //!
645     //! @see ItemId
646     //!
647     //! @date 2010/08/30 初版
648     //---------------------------------------------------------------------------
GetSoundIdFromIndex(u32 index)649     static ItemId GetSoundIdFromIndex( u32 index )
650     {
651         return internal::Util::GetMaskedItemId( index, internal::ItemType_Sound );
652     }
653     //---------------------------------------------------------------------------
654     //! :private
655     //!
656     //! @brief      サウンドグループ (ウェーブサウンドセット、シーケンスサウンドセット)
657     //!             の通し番号をサウンド ID に変換します。
658     //!
659     //!             index に 0 以上 @ref GetSoundGroupCount 未満の値を渡すと、
660     //!             全サウンドグループの ID を取得することができます。
661     //!
662     //!             最大値は範囲チェックされませんので、
663     //!             取得値を利用する場合は、アプリケーション側で注意してください。
664     //!
665     //! @param[in]  index   サウンドグループの通し番号です。
666     //!
667     //! @return     通し番号に対応したサウンドグループ ID を返します。
668     //!
669     //! @see ItemId
670     //! @see GetSoundGroupCount
671     //!
672     //! @date 2010/08/30 初版
673     //---------------------------------------------------------------------------
GetSoundGroupIdFromIndex(u32 index)674     static ItemId GetSoundGroupIdFromIndex( u32 index )
675     {
676         return internal::Util::GetMaskedItemId( index, internal::ItemType_SoundGroup );
677     }
678     //---------------------------------------------------------------------------
679     //! @brief      バンクの通し番号をバンク ID に変換します。
680     //!
681     //!             index に 0 以上 @ref GetBankCount 未満の値を渡すと、
682     //!             全バンクの ID を取得することができます。
683     //!
684     //!             最大値は範囲チェックされませんので、
685     //!             取得値を利用する場合は、アプリケーション側で注意してください。
686     //!
687     //! @param[in]  index   バンクの通し番号です。
688     //!
689     //! @return     通し番号に対応したバンク ID を返します。
690     //!
691     //! @see ItemId
692     //! @see GetBankCount
693     //!
694     //! @date 2010/08/30 初版
695     //---------------------------------------------------------------------------
GetBankIdFromIndex(u32 index)696     static ItemId GetBankIdFromIndex( u32 index )
697     {
698         return internal::Util::GetMaskedItemId( index, internal::ItemType_Bank );
699     }
700     //---------------------------------------------------------------------------
701     //! @brief      プレイヤーの通し番号をプレイヤー ID に変換します。
702     //!
703     //!             index に 0 以上 @ref GetPlayerCount 未満の値を渡すと、
704     //!             全プレイヤーの ID を取得することができます。
705     //!
706     //!             最大値は範囲チェックされませんので、
707     //!             取得値を利用する場合は、アプリケーション側で注意してください。
708     //!
709     //! @param[in]  index   プレイヤーの通し番号です。
710     //!
711     //! @return     通し番号に対応したプレイヤー ID を返します。
712     //!
713     //! @see ItemId
714     //! @see GetPlayerCount
715     //!
716     //! @date 2010/08/30 初版
717     //---------------------------------------------------------------------------
GetPlayerIdFromIndex(u32 index)718     static ItemId GetPlayerIdFromIndex( u32 index )
719     {
720         return internal::Util::GetMaskedItemId( index, internal::ItemType_Player );
721     }
722     //---------------------------------------------------------------------------
723     //! @brief      波形アーカイブの通し番号を波形アーカイブ ID に変換します。
724     //!
725     //!             index に 0 以上 @ref GetWaveArchiveCount 未満の値を渡すと、
726     //!             全波形アーカイブの ID を取得することができます。
727     //!
728     //!             最大値は範囲チェックされませんので、
729     //!             取得値を利用する場合は、アプリケーション側で注意してください。
730     //!
731     //! @param[in]  index   波形アーカイブの通し番号です。
732     //!
733     //! @return     通し番号に対応した波形アーカイブ ID を返します。
734     //!
735     //! @see ItemId
736     //! @see GetWaveArchiveCount
737     //!
738     //! @date 2010/08/30 初版
739     //---------------------------------------------------------------------------
GetWaveArchiveIdFromIndex(u32 index)740     static ItemId GetWaveArchiveIdFromIndex( u32 index )
741     {
742         return internal::Util::GetMaskedItemId( index, internal::ItemType_WaveArchive );
743     }
744     //---------------------------------------------------------------------------
745     //! @brief      グループの通し番号をグループ ID に変換します。
746     //!
747     //!             index に 0 以上 @ref GetGroupCount 未満の値を渡すと、
748     //!             全グループの ID を取得することができます。
749     //!
750     //!             最大値は範囲チェックされませんので、
751     //!             取得値を利用する場合は、アプリケーション側で注意してください。
752     //!
753     //! @param[in]  index   グループの通し番号です。
754     //!
755     //! @return     通し番号に対応したグループ ID を返します。
756     //!
757     //! @see ItemId
758     //! @see GetGroupCount
759     //!
760     //! @date 2010/08/30 初版
761     //---------------------------------------------------------------------------
GetGroupIdFromIndex(u32 index)762     static ItemId GetGroupIdFromIndex( u32 index )
763     {
764         return internal::Util::GetMaskedItemId( index, internal::ItemType_Group );
765     }
766     //@}
767 
768 
769     //----------------------------------------
770     //! @name 情報取得
771     //@{
772     //---------------------------------------------------------------------------
773     //! @brief    指定した ID のサウンドのユーザーパラメータを取得します。
774     //!
775     //!           指定した ID のサウンドが存在しない場合は、
776     //!           0 を返します。
777     //!
778     //! @param[in]    soundId     サウンドアーカイブ内のサウンド ID です。
779     //!
780     //! @return   サウンドのユーザーパラメータを返します。
781     //!
782     //! @see      ItemId
783     //!
784     //! @date 2010/01/18 初版
785     //---------------------------------------------------------------------------
786     u32 GetSoundUserParam( ItemId soundId ) const;
787 
788     //---------------------------------------------------------------------------
789     //! @brief    指定した ID のサウンドの種類を取得します。
790     //!
791     //!           指定した ID のサウンドが存在しない場合は、
792     //!           @ref SOUND_TYPE_INVALID を返します。
793     //!
794     //! @param[in]    soundId     サウンドアーカイブ内のサウンド ID です。
795     //!
796     //! @return   サウンドの種類を返します。
797     //!
798     //! @see SoundType
799     //! @see ItemId
800     //!
801     //! @date 2010/01/15 初版
802     //---------------------------------------------------------------------------
803     SoundType GetSoundType( ItemId soundId ) const;
804 
805     //---------------------------------------------------------------------------
806     //! @brief    指定した ID のサウンドの情報を取得します。
807     //!
808     //!           指定した ID のサウンドが存在しない場合は読み取りは失敗します。
809     //!
810     //! @param[in]    soundId     サウンドアーカイブ内のサウンド ID です。
811     //! @param[out]   info        サウンド情報を取得するための構造体です。
812     //!
813     //! @return   サウンド情報の取得に成功したら true を、失敗したら false を返します。
814     //!
815     //! @see ItemId
816     //! @see SoundInfo
817     //!
818     //! @date 2010/01/15 初版
819     //---------------------------------------------------------------------------
820     bool ReadSoundInfo( ItemId soundId, SoundInfo* info ) const;
821 
822     //---------------------------------------------------------------------------
823     //! @brief    指定した ID のシーケンスサウンドの情報を取得します。
824     //!
825     //!           指定した ID のシーケンスサウンドが存在しない場合は読み取りは失敗します。
826     //!
827     //! @param[in]    soundId     サウンドアーカイブ内のサウンド ID です。
828     //! @param[out]   info        シーケンスサウンド情報を取得するための構造体です。
829     //!
830     //! @return   シーケンスサウンド情報の取得に成功したら true を、失敗したら false を返します。
831     //!
832     //! @see ItemId
833     //! @see SequenceSoundInfo
834     //!
835     //! @date 2010/01/15 初版
836     //---------------------------------------------------------------------------
837     bool ReadSequenceSoundInfo( ItemId soundId, SequenceSoundInfo* info ) const;
838 
839     //---------------------------------------------------------------------------
840     //! @brief    指定した ID のバンクの情報を取得します。
841     //!
842     //!           指定した ID のバンクが存在しない場合は読み取りは失敗します。
843     //!
844     //! @param[in]    bankId      サウンドアーカイブ内のバンク ID です。
845     //! @param[out]   info        バンク情報を取得するための構造体です。
846     //!
847     //! @return   バンク情報の取得に成功したら true を、失敗したら false を返します。
848     //!
849     //! @see ItemId
850     //! @see PlayerInfo
851     //!
852     //! @date 2010/01/15 初版
853     //---------------------------------------------------------------------------
854     bool ReadBankInfo( ItemId bankId, BankInfo* info ) const;
855 
856     //---------------------------------------------------------------------------
857     //! @brief    指定した ID のプレイヤーの情報を取得します。
858     //!
859     //!           指定した ID のプレイヤーが存在しない場合は読み取りは失敗します。
860     //!
861     //! @param[in]    playerId    サウンドアーカイブ内のプレイヤー ID です。
862     //! @param[out]   info        プレイヤー情報を取得するための構造体です。
863     //!
864     //! @return   プレイヤー情報の取得に成功したら true を、失敗したら false を返します。
865     //!
866     //! @see ItemId
867     //! @see PlayerInfo
868     //!
869     //! @date 2010/01/15 初版
870     //---------------------------------------------------------------------------
871     bool ReadPlayerInfo( ItemId playerId, PlayerInfo* info ) const;
872 
873     //---------------------------------------------------------------------------
874     //! @brief    サウンドアーカイブプレイヤーの情報を取得します。
875     //!
876     //! @param[out]   info    サウンドアーカイブプレイヤー情報を取得するための構造体です。
877     //!
878     //! @return   サウンドアーカイブプレイヤー情報の取得に成功したら true を、
879     //!           失敗したら false を返します。
880     //!
881     //! @see SoundArchivePlayerInfo
882     //!
883     //! @date 2010/01/15 初版
884     //---------------------------------------------------------------------------
885     bool ReadSoundArchivePlayerInfo( SoundArchivePlayerInfo* info ) const;
886 
887     //! @details :private
888     bool detail_ReadStreamSoundInfo( ItemId soundId, StreamSoundInfo* info ) const;
889 
890     //! @details :private
891     bool detail_ReadWaveSoundInfo( ItemId soundId, WaveSoundInfo* info ) const;
892 
893     //---------------------------------------------------------------------------
894     //! @brief    指定した ID の 3D サウンド情報を取得します。
895     //!
896     //!           指定した ID のサウンドが存在しない場合は読み取りに失敗します。
897     //!
898     //! @param[in]    soundId サウンドアーカイブ内のサウンド ID です。
899     //! @param[out]   info    サウンドアーカイブプレイヤー情報を取得するための構造体です。
900     //!
901     //! @return   3D サウンド情報の取得に成功したら true を、
902     //!           失敗したら false を返します。
903     //!
904     //! @see Sound3DInfo
905     //!
906     //! @date 2010/03/05 初版
907     //---------------------------------------------------------------------------
908     bool ReadSound3DInfo( ItemId soundId, Sound3DInfo* info ) const;
909 
910     //! @details :private
911     bool ReadWaveArchiveInfo( ItemId warcId, WaveArchiveInfo* info ) const;
912 
913     //! @details :private
914     bool detail_ReadSoundGroupInfo( ItemId groupId, SoundGroupInfo* info ) const;
915 
916     //! @details :private
917     bool detail_ReadGroupInfo( ItemId groupId, GroupInfo* info ) const;
918 
919     //! @details :private
920     bool detail_ReadFileInfo( FileId fileId, FileInfo* info ) const;
921 
922     //! @details :private
923     // TODO: bool detail_ReadGroupItemInfo( GroupId groupId, unsigned long index, GroupItemInfo* info ) const;
924 
925     //! @details :private
926     // TODO: bool detail_ReadFilePos( FileId fileId, unsigned long index, FilePos* filePos ) const;
927     const internal::Util::Table<u32>* detail_GetWaveArchiveIdTable( ItemId id ) const;
928 
929     // ファイルアクセス
930     //! @details :private
931     virtual const void* detail_GetFileAddress( FileId fileId ) const = 0;
932     //! @details :private
933     virtual size_t detail_GetRequiredStreamBufferSize() const = 0;
934 
935     /* MEMO: NW4R では const がついていたが、CTR では nn::fs::FileReader を内部で使っているため
936              const をはずした */
937     //! @details :private
938     io::FileStream* detail_OpenFileStream( FileId fileId, void* buffer, int size );
939 #if 0 // たぶん不要
940     io::FileStream* detail_OpenFileWaveDataStream( FileId fileId, void* buffer, int size ) const;
941     io::FileStream* detail_OpenGroupStream( GroupId groupId, void* buffer, int size ) const;
942     io::FileStream* detail_OpenGroupWaveDataStream( GroupId groupId, void* buffer, int size ) const;
943 #endif
944     //@}
945 
946     //----------------------------------------
947     //! @name ファイルパス
948     //@{
949     //---------------------------------------------------------------------------
950     //! @brief    外部参照ファイルのルートディレクトリを設定します。
951     //!
952     //!           サウンドアーカイブの外部参照ファイルのファイルパスが、
953     //!           相対パスで記述されている場合には、
954     //!           この関数で設定したルートディレクトリからの相対パスとして解釈されます。
955     //!
956     //!           初期状態はルートディレクトリに設定されています。
957     //!
958     //!           この関数は @ref nw::snd::RomSoundArchive::Open から呼び出されています。
959     //!
960     //! @param[in] extFileRoot    ルートディレクトリに設定するディレクトリパスです。
961     //!
962     //! @see nw::snd::RomSoundArchive::Open
963     //!
964     //! @date 2010/01/29 初版
965     //---------------------------------------------------------------------------
966     void SetExternalFileRoot( const char* extFileRoot );
967     //@}
968 
969   protected:
970     //! @details :private
971     static const int FILE_PATH_MAX  = 256;
972 
973     //! @details :private
974     void Initialize( internal::SoundArchiveFileReader* fileReader );
975 
976     //! @details :private
977     void Finalize();
978 
979     //! @details :private
980     virtual io::FileStream* OpenStream(
981         void* buffer,
982         int size,
983         u32 begin,
984         u32 length
985     ) = 0;
986 
987     //! @details :private
988     virtual io::FileStream* OpenExtStream(
989         void* buffer,
990         int size,
991         const char* extFilePath,
992         // const wchar_t* extFilePath,
993         u32 begin,
994         u32 length
995     ) const = 0;
996 
997   private:
998     io::FileStream* OpenExtStreamImpl(
999         void* buffer,
1000         int size,
1001         const char* extFilePath,
1002         // const wchar_t* extFilePath,
1003         u32 begin,
1004         u32 length
1005     ) const;
1006 
1007     internal::SoundArchiveFileReader* m_pFileReader;
1008     char m_ExtFileRoot[ FILE_PATH_MAX ];
1009 
1010     // キャッシュ (頻繁にアクセスする)
1011     u32 m_FileBlockOffset;
1012 };
1013 
1014 } // namespace nw::snd
1015 } // namespace nw
1016 
1017 
1018 #endif /* NW_SND_SOUND_ARCHIVE_H_ */
1019 
1020