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