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