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