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