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