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