1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_RomSoundArchive.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: 21429 $
14  *---------------------------------------------------------------------------*/
15 
16 /**
17  * :include nw/snd/snd_RomSoundArchive.h
18  *
19  * @file snd_RomSoundArchive.h
20  */
21 
22 #ifndef NW_SND_ROM_SOUND_ARCHIVE_H_
23 #define NW_SND_ROM_SOUND_ARCHIVE_H_
24 
25 #include <nw/snd/snd_SoundArchive.h>
26 #include <nw/snd/snd_SoundArchiveFileReader.h>
27 #include <nw/io/io_RomFileStream.h>
28 
29 namespace nw {
30 namespace snd {
31 
32 //---------------------------------------------------------------------------
33 //! @brief        ROM 上にあるサウンドアーカイブを扱うクラスです。
34 //!
35 //! @see SoundArchive クラス
36 //!
37 //! @date 2010/01/15 初版
38 //---------------------------------------------------------------------------
39 class RomSoundArchive : public SoundArchive
40 {
41   private:
42     class RomFileStream;
43 
44   public:
45     //----------------------------------------
46     //! @name コンストラクタ / デストラクタ
47     //@{
48     //---------------------------------------------------------------------------
49     //! @brief    コンストラクタです。
50     //!
51     //! @date 2010/01/15 初版
52     //---------------------------------------------------------------------------
53     RomSoundArchive();
54 
55     //---------------------------------------------------------------------------
56     //! @brief    デストラクタです。
57     //!
58     //! @date 2010/01/15 初版
59     //---------------------------------------------------------------------------
60     virtual ~RomSoundArchive();
61     //@}
62 
63     //----------------------------------------
64     //! @name オープン / クローズ
65     //@{
66     //---------------------------------------------------------------------------
67     //! @brief    ROM 上のサウンドアーカイブファイルを開きます。
68     //!
69     //!           開いたサウンドアーカイブを使用するためには、@ref LoadHeader
70     //!           を呼び出してサウンドアーカイブのヘッダを読み込まなければなりません。
71     //!
72     //! @param[in]    filePath    ファイルの ROM ファイルシステム上のパス。
73     //!
74     //! @return   ファイルを開くのに成功したら true を、
75     //!           失敗したら false を返します。
76     //!
77     //! @see Close
78     //! @see LoadHeader
79     //!
80     //! @date 2010/01/15 初版
81     //---------------------------------------------------------------------------
82     bool Open( const char* filePath );
83     // TODO: ドキュメント残り。どうするか決める必要がある。
84     // ファイルパスを指定して開く場合は、内部で @ref SoundArchive::SetExternalFileRoot
85     // を呼び出し、サウンドアーカイブファイルがあるディレクトリを設定します。
86     //
87     // 関数内部でDVDRead関数を呼び出しています。このためディスクが挿入されていないと、
88     // 正しいディスクが挿入されるまで、関数から返ってこなくなります。
89     // DVDに関するエラーメッセージを表示するためには、
90     // この関数を呼び出したスレッドとは別のスレッドで DVDGetDriveStatus関数を呼び出し、
91     // ディスクドライブの状態を監視しなければなりません。
92     // @see      @ref SetExternalFileRoot
93 
94     //---------------------------------------------------------------------------
95     //! @brief    ROM 上のサウンドアーカイブファイルを閉じます。
96     //!
97     //! @see Open
98     //!
99     //! @date 2010/01/15 初版
100     //---------------------------------------------------------------------------
101     void Close();
102     //@}
103 
104     //----------------------------------------
105     //! @name ヘッダ
106     //@{
107     //---------------------------------------------------------------------------
108     //! @brief    サウンドアーカイブのヘッダのサイズを取得します。
109     //!
110     //! @return   ヘッダのサイズを返します。
111     //!
112     //! @see LoadHeader
113     //!
114     //! @date 2010/01/15 初版
115     //---------------------------------------------------------------------------
GetHeaderSize()116     size_t GetHeaderSize() const { return m_ArchiveReader.GetInfoBlockSize(); }
117 
118     //---------------------------------------------------------------------------
119     //! @brief    サウンドアーカイブのヘッダをロードします。
120     //!
121     //!           サウンドアーカイブからの情報の取得やサウンドデータのロードを行う前に、
122     //!           この関数を呼びだしてヘッダをロードしておく必要があります。
123     //!
124     //!           ヘッダのロードに必要なメモリのサイズは、
125     //!           @ref GetHeaderSize で取得することができます。
126     //!
127     //! @param[out]   buffer      ヘッダをロードするバッファへのポインタ。
128     //! @param[in]    size        バッファのサイズ。
129     //!
130     //! @return   ヘッダのロードに成功したら true を、失敗したら false を返します。
131     //!
132     //! @see Open
133     //!
134     //! @date 2010/01/15 初版
135     //---------------------------------------------------------------------------
136     bool LoadHeader( void* buffer, unsigned long size );
137     // TODO: ドキュメント残り。
138     // 関数内部でDVDRead関数を呼び出しています。
139     // このためディスクが挿入されていないと、 正しいディスクが挿入されるまで、
140     // 関数から返ってこなくなります。
141     // DVDに関するエラーメッセージを表示するためには、
142     // この関数を呼び出したスレッドとは別のスレッドで DVDGetDriveStatus関数を呼び出し、
143     // ディスクドライブの状態を監視しなければなりません。
144     //@}
145 
146     //----------------------------------------
147     //! @name ラベル文字列データ
148     //@{
149     //---------------------------------------------------------------------------
150     //! @brief    サウンドアーカイブ中のラベル文字列データのサイズを取得します。
151     //!
152     //! @return   ラベル文字列データのサイズを返します。
153     //!
154     //! @see LoadLabelStringData
155     //!
156     //! @date 2010/01/15 初版
157     //---------------------------------------------------------------------------
GetLabelStringDataSize()158     size_t GetLabelStringDataSize() const { return m_ArchiveReader.GetStringBlockSize(); }
159 
160     //---------------------------------------------------------------------------
161     //! @brief  サウンドアーカイブ中のラベル文字列データをロードします。
162     //!
163     //!         サウンドアーカイブに含まれるリソースにラベル文字列でアクセスするためには、
164     //!         ラベル文字列データをロードしておく必要があります。
165     //!
166     //!         ラベル文字列データのロードに必要なメモリのサイズは、
167     //!         @ref GetLabelStringDataSize で取得することができます。
168     //!
169     //!         サウンドアーカイブファイル (.bcsar) に文字列テーブルが含まれていないと、
170     //!         失敗します。その場合は、SoundMaker の [プロジェクト設定]
171     //!         - [サウンドアーカイブ] タブ - [文字列テーブルを出力する]
172     //!         にチェックがついているかどうかご確認ください。
173     //!
174     //! @param[out]   buffer      ラベル文字列をロードするバッファへのポインタ。
175     //! @param[in]    size        バッファのサイズ。
176     //!
177     //! @return   ラベル文字列のロードに成功したら true を、失敗したら false を返します。
178     //!
179     //! @see Open
180     //!
181     //! @date 2010/06/25 サウンドアーカイブの文字列テーブルに関する記述を追加
182     //! @date 2010/01/15 初版
183     //---------------------------------------------------------------------------
184     bool LoadLabelStringData( void* buffer, unsigned long size );
185     // TODO:
186     // 関数内部でDVDRead関数を呼び出しています。このためディスクが挿入されていないと、
187     // 正しいディスクが挿入されるまで、関数から返ってこなくなります。
188     // DVDに関するエラーメッセージを表示するためには、
189     // この関数を呼び出したスレッドとは別のスレッドで DVDGetDriveStatus関数を呼び出し、
190     // ディスクドライブの状態を監視しなければなりません。
191     //@}
192 
193     //! @details :private
194     virtual size_t detail_GetRequiredStreamBufferSize() const;
195 
196     //! @details :private
detail_GetFileAddress(FileId fileId)197     virtual const void* detail_GetFileAddress( FileId fileId ) const
198     {
199         NW_UNUSED_VARIABLE( fileId );
200         return NULL;    // NOTE: MemorySoundArchive なら非 NULL 値を返しうる
201     }
202 
203   protected:
204     //! @details :private
205     virtual io::FileStream* OpenStream(
206             void* buffer,
207             int size,
208             u32 begin,
209             u32 length );
210 
211     //! @details :private
212     virtual io::FileStream* OpenExtStream(
213             void* buffer,
214             int size,
215             const char* extFilePath,
216             // const wchar_t* extFilePath,
217             u32 begin,
218             u32 length ) const;
219 
220   private:
221     bool LoadFileHeader();
222 
223     internal::SoundArchiveFileReader m_ArchiveReader;
224 #ifdef NW_PLATFORM_CTRWIN
225     nn::fs::File m_FileInfo;
226 #else
227     nn::fs::FileReader m_FileReader;
228 #endif
229     bool m_IsOpened;
230 };
231 
232 //! @details :private
233 class RomSoundArchive::RomFileStream : public io::RomFileStream
234 {
235   public:
236     RomFileStream( const char* path, u32 offset, u32 size );
237     // RomFileStream( const wchar_t* path, u32 offset, u32 size );
238 #ifdef NW_PLATFORM_CTRWIN
239     RomFileStream( const nn::fs::File* fileInfo, u32 offset, u32 size );
240 #else
241     RomFileStream( nn::fs::FileReader* fileReader, u32 offset, u32 size );
242 #endif
243 
244     virtual s32  Read( void* buf, u32 length );
245     virtual void Seek( s32 offset, u32 origin );
Tell()246     virtual u32  Tell()    const { return io::RomFileStream::Tell() - m_Offset; }
GetSize()247     virtual u32  GetSize() const { return m_Size; }
248 
249   private:
250     s32 m_Offset;
251     u32 m_Size;
252 };
253 
254 } // namespace nw::snd
255 } // namespace nw
256 
257 
258 #endif /* NW_SND_ROM_SOUND_ARCHIVE_H_ */
259 
260