1 /*---------------------------------------------------------------------------*
2 Project: NintendoWare
3 File: snd_StreamSound.cpp
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 #include "precompiled.h"
19
20 #include <nw/snd/snd_StreamSound.h>
21 #include <nw/snd/snd_StreamSoundHandle.h>
22
23 namespace nw {
24 namespace snd {
25 namespace internal {
26
27 NW_UT_RUNTIME_TYPEINFO_DEFINITION(StreamSound,BasicSound);
28
29 /* ========================================================================
30 member function
31 ======================================================================== */
32
33 /*---------------------------------------------------------------------------*
34 Name: StreamSound
35
36 Description: コンストラクタ
37
38 Arguments: None.
39
40 Returns: None.
41 *---------------------------------------------------------------------------*/
StreamSound(StreamSoundInstanceManager & manager)42 StreamSound::StreamSound(
43 StreamSoundInstanceManager& manager
44 )
45 : m_Manager( manager ),
46 m_InitializeFlag(false)
47 {
48 }
49
50
Initialize()51 void StreamSound::Initialize()
52 {
53 driver::BasicSoundPlayer* basicPlayer = GetBasicSoundPlayerHandle();
54 DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
55
56 if ( ! basicPlayer->TryWaitInstanceFree() ) {
57 cmdmgr.FlushCommand( true );
58 basicPlayer->WaitInstanceFree();
59 }
60
61 BasicSound::Initialize();
62
63 m_pTempSpecialHandle = NULL;
64
65 for ( int i=0; i<driver::StreamSoundPlayer::STRM_TRACK_NUM; i++ )
66 {
67 m_TrackVolume[ i ].InitValue( 0.0f );
68 m_TrackVolume[ i ].SetTarget( 1.0f, 1 );
69 }
70
71 m_InitializeFlag = true;
72 }
73
74 /*---------------------------------------------------------------------------*
75 Name: Finalize
76
77 Description: サウンドの終了
78
79 Arguments: None.
80
81 Returns: None.
82 *---------------------------------------------------------------------------*/
Finalize()83 void StreamSound::Finalize()
84 {
85 if ( ! m_InitializeFlag ) return;
86 m_InitializeFlag = false;
87
88 BasicSound::Finalize();
89
90 m_Manager.Free( this );
91 }
92
93 /*---------------------------------------------------------------------------*
94 Name: Setup
95
96 Description: 初期化
97
98 Arguments: pBbufferPool -
99 allocChannels -
100 allocTracks -
101
102 Returns:
103 *---------------------------------------------------------------------------*/
Setup(driver::StreamBufferPool * pBufferPool,int allocChannelCount,u16 allocTrackFlag)104 void StreamSound::Setup(
105 driver::StreamBufferPool* pBufferPool,
106 int allocChannelCount,
107 u16 allocTrackFlag
108 )
109 {
110 NW_NULL_ASSERT( pBufferPool );
111
112 m_AllocTrackFlag = allocTrackFlag;
113
114 DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
115 DriverCommandStreamSoundInit* command =
116 cmdmgr.AllocCommand<DriverCommandStreamSoundInit>();
117 command->id = DRIVER_COMMAND_STRM_INIT;
118 command->player = &m_StreamSoundPlayerInstance;
119 command->pBufferPool = pBufferPool;
120 command->allocChannelCount = allocChannelCount;
121 command->allocTrackFlag = allocTrackFlag;
122 cmdmgr.PushCommand(command);
123 }
124
125 /*---------------------------------------------------------------------------*
126 Name: Prepare
127
128 Description: サウンド開始準備
129
130 Arguments:
131
132 Returns: None.
133 *---------------------------------------------------------------------------*/
Prepare(driver::StreamSoundPlayer::StartOffsetType startOffsetType,s32 offset,io::FileStream * pFileStream)134 void StreamSound::Prepare(
135 driver::StreamSoundPlayer::StartOffsetType startOffsetType,
136 s32 offset,
137 io::FileStream* pFileStream
138 )
139 {
140 DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
141 DriverCommandStreamSoundSetup* command =
142 cmdmgr.AllocCommand<DriverCommandStreamSoundSetup>();
143 command->id = DRIVER_COMMAND_STRM_SETUP;
144 command->player = &m_StreamSoundPlayerInstance;
145 command->pFileStream = pFileStream;
146 command->startOffsetType = startOffsetType;
147 command->offset = offset;
148 cmdmgr.PushCommand(command);
149 }
150
151 /*---------------------------------------------------------------------------*
152 Name: UpdateMoveValue
153
154 Description: サウンドのアップデート
155
156 Arguments: None.
157
158 Returns: None.
159 *---------------------------------------------------------------------------*/
UpdateMoveValue()160 void StreamSound::UpdateMoveValue()
161 {
162 BasicSound::UpdateMoveValue();
163
164 u16 bitFlag = m_AllocTrackFlag;
165 for ( int trackNo=0; trackNo<driver::StreamSoundPlayer::STRM_TRACK_NUM; trackNo++,bitFlag>>=1 )
166 {
167 if ( bitFlag & 0x01 )
168 {
169 m_TrackVolume[ trackNo ].Update();
170 }
171 }
172 }
173
UpdateParam()174 void StreamSound::UpdateParam()
175 {
176 BasicSound::UpdateParam();
177
178 DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
179
180 u16 bitFlag = m_AllocTrackFlag;
181 for ( int trackNo=0; trackNo<driver::StreamSoundPlayer::STRM_TRACK_NUM; trackNo++, bitFlag>>=1 )
182 {
183 if ( bitFlag & 0x01 )
184 {
185 DriverCommandStreamSoundTrackParam* command =
186 cmdmgr.AllocCommand<DriverCommandStreamSoundTrackParam>();
187 command->id = DRIVER_COMMAND_STRM_TRACK_VOLUME;
188 command->player = &m_StreamSoundPlayerInstance;
189 command->trackBitFlag = static_cast<unsigned long>( 1 << trackNo );
190 command->value = m_TrackVolume[ trackNo ].GetValue();
191 cmdmgr.PushCommand(command);
192 }
193 }
194 }
195
SetTrackVolume(unsigned long trackBitFlag,float volume,int frames)196 void StreamSound::SetTrackVolume( unsigned long trackBitFlag, float volume, int frames )
197 {
198 if ( volume < 0.0f ) volume = 0.0f;
199
200 u16 bitFlag = ( m_AllocTrackFlag & trackBitFlag );
201 for( int trackNo = 0;
202 trackNo < driver::StreamSoundPlayer::STRM_TRACK_NUM && trackBitFlag != 0;
203 trackNo++, bitFlag >>=1
204 )
205 {
206 if ( bitFlag & 0x01 )
207 {
208 m_TrackVolume[ trackNo ].SetTarget( volume, frames );
209 }
210 }
211 }
212
SetTrackPan(unsigned long trackBitFlag,float pan)213 void StreamSound::SetTrackPan( unsigned long trackBitFlag, float pan )
214 {
215 DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
216 DriverCommandStreamSoundTrackParam* command =
217 cmdmgr.AllocCommand<DriverCommandStreamSoundTrackParam>();
218 command->id = DRIVER_COMMAND_STRM_TRACK_PAN;
219 command->player = &m_StreamSoundPlayerInstance;
220 command->trackBitFlag = trackBitFlag;
221 command->value = pan;
222 cmdmgr.PushCommand(command);
223 }
224
SetTrackSurroundPan(unsigned long trackBitFlag,float span)225 void StreamSound::SetTrackSurroundPan( unsigned long trackBitFlag, float span )
226 {
227 DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
228 DriverCommandStreamSoundTrackParam* command =
229 cmdmgr.AllocCommand<DriverCommandStreamSoundTrackParam>();
230 command->id = DRIVER_COMMAND_STRM_TRACK_SPAN;
231 command->player = &m_StreamSoundPlayerInstance;
232 command->trackBitFlag = trackBitFlag;
233 command->value = span;
234 cmdmgr.PushCommand(command);
235 }
236
237
238 /*---------------------------------------------------------------------------*
239 Name: OnUpdatePlayerPriority
240
241 Description: プレイヤープライオリティを変更
242
243 Arguments:
244
245 Returns: None.
246 *---------------------------------------------------------------------------*/
OnUpdatePlayerPriority()247 void StreamSound::OnUpdatePlayerPriority()
248 {
249 m_Manager.UpdatePriority( this, CalcCurrentPlayerPriority() );
250 }
251
IsAttachedTempSpecialHandle()252 bool StreamSound::IsAttachedTempSpecialHandle()
253 {
254 return m_pTempSpecialHandle != NULL;
255 }
256
DetachTempSpecialHandle()257 void StreamSound::DetachTempSpecialHandle()
258 {
259 m_pTempSpecialHandle->DetachSound();
260 }
261
ReadStreamDataInfo(StreamDataInfo * info) const262 bool StreamSound::ReadStreamDataInfo( StreamDataInfo* info ) const
263 {
264 if ( ! IsPlayerAvailable() ) return false;
265 return m_StreamSoundPlayerInstance.ReadStreamDataInfo( info );
266 }
267
GetPlayLoopCount() const268 long StreamSound::GetPlayLoopCount() const
269 {
270 if ( ! IsPlayerAvailable() ) return 0;
271 return m_StreamSoundPlayerInstance.GetPlayLoopCount();
272 }
273
GetPlaySamplePosition() const274 long StreamSound::GetPlaySamplePosition() const
275 {
276 if ( ! IsPlayerAvailable() ) return 0;
277 return m_StreamSoundPlayerInstance.GetPlaySamplePosition();
278 }
279
GetFilledBufferPercentage() const280 float StreamSound::GetFilledBufferPercentage() const
281 {
282 if ( ! IsPlayerAvailable() ) return 0.0f;
283 return m_StreamSoundPlayerInstance.GetFilledBufferPercentage();
284 }
285
IsPrepared() const286 bool StreamSound::IsPrepared() const
287 {
288 if ( ! IsPlayerAvailable() ) return false;
289 return m_StreamSoundPlayerInstance.IsPrepared();
290 }
291
IsSuspendByLoadingDelay() const292 bool StreamSound::IsSuspendByLoadingDelay() const
293 {
294 if ( ! IsPlayerAvailable() ) return false;
295 return m_StreamSoundPlayerInstance.IsSuspendByLoadingDelay();
296 }
297
298
299 } // namespace nw::snd::internal
300 } // namespace nw::snd
301 } // namespace nw
302
303