1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: snd_SoundHeap.cpp
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: 24689 $
14 *---------------------------------------------------------------------------*/
15
16 #include "precompiled.h"
17
18 #include <nw/snd/snd_SoundHeap.h>
19
20 #include <nw/snd/snd_SoundThread.h>
21 #include <nw/snd/snd_DriverCommand.h>
22
23 namespace nw {
24 namespace snd {
25
26 /*---------------------------------------------------------------------------*
27 Name: SoundHeap
28
29 Description: コンストラクタ
30
31 Arguments: 無し
32
33 Returns: 無し
34 *---------------------------------------------------------------------------*/
SoundHeap()35 SoundHeap::SoundHeap()
36 : m_FrameHeap()
37 {
38 m_CriticalSection.Initialize();
39 }
40
41 /*---------------------------------------------------------------------------*
42 Name: SoundHeap
43
44 Description: デストラクタ
45
46 Arguments: 無し
47
48 Returns: 無し
49 *---------------------------------------------------------------------------*/
~SoundHeap()50 SoundHeap::~SoundHeap()
51 {
52 Destroy();
53
54 m_CriticalSection.Finalize();
55 }
56
57 /*---------------------------------------------------------------------------*
58 Name: Create
59
60 Description: サウンドヒープを作成する
61
62 Arguments: startAddress - メインメモリ上のヒープ開始アドレス
63 size - メインメモリ上のヒープのサイズ
64
65 Returns: 成功したらtrue
66 *---------------------------------------------------------------------------*/
Create(void * startAddress,size_t size)67 bool SoundHeap::Create(
68 void* startAddress,
69 size_t size
70 )
71 {
72 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
73
74 return m_FrameHeap.Create( startAddress, size );
75 }
76
77 /*---------------------------------------------------------------------------*
78 Name: Destroy
79
80 Description: ヒープを破棄する
81
82 Arguments: 無し
83
84 Returns: 無し
85 *---------------------------------------------------------------------------*/
Destroy()86 void SoundHeap::Destroy()
87 {
88 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
89
90 if ( ! m_FrameHeap.IsValid() ) return;
91
92 Clear();
93
94 m_FrameHeap.Destroy();
95 }
96
97 /*---------------------------------------------------------------------------*
98 Name: Alloc
99
100 Description: メインメモリ上のヒープからメモリ領域を割り当てます
101
102 Arguments: size - メモリ領域のサイズ
103
104 Returns: 割り当てたメモリ領域の先頭アドレス
105 *---------------------------------------------------------------------------*/
Alloc(size_t size)106 void* SoundHeap::Alloc( size_t size )
107 {
108 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
109
110 void* buffer = Alloc(
111 size,
112 DisposeCallbackFunc,
113 NULL
114 );
115 // NN_LOG("[%s] free(%d %dKB %.3fMB)\n", __FUNCTION__,
116 // GetFreeSize(), GetFreeSize()/1024, GetFreeSize()/(1024.f*1024));
117 return buffer;
118 }
119
120 /*---------------------------------------------------------------------------*
121 Name: Alloc
122
123 Description: メインメモリ上のヒープからメモリ領域を割り当てます
124
125 Arguments: size - メモリ領域のサイズ
126 callback - メモリ領域が解放されるときに呼び出されるコールバック
127 callbackArg - コールバック
128
129 Returns: 割り当てたメモリ領域の先頭アドレス
130 *---------------------------------------------------------------------------*/
Alloc(size_t size,SoundHeap::DisposeCallback callback,void * callbackArg)131 void* SoundHeap::Alloc(
132 size_t size,
133 SoundHeap::DisposeCallback callback,
134 void* callbackArg
135 )
136 {
137 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
138
139 return m_FrameHeap.Alloc(
140 size,
141 callback,
142 callbackArg
143 );
144 }
145
146 // 確保したメモリブロックを全て解放する
Clear()147 void SoundHeap::Clear()
148 {
149 if ( ! m_FrameHeap.IsValid() ) return;
150
151 {
152 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
153
154 m_FrameHeap.Clear();
155 }
156
157 internal::DriverCommandManager& cmdmgr = internal::DriverCommandManager::GetInstance();
158 u32 tag = cmdmgr.FlushCommand( true );
159 cmdmgr.WaitCommandReply( tag );
160 }
161
162 // サウンドヒープの状態を保存する
SaveState()163 int SoundHeap::SaveState()
164 {
165 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
166
167 return m_FrameHeap.SaveState();
168 }
169
170 // サウンドヒープの状態を復元する
LoadState(int level)171 void SoundHeap::LoadState( int level )
172 {
173 {
174 nn::os::CriticalSection::ScopedLock lock( m_CriticalSection );
175
176 m_FrameHeap.LoadState( level );
177
178 internal::DriverCommandManager& cmdmgr = internal::DriverCommandManager::GetInstance();
179 u32 tag = cmdmgr.FlushCommand( true );
180 cmdmgr.WaitCommandReply( tag );
181 }
182
183 // NN_LOG("[%s] free(%d %dKB %.3fMB)\n", __FUNCTION__,
184 // GetFreeSize(), GetFreeSize()/1024, GetFreeSize()/(1024.f*1024));
185 }
186
187 /* ========================================================================
188 private function
189 ======================================================================== */
190
DisposeCallbackFunc(void * mem,unsigned long size,void * arg)191 void SoundHeap::DisposeCallbackFunc( void* mem, unsigned long size, void* arg )
192 {
193 NW_UNUSED_VARIABLE(arg);
194
195 internal::DriverCommandManager& cmdmgr = internal::DriverCommandManager::GetInstance();
196
197 internal::DriverCommandInvalidateData* command =
198 cmdmgr.AllocCommand<internal::DriverCommandInvalidateData>();
199 command->id = internal::DRIVER_COMMAND_INVALIDATE_DATA;
200 command->mem = mem;
201 command->size = size;
202 cmdmgr.PushCommand(command);
203 }
204
205 } // namespace nw::snd
206 } // namespace nw
207
208