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