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