1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: OriginalSoundHeapApp.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:$
14 *---------------------------------------------------------------------------*/
15
16 #include "precompiled.h"
17
18 #include "OriginalSoundHeapApp.h"
19 #include "simple.csid"
20
21 namespace
22 {
23
24 const s32 SOUND_THREAD_PRIORITY = 4;
25 const s32 LOAD_THREAD_PRIORITY = 3;
26 const s32 SOUND_HEAP_SIZE = 1 * 1024 * 1024;
27 const char SOUND_ARC_PATH[] = NW_SND_DEMO_PATH_PREFIX "simple.bcsar";
28 const char DEMO_TITLE[] = "OriginalSoundHeap";
29
30 }
31
OnInitialize()32 void OriginalSoundHeapApp::OnInitialize()
33 {
34 InitializeSoundSystem();
35
36 // オリジナルヒープにデータをロードする
37 if ( ! m_DataManager.LoadData( SEQ_MARIOKART, &m_Heap ) )
38 {
39 NW_ASSERTMSG( false, "LoadData(SEQ_MARIOKART) failed.");
40 }
41 }
42
InitializeSoundSystem()43 void OriginalSoundHeapApp::InitializeSoundSystem()
44 {
45 // サウンドシステムの初期化
46 {
47 nw::snd::SoundSystem::SoundSystemParam param;
48 size_t workMemSize = nw::snd::SoundSystem::GetRequiredMemSize( param );
49 m_pMemoryForSoundSystem = MemAlloc( workMemSize );
50
51 nw::snd::SoundSystem::Initialize(
52 param,
53 reinterpret_cast<uptr>( m_pMemoryForSoundSystem ),
54 workMemSize );
55 }
56
57 // サウンドアーカイブ
58 if ( ! m_Archive.Open( SOUND_ARC_PATH ) )
59 {
60 NW_ASSERTMSG( 0, "cannot open bxsar(%s)\n", SOUND_ARC_PATH );
61 }
62
63 // INFO ブロックのロード
64 {
65 u32 infoBlockSize = m_Archive.GetHeaderSize();
66 m_pMemoryForInfoBlock = MemAlloc( infoBlockSize );
67 if ( ! m_Archive.LoadHeader( m_pMemoryForInfoBlock, infoBlockSize ) )
68 {
69 NW_ASSERTMSG( 0, "cannot load infoBlock(%s)", SOUND_ARC_PATH );
70 }
71 }
72
73 // STRING ブロックのロード
74 {
75 u32 stringBlockSize = m_Archive.GetLabelStringDataSize();
76 m_pMemoryForStringBlock = MemAlloc( stringBlockSize );
77 if ( ! m_Archive.LoadLabelStringData( m_pMemoryForStringBlock, stringBlockSize ) )
78 {
79 NW_ASSERTMSG( 0, "cannot load stringBlock(%s)", SOUND_ARC_PATH );
80 }
81 }
82
83 // サウンドデータマネージャーの初期化
84 {
85 u32 setupSize = m_DataManager.GetRequiredMemSize( &m_Archive );
86 m_pMemoryForSoundDataManager = MemAlloc( setupSize );
87 m_DataManager.Initialize( &m_Archive, m_pMemoryForSoundDataManager, setupSize );
88 }
89
90 // サウンドアーカイブプレイヤーの初期化
91 {
92 u32 setupSize = m_ArchivePlayer.GetRequiredMemSize( &m_Archive );
93 m_pMemoryForSoundArchivePlayer = MemAlloc( setupSize, 32 );
94 u32 setupStrmBufferSize =
95 m_ArchivePlayer.GetRequiredStreamBufferSize( &m_Archive );
96 m_pMemoryForStreamBuffer = MemAlloc( setupStrmBufferSize, 32 );
97 bool result = m_ArchivePlayer.Initialize(
98 &m_Archive,
99 &m_DataManager,
100 m_pMemoryForSoundArchivePlayer, setupSize,
101 m_pMemoryForStreamBuffer, setupStrmBufferSize );
102 NW_ASSERT( result );
103 }
104
105 // サウンドヒープの構築
106 {
107 m_pMemoryForSoundHeap = MemAlloc( SOUND_HEAP_SIZE );
108 bool result = m_Heap.Create( m_pMemoryForSoundHeap, SOUND_HEAP_SIZE );
109 NW_ASSERT( result );
110 }
111 }
112
OnFinalize()113 void OriginalSoundHeapApp::OnFinalize()
114 {
115 nw::snd::SoundSystem::Finalize();
116
117 MemFree( m_pMemoryForSoundSystem );
118 MemFree( m_pMemoryForInfoBlock );
119 MemFree( m_pMemoryForStringBlock );
120 MemFree( m_pMemoryForSoundDataManager );
121 MemFree( m_pMemoryForSoundArchivePlayer );
122 MemFree( m_pMemoryForSoundHeap );
123 MemFree( m_pMemoryForStreamBuffer );
124 }
125
OnDrawUpLCD(nw::font::TextWriter & writer)126 void OriginalSoundHeapApp::OnDrawUpLCD( nw::font::TextWriter& writer )
127 {
128 writer.Printf(" DEMO nw::snd %s\n\n", DEMO_TITLE);
129
130 writer.Print(" -- usage --\n\n");
131 writer.Print(" [A] Play Sequence Sound\n");
132 writer.Print(" [B] Stop Sound\n");
133 }
134
OnDrawDownLCD(nw::font::TextWriter &)135 void OriginalSoundHeapApp::OnDrawDownLCD( nw::font::TextWriter& /*writer*/ )
136 {
137 // なにもしない
138 }
139
OnUpdatePad(nw::demo::Pad & pad)140 void OriginalSoundHeapApp::OnUpdatePad( nw::demo::Pad& pad )
141 {
142 if ( pad.IsButtonDown( nw::demo::Pad::BUTTON_A ) )
143 {
144 m_Handle.Stop( 0 );
145 bool result = m_ArchivePlayer.StartSound( &m_Handle, SEQ_MARIOKART ).IsSuccess();
146 NN_LOG("[SEQ] SEQ_MARIOKART ... (%d)\n", result);
147 }
148
149 if ( pad.IsButtonDown( nw::demo::Pad::BUTTON_B ) )
150 {
151 m_Handle.Stop( 3 );
152 }
153 }
154
OnUpdate()155 void OriginalSoundHeapApp::OnUpdate()
156 {
157 m_ArchivePlayer.Update();
158 }
159
160
161
OriginalSoundHeap()162 OriginalSoundHeap::OriginalSoundHeap()
163 : m_IsDirectionHead( true )
164 {
165 }
166
Create(void * startAddress,size_t size)167 bool OriginalSoundHeap::Create( void* startAddress, size_t size )
168 {
169 m_pBufferHead = startAddress;
170 m_BufferSize = size;
171 m_pFrameHeap = nw::ut::FrameHeap::Create( startAddress, size );
172 if ( m_pFrameHeap != NULL ) { return true; }
173 else { return false; }
174 }
175
Alloc(size_t size)176 void* OriginalSoundHeap::Alloc( size_t size )
177 {
178 int alignment = m_IsDirectionHead ? ALIGNMENT_SIZE : -ALIGNMENT_SIZE;
179
180 return m_pFrameHeap->Alloc( size, alignment );
181 }
182
Free()183 void OriginalSoundHeap::Free()
184 {
185 /* CHECK: メモリ領域を開放する場合は、あらかじめ
186 下記の Dispose / DisposeWave を呼ぶ必要がある */
187 {
188 nw::snd::internal::driver::DisposeCallbackManager& manager =
189 nw::snd::internal::driver::DisposeCallbackManager::GetInstance();
190
191 manager.Dispose( m_pBufferHead, m_BufferSize );
192 }
193
194 m_pFrameHeap->Free( nw::ut::FrameHeap::FREE_ALL );
195 }
196
Destroy()197 void* OriginalSoundHeap::Destroy()
198 {
199 return m_pFrameHeap->Destroy();
200 }
201