1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SoundHeap.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_SoundHeap.h
20  *
21  * @file snd_SoundHeap.h
22  */
23 
24 #ifndef NW_SND_SOUND_HEAP_H_
25 #define NW_SND_SOUND_HEAP_H_
26 
27 #include <nw/snd/snd_SoundMemoryAllocatable.h>
28 #include <nw/snd/snd_FrameHeap.h>
29 #include <nw/snd/snd_Util.h>
30 
31 namespace nw {
32 namespace snd {
33 
34 //---------------------------------------------------------------------------
35 //! @brief    サウンドデータ用のヒープクラスです。
36 //!
37 //!           サウンドヒープでは、
38 //!           メモリブロックが解放された時に呼び出されるコールバックを
39 //!           設定することができます。
40 //!           サウンドライブラリではこの機能を用いて、
41 //!           サウンドデータを含むメモリブロックが解放された時に、
42 //!           安全にデータを解放するための処理を行うように設計されています。
43 //!
44 //! @date 2009/12/28 初版
45 //---------------------------------------------------------------------------
46 class SoundHeap : public SoundMemoryAllocatable
47 {
48 public:
49     //---------------------------------------------------------------------------
50     //! @brief    メモリブロックが破棄された時に呼び出されるコールバックです。
51     //!
52     //!           コールバック関数は @ref SoundHeap::Alloc
53     //!           の引数としてメモリブロックに渡し、
54     //!           @ref SoundHeap::Clear または @ref SoundHeap::LoadState によって、
55     //!           メモリブロックが解放されたときに呼びだされます。
56     //!
57     //! @param[in]    mem         解放されたメモリブロックの先頭アドレスです。
58     //! @param[in]    size        解放されたメモリブロックのサイズです。
59     //! @param[in]    userArg     ユーザ引数です。
60     //!
61     //! @see Alloc
62     //! @see Clear
63     //! @see LoadState
64     //!
65     //! @date 2010/01/15 Alloc, Clear, LoadState 関数への参照を追加
66     //! @date 2010/01/14 初版
67     //---------------------------------------------------------------------------
68     typedef void (*DisposeCallback)( void* mem, unsigned long size, void* userArg );
69 
70 
71 public:
72     //----------------------------------------
73     //! @name コンストラクタ/デストラクタ
74     //@{
75     //---------------------------------------------------------------------------
76     //! @brief        コンストラクタです。
77     //!
78     //! @date 2009/12/28 初版
79     //---------------------------------------------------------------------------
80     SoundHeap();
81 
82     //---------------------------------------------------------------------------
83     //! @brief        デストラクタです。
84     //!
85     //! @date 2009/12/28 初版
86     //---------------------------------------------------------------------------
87     virtual ~SoundHeap();
88     //@}
89 
90     //----------------------------------------
91     //! @name ヒープ操作
92     //@{
93     //---------------------------------------------------------------------------
94     //! @brief        サウンドヒープを作成します。
95     //!
96     //!               メモリ領域のサイズ size が十分に無いと、関数は失敗します。
97     //!               ヒープの管理領域が必要なため、
98     //!               作成されたメモリのヒープサイズは size よりも小さくなります。
99     //!
100     //!               この関数に渡したメモリ領域を再利用するには、
101     //!               @ref nw::snd::SoundHeap::Destroy
102     //!               でヒープを破棄する必要があります。
103     //!
104     //!               波形データをロードする場合は、
105     //!               startAddress にはデバイスメモリのアドレスを指定する必要があります。
106     //!
107     //! @param[in]    startAddress    ヒープとして使用するメモリの先頭アドレス。
108     //! @param[in]    size            ヒープとして使用するメモリのサイズ。
109     //!
110     //! @return       ヒープの作成に成功したら true を、
111     //!               失敗したら false を返します。
112     //!
113     //! @date 2009/12/28 初版
114     //---------------------------------------------------------------------------
115     bool Create(
116         void* startAddress,
117         size_t size
118     );
119 
120     //---------------------------------------------------------------------------
121     //! @brief        サウンドヒープを破棄します。
122     //!
123     //!               確保済みのメモリブロックそれぞれに対して、
124     //!               @ref Alloc で設定したコールバック関数が呼び出されます。
125     //!
126     //! @date 2009/12/28 初版
127     //---------------------------------------------------------------------------
128     void Destroy();
129 
130     //---------------------------------------------------------------------------
131     //! @brief        サウンドヒープからメモリを確保します。
132     //!
133     //!               各メモリブロックには管理領域が必要になります。
134     //!               そのため、実際には確保するメモリサイズ size
135     //!               よりも少し大きな空き容量が必要になります。
136     //!               空き容量が足りない場合は、関数は失敗します。
137     //!
138     //! @param[in]    size            確保するメモリサイズ。
139     //!
140     //! @return       確保したメモリブロックの先頭アドレスを返します。
141     //!
142     //! @date 2009/12/28 初版
143     //---------------------------------------------------------------------------
144     virtual void* Alloc( size_t size );
145 
146     //---------------------------------------------------------------------------
147     //! @brief        サウンドヒープからメモリを確保します。
148     //!
149     //!               各メモリブロックには管理領域が必要になります。
150     //!               そのため、実際には確保するメモリサイズ size
151     //!               よりも少し大きな空き容量が必要になります。
152     //!               空き容量が足りない場合は、関数は失敗します。
153     //!
154     //!               コールバック関数 callback は、
155     //!               @ref Clear または @ref LoadState によって、
156     //!               メモリブロックが解放されたときに呼び出されます。
157     //!               コールバック関数が不要の時は、callback に NULL を入れます。
158     //!
159     //! @param[in]    size            確保するメモリサイズ。
160     //! @param[in]    callback        メモリブロックが解放されるときに呼び出される
161     //!                               コールバック関数。
162     //! @param[in]    callbackArg     コールバック関数の引数用のユーザーデータ。
163     //!
164     //! @return       確保したメモリブロックの先頭アドレスを返します。
165     //!
166     //! @date 2009/12/28 初版
167     //---------------------------------------------------------------------------
168     void* Alloc(
169         size_t size,
170         SoundHeap::DisposeCallback callback,
171         void* callbackArg
172     );
173 
174     //---------------------------------------------------------------------------
175     //! @brief        確保したメモリブロックを全て解放します。
176     //!
177     //!               解放したメモリブロックそれぞれに対して、@ref Alloc で設定した
178     //!               コールバック関数が呼び出されます。
179     //!
180     //! @date 2009/12/28 初版
181     //---------------------------------------------------------------------------
182     void Clear();
183 
184     //---------------------------------------------------------------------------
185     //! @brief        サウンドヒープが有効かどうかを調べます。
186     //!
187     //!               @ref Create を呼び出してサウンドヒープが作成され、
188     //!               メモリブロックの確保が可能な状態であれば、true を返します。
189     //!
190     //! @return       サウンドヒープが有効なら true を返します。
191     //!
192     //! @date 2009/12/28 初版
193     //---------------------------------------------------------------------------
IsValid()194     bool IsValid() const { return m_FrameHeap.IsValid(); }
195     //@}
196 
197     //----------------------------------------
198     //! @name 階層管理
199     //---------------------------------------------------------------------------
200     //! @brief        サウンドヒープの現在の状態を保存します。
201     //!
202     //!               ヒープ作成直後の階層レベルは 0 で、
203     //!               この関数を呼ぶ毎に階層レベルがひとつ増えます。
204     //!               @ref LoadState を呼びだすことで、
205     //!               指定した階層レベルの保存直後の状態に復元させることができます。
206     //!
207     //!               状態の保存にはヒープを少し消費します。
208     //!               ヒープの空き容量が足りない場合は、関数の呼びだしは失敗します。
209     //!
210     //! @return       状態保存後の階層レベルを返します。
211     //!               状態の保存に失敗すると -1 を返します。
212     //!
213     //! @date 2009/12/28 初版
214     //---------------------------------------------------------------------------
215     int SaveState();
216 
217     //---------------------------------------------------------------------------
218     //! @brief        保存したサウンドヒープの状態を復元します。
219     //!
220     //!               サウンドヒープを @ref SaveState で保存した直後の状態に戻します。
221     //!               状態を保存してから現在までに確保されたメモリブロックは、
222     //!               全て解放されます。 解放したメモリブロックそれぞれに対して、
223     //!               @ref Alloc で設定したコールバック関数が呼びだされます。
224     //!
225     //!               階層レベル level は現在の階層レベルの値と同じか、
226     //!               より小さい値を指定します。
227     //!               0 を指定すると、@ref Clear と同じ意味になります。
228     //!               ヒープは、状態が保存された直後の状態に戻り、
229     //!               現在の階層レベルも指定した値になります。
230     //!
231     //! @param[in]    level   復元する階層レベル。
232     //!
233     //! @date 2009/12/28 初版
234     //---------------------------------------------------------------------------
235     void LoadState( int level );
236 
237     //---------------------------------------------------------------------------
238     //! @brief        現在のサウンドヒープの階層レベルを取得します。
239     //!
240     //!               ヒープ作成直後の階層レベルは 0 です。
241     //!               @ref SaveState を呼びだす毎に、階層レベルがひとつ増えます。
242     //!               @ref LoadState で状態を復元すると、
243     //!               現在の階層レベルも指定した階層レベルに戻ります。
244     //!
245     //! @return       現在の階層レベルを返します。
246     //!
247     //! @date 2009/12/28 初版
248     //---------------------------------------------------------------------------
GetCurrentLevel()249     int GetCurrentLevel() const
250     {
251 		nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
252         return m_FrameHeap.GetCurrentLevel();
253     }
254     //@}
255 
256     //----------------------------------------
257     //! @name 情報取得
258     //---------------------------------------------------------------------------
259     //! @brief        メモリ上のヒープのサイズを取得します。
260     //!
261     //! @return       メモリ上のヒープのサイズ。
262     //!
263     //! @date 2009/12/28 初版
264     //---------------------------------------------------------------------------
GetSize()265     size_t GetSize() const
266     {
267 		nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
268         return m_FrameHeap.GetSize();
269     }
270 
271     //---------------------------------------------------------------------------
272     //! @brief        メモリ上のヒープの空き容量を取得します。
273     //!
274     //! @return       メモリ上のヒープの空き容量のサイズ。
275     //!
276     //! @date 2009/12/28 初版
277     //---------------------------------------------------------------------------
GetFreeSize()278     size_t GetFreeSize() const
279     {
280         nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
281         return m_FrameHeap.GetFreeSize();
282     }
283 
284     //---------------------------------------------------------------------------
285     //! @brief      ヒープの内容をダンプします。
286     //!
287     //!             arc には、@ref SoundDataManager::Initialize 関数に渡した
288     //!             サウンドアーカイブを指定する必要があります。
289     //!
290     //!             サウンドヒープに複数のサウンドアーカイブのデータをロードしていると、
291     //!             本関数は正常に動作しません。
292     //!
293     //! @param[in]   mgr  サウンドデータマネージャです。
294     //! @param[in]   arc  サウンドアーカイブです。
295     //!
296     //! @date 2010/10/27 複数のサウンドアーカイブのデータをロードした場合の注意点を追記
297     //! @date 2009/12/28 初版
298     //---------------------------------------------------------------------------
Dump(nw::snd::SoundDataManager & mgr,nw::snd::SoundArchive & arc)299     void Dump( nw::snd::SoundDataManager& mgr, nw::snd::SoundArchive& arc )
300     {
301         nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
302         m_FrameHeap.Dump( mgr, arc );
303     }
304     //@}
305 
306 private:
307     static void DisposeCallbackFunc( void* mem, unsigned long size, void* arg );
308 
309 	mutable nn::os::CriticalSection m_CriticalSection;
310     internal::FrameHeap m_FrameHeap;       // メインメモリ管理ヒープ
311 };
312 
313 } // namespace nw::snd
314 } // namespace nw
315 
316 
317 #endif /* NW_SND_SOUND_HEAP_H_ */
318 
319