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