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