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