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