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