1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: snd_SoundDataManager.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: 29444 $ 14 *---------------------------------------------------------------------------*/ 15 16 /** 17 * :include nw/snd/snd_SoundDataManager.h 18 * 19 * @file snd_SoundDataManager.h 20 */ 21 22 #ifndef NW_SND_SOUND_DATA_MANAGER_H_ 23 #define NW_SND_SOUND_DATA_MANAGER_H_ 24 25 #include <nw/snd/snd_DisposeCallback.h> 26 #include <nw/snd/snd_SoundArchive.h> 27 #include <nw/snd/snd_SoundArchiveLoader.h> 28 #include <nw/snd/snd_Util.h> 29 30 namespace nw { 31 namespace snd { 32 33 class SoundMemoryAllocatable; 34 35 namespace internal 36 { 37 38 //! @details :private 39 class SoundFileManager 40 { 41 public: 42 virtual const void* GetFileAddress( SoundArchive::FileId fileId ) const = 0; 43 virtual const void* GetFileWaveDataAddress( SoundArchive::FileId fileId ) const = 0; 44 }; 45 46 } // namespace nw::snd::internal 47 48 //--------------------------------------------------------------------------- 49 //! @brief サウンドアーカイブのデータをロードするためのクラスです。 50 //! 51 //! @see SoundArchivePlayer クラス 52 //! 53 //! @date 2010/12/28 NW4C-1.3.0 にて全体的にリファレンスがおかしかったのを修正 54 //! @date 2010/11/12 SetFileAddress 関数を追加 55 //! @date 2010/04/09 IsDataLoaded 関数を追加 56 //! @date 2010/02/01 「参照」に SoundArchivePlayer クラス追加 57 //! @date 2010/01/15 初版 58 //--------------------------------------------------------------------------- 59 class SoundDataManager : public internal::driver::DisposeCallback, 60 public internal::SoundArchiveLoader 61 { 62 public: 63 64 //! @name コンストラクタ / デストラクタ 65 //@{ 66 //--------------------------------------------------------------------------- 67 //! @brief コンストラクタです。 68 //! 69 //! @date 2010/01/15 初版 70 //--------------------------------------------------------------------------- 71 SoundDataManager(); 72 73 //--------------------------------------------------------------------------- 74 //! @brief デストラクタです。 75 //! 76 //! @date 2010/01/15 初版 77 //--------------------------------------------------------------------------- 78 virtual ~SoundDataManager(); 79 //@} 80 81 //---------------------------------------- 82 //! @name 初期化 83 //@{ 84 //--------------------------------------------------------------------------- 85 //! @brief 初期化に必要なメモリのサイズを取得します。 86 //! 87 //! @param[in] arc このサウンドデータマネージャを登録するプレイヤーで 88 //! 使用するサウンドアーカイブです。 89 //! 90 //! @return 初期化に必要なメモリのサイズを返します。 91 //! 92 //! @see Initialize 93 //! 94 //! @date 参照から SoundArchivePlayer::Initialize を削除 95 //! @date 2010/02/01 関数名変更 (Setup → Initialize) にともなう文言の調整 96 //! @date 2010/01/15 初版 97 //--------------------------------------------------------------------------- 98 size_t GetRequiredMemSize( const SoundArchive* arc ) const; 99 100 //--------------------------------------------------------------------------- 101 //! @brief サウンドデータマネージャの初期化を行います。 102 //! 103 //! サウンドデータマネージャを使用する前に初期化を行う必要があります。 104 //! 初期化を行うことにより、 105 //! サウンドデータマネージャがサウンドアーカイブと関連付けられ、 106 //! サウンドアーカイブプレイヤーに登録することができます。 107 //! 108 //! サウンドデータマネージャが必要とするメモリのサイズは 109 //! @ref GetRequiredMemSize で取得することができます。 110 //! 111 //! @param[in] arc このサウンドデータマネージャを登録するプレイヤーで 112 //! 使用するサウンドアーカイブです。 113 //! @param[out] buffer バッファへのポインタです。 114 //! 4 バイトアライメントされている必要があります。 115 //! @param[in] size バッファサイズです。 116 //! 117 //! @return 初期化に成功したら true を、失敗したら false を返します。 118 //! 119 //! @see GetRequiredMemSize 120 //! @see Finalize 121 //! 122 //! @date 2010/02/01 関数名変更 (Setup → Initialize) 123 //! @date 2010/01/15 初版 124 //--------------------------------------------------------------------------- 125 bool Initialize( const SoundArchive* arc, void* buffer, u32 size ); 126 127 //--------------------------------------------------------------------------- 128 //! @brief サウンドデータマネージャを破棄します。 129 //! 130 //! @see Initialize 131 //! 132 //! @date 2010/02/01 関数名変更 (Shutdown → Finalize) 133 //! @date 2010/01/15 初版 134 //--------------------------------------------------------------------------- 135 void Finalize(); 136 //@} 137 138 //---------------------------------------- 139 //! @name ロード 140 //@{ 141 //! @details :private detail_SetFileManager(internal::SoundFileManager * fileManager)142 void detail_SetFileManager( internal::SoundFileManager* fileManager ) 143 { 144 m_pFileManager = fileManager; 145 } 146 147 //--------------------------------------------------------------------------- 148 //! @brief 独自にロードしたデータを、ファイル管理テーブルに登録します。 149 //! 150 //! あらかじめ別のアドレスが登録されている場合は、 151 //! 上書きされます。 152 //! 153 //! 引数として渡すファイル ID は、 154 //! @ref SoundArchive::GetItemFileId 関数で、 155 //! アイテム ID から変換することができます。 156 //! 157 //! ファイル管理テーブルに登録することによって、 158 //! 当該データを使ったサウンド再生が可能になります。 159 //! 詳しくは demos/snd/externalFile デモ、 160 //! および当該デモのドキュメントをご覧ください。 161 //! 162 //! @param[in] fileId セットするデータのファイル ID です。 163 //! @param[in] address 関連するデータを確認するかを示すフラグです。 164 //! 165 //! @return あらかじめ登録されていたアドレスを返します。 166 //! 167 //! @see SoundArchive::GetItemFileId 168 //! 169 //! @date 2010/12/28 fileId 引数の説明を修正 170 //! @date 2010/12/17 SoundArchive::GetItemFileId 関数との関係を追記 171 //! @date 2010/11/12 初版 172 //--------------------------------------------------------------------------- 173 const void* SetFileAddress( SoundArchive::FileId fileId, const void* address ); 174 //@} 175 176 //! @details :private 177 const void* detail_GetFileAddress( SoundArchive::FileId fileId ) const; 178 179 //! @details :private 180 u32 detail_GetFileIdFromTable( const void* address ) const; 181 182 183 // 外部ロードしたサウンドデータを破棄する直前に呼び、データ・インスタンスを無効化する 184 //! @details :private 185 // void InvalidateSoundData( void* mem, size_t size ); 186 187 protected: 188 //! @details :private 189 virtual void InvalidateData( const void* start, const void* end ); 190 191 //! @details :private 192 virtual const void* SetFileAddressToTable( 193 SoundArchive::FileId fileId, const void* address ); 194 //! @details :private 195 virtual const void* GetFileAddressFromTable( SoundArchive::FileId fileId ) const; 196 197 //! @details :private 198 virtual const void* GetFileAddressImpl( SoundArchive::FileId fileId ) const; 199 // テーブルを含め、アクセス可能な箇所にデータが読み込まれているかを確認する 200 201 private: 202 struct FileAddress 203 { 204 const void* address; 205 }; 206 207 typedef internal::Util::Table<FileAddress> FileTable; 208 209 // const void* GetFileAddress( SoundArchive::FileId fileId ) const; 210 //! @details :private 211 bool CreateFileAddressTable( const SoundArchive* arc, void** buffer, void* endp ); 212 213 //! @details :private 214 FileTable* m_pFileTable; 215 216 //! @details :private 217 internal::SoundFileManager* m_pFileManager; 218 }; 219 220 } // namespace nw::snd 221 } // namespace nw 222 223 224 #endif /* NW_SND_SOUND_DATA_MANAGER_H_ */ 225 226