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