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