1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     snd_SequenceSound.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: 28902 $
14  *---------------------------------------------------------------------------*/
15 
16 #include "precompiled.h"
17 
18 #include <nw/snd/snd_SequenceSound.h>
19 
20 #include <nw/snd/snd_SoundInstanceManager.h>
21 #include <nw/snd/snd_SequenceTrack.h>
22 #include <nw/snd/snd_SequenceSoundFile.h>
23 #include <nw/snd/snd_SequenceSoundFileReader.h>
24 #include <nw/snd/snd_SequenceSoundHandle.h>
25 #include <nw/snd/snd_TaskManager.h>
26 
27 namespace nw {
28 namespace snd {
29 namespace internal {
30 
31 NW_UT_RUNTIME_TYPEINFO_DEFINITION(SequenceSound,BasicSound);
32 
33 /* ========================================================================
34         member function
35    ======================================================================== */
36 
37 /*---------------------------------------------------------------------------*
38   Name:         SequenceSound
39 
40   Description:  コンストラクタ
41 
42   Arguments:    None.
43 
44   Returns:      None.
45  *---------------------------------------------------------------------------*/
SequenceSound(SequenceSoundInstanceManager & manager)46 SequenceSound::SequenceSound(
47     SequenceSoundInstanceManager& manager
48 )
49 : m_Manager( manager ),
50   m_InitializeFlag(false)
51 {
52 }
53 
Initialize()54 void SequenceSound::Initialize()
55 {
56     BasicSound::Initialize();
57 
58     m_pTempSpecialHandle = NULL;
59     m_LoadingFlag = false;
60     m_PreparedFlag = false;
61     m_StartInfo.startOffset = 0;
62 
63     m_InitializeFlag = true;
64 }
65 
66 /*---------------------------------------------------------------------------*
67   Name:         Shutdown
68 
69   Description:  サウンドの終了
70 
71   Arguments:    None.
72 
73   Returns:      None.
74  *---------------------------------------------------------------------------*/
Finalize()75 void SequenceSound::Finalize()
76 {
77     if ( ! m_InitializeFlag ) return;
78     m_InitializeFlag = false;
79 
80     // プレイヤーヒープにロード中の場合にロードを停止する
81     if ( m_LoadingFlag )
82     {
83         TaskManager::GetInstance().CancelTask( &m_DataLoadTask );
84         m_DataLoadTask.Wait();
85     }
86 
87     BasicSound::Finalize();
88 
89     m_DataManager.Finalize();
90 
91     m_Manager.Free( this );
92 }
93 
94 /*---------------------------------------------------------------------------*
95   Name:         Setup
96 
97   Description:  サウンド開始準備
98 
99   Arguments:    trackAllocator - トラックアロケータ
100                 allocTracks    - トラックアロケート情報
101                 callback       - ノートオンコールバック
102                 callbackData   - コールバックデータ
103 
104   Returns:      None.
105  *---------------------------------------------------------------------------*/
Setup(driver::SequenceTrackAllocator * trackAllocator,u32 allocTracks,driver::NoteOnCallback * noteOnCallback)106 void SequenceSound::Setup(
107     driver::SequenceTrackAllocator* trackAllocator,
108     u32 allocTracks,
109     driver::NoteOnCallback* noteOnCallback
110 )
111 {
112     NW_NULL_ASSERT( noteOnCallback );
113 
114     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
115     DriverCommandSeqInit* command =
116         cmdmgr.AllocCommand<DriverCommandSeqInit>();
117     command->id = DRIVER_COMMAND_SEQ_INIT;
118     command->player = &m_SequenceSoundPlayerInstance;
119     command->trackAllocator = trackAllocator;
120     command->allocTracks = allocTracks;
121     command->noteOnCallback = noteOnCallback;
122     cmdmgr.PushCommand(command);
123 }
124 
SetBankData(const LoadItemInfo banks[])125 void SequenceSound::SetBankData(
126     const LoadItemInfo banks[] )
127 {
128     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
129     DriverCommandSeqSetBankData* command =
130         cmdmgr.AllocCommand<DriverCommandSeqSetBankData>();
131     command->id = DRIVER_COMMAND_SEQ_BANKDATA;
132     command->player = &m_SequenceSoundPlayerInstance;
133     command->bankFiles[0] = banks[0].address;
134     command->bankFiles[1] = banks[1].address;
135     command->bankFiles[2] = banks[2].address;
136     command->bankFiles[3] = banks[3].address;
137     cmdmgr.PushCommand(command);
138 }
139 
140 /*---------------------------------------------------------------------------*
141   Name:         Prepare
142 
143   Description:  サウンドプリペア
144 
145   Arguments:    seqBase   - シーケンスデータベースアドレス
146                 seqOffset - シーケンスデータのオフセット
147 
148   Returns:      None.
149  *---------------------------------------------------------------------------*/
Prepare(const void * seqBase,const StartInfo & startInfo)150 void SequenceSound::Prepare( const void* seqBase, const StartInfo& startInfo )
151 {
152     NW_NULL_ASSERT( seqBase );
153 
154     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
155     DriverCommandSeqSetData* command =
156         cmdmgr.AllocCommand<DriverCommandSeqSetData>();
157     command->id = DRIVER_COMMAND_SEQ_SEQDATA;
158     command->player = &m_SequenceSoundPlayerInstance;
159     command->seqBase = seqBase;
160     command->seqOffset = startInfo.seqOffset;
161     cmdmgr.PushCommand(command);
162 
163     if ( startInfo.startOffset > 0 )
164     {
165         Skip( startInfo.startOffsetType, startInfo.startOffset );
166     }
167 
168     m_PreparedFlag = true;
169 }
170 
NotifyAsyncLoadFinishedFunc(bool result,const LoadItemInfo * seq,const LoadItemInfo banks[],void * userData)171 void SequenceSound::NotifyAsyncLoadFinishedFunc(
172     bool result,
173     const LoadItemInfo* seq,
174     const LoadItemInfo banks[],
175     void* userData )
176 {
177     NW_NULL_ASSERT( userData );
178     SequenceSound* sound = static_cast<SequenceSound*>( userData );
179 
180     sound->m_LoadingFlag = false;
181 
182     if ( ! result )
183     {
184         sound->Stop( 0 );
185         return;
186     }
187 
188     // プリペア
189     SequenceSoundFileReader reader( seq->address );
190     const void* seqBase = reader.GetSequenceData();
191     sound->Prepare( seqBase, sound->m_StartInfo );
192 
193     // バンクデータのセット
194     sound->SetBankData( banks );
195 
196     // プレイヤーヒープを SeqPlayer にセット
197     sound->m_SequenceSoundPlayerInstance.SetPlayerHeapDataManager(
198             &sound->m_DataManager );
199 }
200 
201 /*---------------------------------------------------------------------------*
202   Name:         Skip
203 
204   Description:  スキップ
205 
206   Arguments:    tick - スキップするTick数
207 
208   Returns:      None.
209  *---------------------------------------------------------------------------*/
Skip(driver::SequenceSoundPlayer::OffsetType offsetType,int offset)210 void SequenceSound::Skip( driver::SequenceSoundPlayer::OffsetType offsetType, int offset )
211 {
212     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
213     DriverCommandSeqSkip* command =
214         cmdmgr.AllocCommand<DriverCommandSeqSkip>();
215     command->id = DRIVER_COMMAND_SEQ_SKIP;
216     command->player = &m_SequenceSoundPlayerInstance;
217     command->offsetType = offsetType;
218     command->offset = offset;
219     cmdmgr.PushCommand(command);
220 }
221 
222 /*---------------------------------------------------------------------------*
223   Name:         SetTempoRatio
224 
225   Description:  テンポ比率の変更
226 
227   Arguments:    tempoRatio  - テンポの比率
228 
229   Returns:      None.
230  *---------------------------------------------------------------------------*/
SetTempoRatio(f32 tempoRatio)231 void SequenceSound::SetTempoRatio( f32 tempoRatio )
232 {
233     NW_ASSERT( tempoRatio >= 0.0f );
234 
235     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
236     DriverCommandSeqTempoRatio* command =
237         cmdmgr.AllocCommand<DriverCommandSeqTempoRatio>();
238     command->id = DRIVER_COMMAND_SEQ_TEMPORATIO;
239     command->player = &m_SequenceSoundPlayerInstance;
240     command->tempoRatio = tempoRatio;
241     cmdmgr.PushCommand(command);
242 }
243 
244 /*---------------------------------------------------------------------------*
245   Name:         SetChannelPriority
246 
247   Description:  発音プライオリティを変更
248 
249   Arguments:    priority - 発音プライオリティ
250 
251   Returns:      None.
252  *---------------------------------------------------------------------------*/
SetChannelPriority(int priority)253 void SequenceSound::SetChannelPriority( int priority )
254 {
255     NW_MINMAX_ASSERT( priority, 0, 127 );
256 
257     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
258     DriverCommandSeqChannelPrio* command =
259         cmdmgr.AllocCommand<DriverCommandSeqChannelPrio>();
260     command->id = DRIVER_COMMAND_SEQ_CHANNELPRIO;
261     command->player = &m_SequenceSoundPlayerInstance;
262     command->priority = priority;
263     cmdmgr.PushCommand(command);
264 }
265 
266 /*---------------------------------------------------------------------------*
267   Name:         SetReleasePriorityFix
268 
269   Description:  リリース時のプライオリティを変化しないようにする
270 
271   Arguments:    fix -
272 
273   Returns:      なし
274  *---------------------------------------------------------------------------*/
SetReleasePriorityFix(bool fix)275 void SequenceSound::SetReleasePriorityFix( bool fix )
276 {
277     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
278     DriverCommandSeqPrioFix* command =
279         cmdmgr.AllocCommand<DriverCommandSeqPrioFix>();
280     command->id = DRIVER_COMMAND_SEQ_PRIOFIX;
281     command->player = &m_SequenceSoundPlayerInstance;
282     command->priorityFix = fix;
283     cmdmgr.PushCommand(command);
284 }
285 
286 /*---------------------------------------------------------------------------*
287   Name:         SetUserprocCallback
288 
289   Description:  シーケンスコマンド'userproc'用コールバックを登録
290 
291   Arguments:    callback -
292                 arg -
293 
294   Returns:      なし
295  *---------------------------------------------------------------------------*/
SetSequenceUserprocCallback(SequenceUserprocCallback callback,void * arg)296 void SequenceSound::SetSequenceUserprocCallback( SequenceUserprocCallback callback, void* arg )
297 {
298     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
299     DriverCommandSeqUserProc* command =
300         cmdmgr.AllocCommand<DriverCommandSeqUserProc>();
301     command->id = DRIVER_COMMAND_SEQ_USERPROC;
302     command->player = &m_SequenceSoundPlayerInstance;
303     command->callback = reinterpret_cast<uptr>(callback);
304     command->arg = arg;
305     cmdmgr.PushCommand(command);
306 }
307 
308 /*---------------------------------------------------------------------------*
309   Name:         OnUpdatePlayerPriority
310 
311   Description:  プレイヤープライオリティを変更
312 
313   Arguments:
314 
315   Returns:      None.
316  *---------------------------------------------------------------------------*/
OnUpdatePlayerPriority()317 void SequenceSound::OnUpdatePlayerPriority()
318 {
319     int priority = CalcCurrentPlayerPriority();
320     m_Manager.UpdatePriority( this, priority );
321 }
322 
323 /*---------------------------------------------------------------------------*
324   Name:         SetTrackMute
325 
326   Description:  トラックミュート
327 
328   Arguments:    trackBitFlag - トラックビットフラグ
329                 flag         - ミュート
330 
331   Returns:      None.
332  *---------------------------------------------------------------------------*/
SetTrackMute(u32 trackBitFlag,SeqMute mute)333 void SequenceSound::SetTrackMute( u32 trackBitFlag, SeqMute mute )
334 {
335     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
336     DriverCommandSeqTrackMute* command =
337         cmdmgr.AllocCommand<DriverCommandSeqTrackMute>();
338     command->id = DRIVER_COMMAND_SEQTRACK_MUTE;
339     command->player = &m_SequenceSoundPlayerInstance;
340     command->trackBitFlag = trackBitFlag;
341     command->mute = mute;
342     cmdmgr.PushCommand(command);
343 }
344 
345 /*---------------------------------------------------------------------------*
346   Name:         SetTrackMute
347 
348   Description:  トラックミュート
349 
350   Arguments:    trackBitFlag - トラックビットフラグ
351                 muteFlag     - ミュートフラグ
352 
353   Returns:      None.
354  *---------------------------------------------------------------------------*/
SetTrackMute(u32 trackBitFlag,bool muteFlag)355 void SequenceSound::SetTrackMute( u32 trackBitFlag, bool muteFlag )
356 {
357     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
358     DriverCommandSeqTrackMute* command =
359         cmdmgr.AllocCommand<DriverCommandSeqTrackMute>();
360     command->id = DRIVER_COMMAND_SEQTRACK_MUTE;
361     command->player = &m_SequenceSoundPlayerInstance;
362     command->trackBitFlag = trackBitFlag;
363     command->mute = muteFlag ? SEQ_MUTE_STOP: SEQ_MUTE_OFF;
364     cmdmgr.PushCommand(command);
365 }
366 
367 /*---------------------------------------------------------------------------*
368   Name:         SetTrackSilence
369 
370   Description:  トラックサイレンス
371 
372   Arguments:    trackBitFlag - トラックビットフラグ
373                 silenceFlag  - ミュートフラグ
374                 fadeFrames   - フェードフレーム数
375 
376   Returns:      None.
377  *---------------------------------------------------------------------------*/
SetTrackSilence(u32 trackBitFlag,bool silenceFlag,int fadeFrames)378 void SequenceSound::SetTrackSilence( u32 trackBitFlag, bool silenceFlag, int fadeFrames )
379 {
380     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
381     DriverCommandSeqTrackSilence* command =
382         cmdmgr.AllocCommand<DriverCommandSeqTrackSilence>();
383     command->id = DRIVER_COMMAND_SEQTRACK_MUTE;
384     command->player = &m_SequenceSoundPlayerInstance;
385     command->trackBitFlag = trackBitFlag;
386     command->silenceFlag = silenceFlag;
387     command->fadeFrames = fadeFrames;
388     cmdmgr.PushCommand(command);
389 }
390 
391 /*---------------------------------------------------------------------------*
392   Name:         SetTrackVolume
393 
394   Description:  トラックボリュームの変更
395 
396   Arguments:    trackBitFlag - トラックビットフラグ
397                 volume       - ボリューム
398 
399   Returns:      None.
400  *---------------------------------------------------------------------------*/
SetTrackVolume(u32 trackBitFlag,f32 volume)401 void SequenceSound::SetTrackVolume( u32 trackBitFlag, f32 volume )
402 {
403     NW_ASSERT( volume >= 0.0f );
404 
405     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
406     DriverCommandSeqTrackParam* command =
407         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
408     command->id = DRIVER_COMMAND_SEQTRACK_VOLUME;
409     command->player = &m_SequenceSoundPlayerInstance;
410     command->trackBitFlag = trackBitFlag;
411     command->value = volume;
412     cmdmgr.PushCommand(command);
413 }
414 
415 /*---------------------------------------------------------------------------*
416   Name:         SetTrackPitch
417 
418   Description:  トラックピッチの変更
419 
420   Arguments:    trackBitFlag - トラックビットフラグ
421                 pitch        - 音程
422 
423   Returns:      None.
424  *---------------------------------------------------------------------------*/
SetTrackPitch(u32 trackBitFlag,f32 pitch)425 void SequenceSound::SetTrackPitch( u32 trackBitFlag, f32 pitch )
426 {
427     NW_ASSERT( pitch >= 0.0f );
428 
429     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
430     DriverCommandSeqTrackParam* command =
431         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
432     command->id = DRIVER_COMMAND_SEQTRACK_PITCH;
433     command->player = &m_SequenceSoundPlayerInstance;
434     command->trackBitFlag = trackBitFlag;
435     command->value = pitch;
436     cmdmgr.PushCommand(command);
437 }
438 
439 /*---------------------------------------------------------------------------*
440   Name:         SetTrackPan
441 
442   Description:  トラックパンの変更
443 
444   Arguments:    trackBitFlag - トラックビットフラグ
445                 pan          - パン
446 
447   Returns:      None.
448  *---------------------------------------------------------------------------*/
SetTrackPan(u32 trackBitFlag,f32 pan)449 void SequenceSound::SetTrackPan( u32 trackBitFlag, f32 pan )
450 {
451     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
452     DriverCommandSeqTrackParam* command =
453         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
454     command->id = DRIVER_COMMAND_SEQTRACK_PAN;
455     command->player = &m_SequenceSoundPlayerInstance;
456     command->trackBitFlag = trackBitFlag;
457     command->value = pan;
458     cmdmgr.PushCommand(command);
459 }
460 
461 /*---------------------------------------------------------------------------*
462   Name:         SetTrackSurroundPan
463 
464   Description:  トラックサラウンドパンの変更
465 
466   Arguments:    trackBitFlag - トラックビットフラグ
467                 surroundPan  - サラウンドパン
468 
469   Returns:      None.
470  *---------------------------------------------------------------------------*/
SetTrackSurroundPan(u32 trackBitFlag,f32 surroundPan)471 void SequenceSound::SetTrackSurroundPan( u32 trackBitFlag, f32 surroundPan )
472 {
473     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
474     DriverCommandSeqTrackParam* command =
475         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
476     command->id = DRIVER_COMMAND_SEQTRACK_SPAN;
477     command->player = &m_SequenceSoundPlayerInstance;
478     command->trackBitFlag = trackBitFlag;
479     command->value = surroundPan;
480     cmdmgr.PushCommand(command);
481 }
482 
483 /*---------------------------------------------------------------------------*
484   Name:         SetTrackLpfFreq
485 
486   Description:  ローパスフィルタのカットオフの変更
487 
488   Arguments:    trackBitFlag - トラックビットフラグ
489                 lpfFreq  - フィルタのカットオフ値
490 
491   Returns:      None.
492  *---------------------------------------------------------------------------*/
SetTrackLpfFreq(u32 trackBitFlag,f32 lpfFreq)493 void SequenceSound::SetTrackLpfFreq( u32 trackBitFlag, f32 lpfFreq )
494 {
495     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
496     DriverCommandSeqTrackParam* command =
497         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
498     command->id = DRIVER_COMMAND_SEQTRACK_LPF;
499     command->player = &m_SequenceSoundPlayerInstance;
500     command->trackBitFlag = trackBitFlag;
501     command->value = lpfFreq;
502     cmdmgr.PushCommand(command);
503 }
504 
505 /*---------------------------------------------------------------------------*
506   Name:         SetTrackBiquadFilter
507 
508   Description:  Biquadフィルタの設定
509 
510   Arguments:    trackBitFlag - トラックビットフラグ
511                 type  - フィルタの種類 (0 - 127)
512                 value - フィルタの値 (0.0f - 1.0f)
513 
514   Returns:      None.
515  *---------------------------------------------------------------------------*/
SetTrackBiquadFilter(u32 trackBitFlag,int type,f32 value)516 void SequenceSound::SetTrackBiquadFilter( u32 trackBitFlag, int type, f32 value )
517 {
518     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
519     DriverCommandSeqTrackBiquad* command =
520         cmdmgr.AllocCommand<DriverCommandSeqTrackBiquad>();
521     command->id = DRIVER_COMMAND_SEQTRACK_BIQUAD;
522     command->player = &m_SequenceSoundPlayerInstance;
523     command->trackBitFlag = trackBitFlag;
524     command->type = type;
525     command->value = value;
526     cmdmgr.PushCommand(command);
527 }
528 
529 /*---------------------------------------------------------------------------*
530   Name:         SetTrackPanRange
531 
532   Description:  トラックパンレンジの変更
533 
534   Arguments:    trackBitFlag - トラックビットフラグ
535                 panRange     - パンレンジ
536 
537   Returns:      None.
538  *---------------------------------------------------------------------------*/
SetTrackPanRange(u32 trackBitFlag,f32 panRange)539 void SequenceSound::SetTrackPanRange( u32 trackBitFlag, f32 panRange )
540 {
541     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
542     DriverCommandSeqTrackParam* command =
543         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
544     command->id = DRIVER_COMMAND_SEQTRACK_PANRANGE;
545     command->player = &m_SequenceSoundPlayerInstance;
546     command->trackBitFlag = trackBitFlag;
547     command->value = panRange;
548     cmdmgr.PushCommand(command);
549 }
550 
551 /*---------------------------------------------------------------------------*
552   Name:         SetTrackModDepth
553 
554   Description:  モジュレーションデプスの変更
555 
556   Arguments:    trackBitFlag - トラックビットフラグ
557                 depth        - モジュレーションデプス
558 
559   Returns:      None.
560  *---------------------------------------------------------------------------*/
SetTrackModDepth(u32 trackBitFlag,f32 depth)561 void SequenceSound::SetTrackModDepth( u32 trackBitFlag, f32 depth )
562 {
563     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
564     DriverCommandSeqTrackParam* command =
565         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
566     command->id = DRIVER_COMMAND_SEQTRACK_MODDEPTH;
567     command->player = &m_SequenceSoundPlayerInstance;
568     command->trackBitFlag = trackBitFlag;
569     command->value = depth;
570     cmdmgr.PushCommand(command);
571 }
572 
573 /*---------------------------------------------------------------------------*
574   Name:         SetTrackModSpeed
575 
576   Description:  モジュレーションスピードの変更
577 
578   Arguments:    trackBitFlag - トラックビットフラグ
579                 speed        - モジュレーションスピード
580 
581   Returns:      None.
582  *---------------------------------------------------------------------------*/
SetTrackModSpeed(u32 trackBitFlag,f32 speed)583 void SequenceSound::SetTrackModSpeed( u32 trackBitFlag, f32 speed )
584 {
585     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
586     DriverCommandSeqTrackParam* command =
587         cmdmgr.AllocCommand<DriverCommandSeqTrackParam>();
588     command->id = DRIVER_COMMAND_SEQTRACK_MODSPEED;
589     command->player = &m_SequenceSoundPlayerInstance;
590     command->trackBitFlag = trackBitFlag;
591     command->value = speed;
592     cmdmgr.PushCommand(command);
593 }
594 
SetTrackBankIndex(u32 trackBitFlag,int bankIndex)595 void SequenceSound::SetTrackBankIndex( u32 trackBitFlag, int bankIndex )
596 {
597     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
598     DriverCommandSeqTrackBankIndex* command =
599         cmdmgr.AllocCommand<DriverCommandSeqTrackBankIndex>();
600     command->id = DRIVER_COMMAND_SEQTRACK_BANKINDEX;
601     command->player = &m_SequenceSoundPlayerInstance;
602     command->trackBitFlag = trackBitFlag;
603     command->bankIndex = bankIndex;
604     cmdmgr.PushCommand(command);
605 }
606 
607 /*---------------------------------------------------------------------------*
608   Name:         ReadVariable
609 
610   Description:  シーケンスローカル変数の読みとり
611 
612   Arguments:    varNo  - 変数番号
613                 var    - 読み込み先アドレス
614 
615   Returns:      成功したかどうか
616  *---------------------------------------------------------------------------*/
ReadVariable(int varNo,s16 * var) const617 bool SequenceSound::ReadVariable( int varNo, s16* var ) const
618 {
619     NW_NULL_ASSERT( var );
620     NW_MINMAXLT_ASSERT( varNo, 0, driver::SequenceSoundPlayer::PLAYER_VARIABLE_NUM );
621 
622     if ( ! IsPlayerAvailable() )
623     {
624         *var = driver::SequenceSoundPlayer::VARIABLE_DEFAULT_VALUE;
625     }
626     else
627     {
628         *var = m_SequenceSoundPlayerInstance.GetLocalVariable( varNo );
629     }
630     return true;
631 }
632 
633 /*---------------------------------------------------------------------------*
634   Name:         ReadGlobalVariable
635 
636   Description:  シーケンスグローバル変数の読みとり
637 
638   Arguments:    varNo - 変数番号
639                 var   - 読み込み先アドレス
640 
641   Returns:      成功したかどうか
642  *---------------------------------------------------------------------------*/
ReadGlobalVariable(int varNo,s16 * var)643 bool SequenceSound::ReadGlobalVariable( int varNo, s16* var )
644 {
645     NW_NULL_ASSERT( var );
646     NW_MINMAXLT_ASSERT( varNo, 0, driver::SequenceSoundPlayer::GLOBAL_VARIABLE_NUM );
647 
648     *var = driver::SequenceSoundPlayer::GetGlobalVariable( varNo );
649     return true;
650 }
651 
652 /*---------------------------------------------------------------------------*
653   Name:         ReadTrackVariable
654 
655   Description:  シーケンストラック変数の読みとり
656 
657   Arguments:    trackNo - トラック番号
658                 varNo  - 変数番号
659                 var    - 読み込み先アドレス
660 
661   Returns:      成功したかどうか
662  *---------------------------------------------------------------------------*/
ReadTrackVariable(int trackNo,int varNo,s16 * var) const663 bool SequenceSound::ReadTrackVariable( int trackNo, int varNo, s16* var ) const
664 {
665     NW_NULL_ASSERT( var );
666     NW_MINMAXLT_ASSERT( trackNo, 0, driver::SequenceSoundPlayer::TRACK_NUM_PER_PLAYER );
667     NW_MINMAXLT_ASSERT( varNo, 0, driver::SequenceTrack::TRACK_VARIABLE_NUM );
668 
669     if ( ! IsPlayerAvailable() )
670     {
671         *var = driver::SequenceSoundPlayer::VARIABLE_DEFAULT_VALUE;
672     }
673     else
674     {
675         const driver::SequenceTrack* track = m_SequenceSoundPlayerInstance.GetPlayerTrack( trackNo );
676         if ( track == NULL ) *var = driver::SequenceSoundPlayer::VARIABLE_DEFAULT_VALUE;
677         else *var = track->GetTrackVariable( varNo );
678     }
679     return true;
680 }
681 
682 /*---------------------------------------------------------------------------*
683   Name:         WriteVariable
684 
685   Description:  シーケンスローカル変数の書き込み
686 
687   Arguments:    varNo  - 変数番号
688                 var    - 書き込む値
689 
690   Returns:      None.
691  *---------------------------------------------------------------------------*/
WriteVariable(int varNo,s16 var)692 void SequenceSound::WriteVariable( int varNo, s16 var )
693 {
694     NW_MINMAXLT_ASSERT( varNo, 0, driver::SequenceSoundPlayer::PLAYER_VARIABLE_NUM );
695 
696     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
697     DriverCommandSeqSetVar* command =
698         cmdmgr.AllocCommand<DriverCommandSeqSetVar>();
699     command->id = DRIVER_COMMAND_SEQ_SETVAR;
700     command->player = &m_SequenceSoundPlayerInstance;
701     command->varNo = varNo;
702     command->var = var;
703     cmdmgr.PushCommand(command);
704 }
705 
706 /*---------------------------------------------------------------------------*
707   Name:         WriteGlobalVariable
708 
709   Description:  シーケンスグローバル変数の書き込み
710 
711   Arguments:    varNo - 変数番号
712                 var   - 書き込む値
713 
714   Returns:      None.
715  *---------------------------------------------------------------------------*/
WriteGlobalVariable(int varNo,s16 var)716 void SequenceSound::WriteGlobalVariable( int varNo, s16 var )
717 {
718     NW_MINMAXLT_ASSERT( varNo, 0, driver::SequenceSoundPlayer::GLOBAL_VARIABLE_NUM );
719 
720     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
721     DriverCommandSeqSetVar* command =
722         cmdmgr.AllocCommand<DriverCommandSeqSetVar>();
723     command->id = DRIVER_COMMAND_SEQ_SETGVAR;
724     command->varNo = varNo;
725     command->var = var;
726     cmdmgr.PushCommand(command);
727 }
728 
729 /*---------------------------------------------------------------------------*
730   Name:         WriteTrackVariable
731 
732   Description:  シーケンストラック変数の書き込み
733 
734   Arguments:    trackNo - トラック番号
735                 varNo  - 変数番号
736                 var    - 書き込む値
737 
738   Returns:      None.
739  *---------------------------------------------------------------------------*/
WriteTrackVariable(int trackNo,int varNo,s16 var)740 void SequenceSound::WriteTrackVariable( int trackNo, int varNo, s16 var )
741 {
742     NW_MINMAXLT_ASSERT( trackNo, 0, driver::SequenceSoundPlayer::TRACK_NUM_PER_PLAYER );
743     NW_MINMAXLT_ASSERT( varNo, 0, driver::SequenceTrack::TRACK_VARIABLE_NUM );
744 
745     DriverCommandManager& cmdmgr = DriverCommandManager::GetInstance();
746     DriverCommandSeqSetVar* command =
747         cmdmgr.AllocCommand<DriverCommandSeqSetVar>();
748     command->id = DRIVER_COMMAND_SEQ_SETTVAR;
749     command->player = &m_SequenceSoundPlayerInstance;
750     command->trackNo = trackNo;
751     command->varNo = varNo;
752     command->var = var;
753     cmdmgr.PushCommand(command);
754 }
755 
756 /*---------------------------------------------------------------------------*
757   Name:         GetTick
758 
759   Description:  再生開始からのティック数の取得
760 
761   Arguments:    None.
762 
763   Returns:      ティック数
764  *---------------------------------------------------------------------------*/
GetTick() const765 u32 SequenceSound::GetTick() const
766 {
767     if ( ! IsPlayerAvailable() ) {
768         // pre start
769         return 0;
770     }
771 
772     return m_SequenceSoundPlayerInstance.GetTickCounter();
773 }
774 
IsAttachedTempSpecialHandle()775 bool SequenceSound::IsAttachedTempSpecialHandle()
776 {
777     return m_pTempSpecialHandle != NULL;
778 }
779 
DetachTempSpecialHandle()780 void SequenceSound::DetachTempSpecialHandle()
781 {
782     m_pTempSpecialHandle->DetachSound();
783 }
784 
785 /* ========================================================================
786         SoundArchivePlayer::SeqCallback class
787    ======================================================================== */
788 
RegisterDataLoadTask(const LoadInfo & loadInfo,const StartInfo & startInfo)789 bool SequenceSound::RegisterDataLoadTask( const LoadInfo& loadInfo, const StartInfo& startInfo )
790 {
791     PlayerHeap* heap = GetPlayerHeap();
792     if ( heap == NULL )
793     {
794         return false;
795     }
796     m_DataManager.Initialize( loadInfo.arc );
797     m_DataLoadTask.m_pDataManager = &m_DataManager;
798     m_DataLoadTask.m_pAllocator = heap;
799     m_DataLoadTask.m_Callback = NotifyAsyncLoadFinishedFunc;
800     m_DataLoadTask.m_CallbackData = this;
801 
802     m_DataLoadTask.m_pSoundDataManager = loadInfo.mgr;
803     m_DataLoadTask.m_pSoundArchive = loadInfo.arc;
804     m_DataLoadTask.m_LoadInfoSeq = *(loadInfo.seq);
805     for ( int i = 0; i < SoundArchive::SEQ_BANK_MAX; i++ )
806     {
807         m_DataLoadTask.m_LoadInfoBanks[i] = loadInfo.banks[i];
808     }
809 
810     m_StartInfo = startInfo;
811 
812     m_LoadingFlag = true;
813     TaskManager::GetInstance().AppendTask( &m_DataLoadTask, TaskManager::PRIORITY_MIDDLE );
814     return true;
815 }
816 
817 
DataLoadTask()818 SequenceSound::DataLoadTask::DataLoadTask()
819 : m_pDataManager( NULL ),
820   m_pAllocator( NULL ),
821   m_Callback( NULL ),
822   m_CallbackData( NULL )
823 {
824 }
825 
Execute()826 void SequenceSound::DataLoadTask::Execute()
827 {
828     m_pAllocator->Clear(); // あらかじめクリアしておく
829 
830     if ( ( m_LoadInfoSeq.address == NULL ) &&
831          ( m_LoadInfoSeq.itemId != SoundArchive::INVALID_ID ) )
832     {
833         SoundArchive::ItemId soundId = m_LoadInfoSeq.itemId;
834 
835         if ( ! m_pDataManager->LoadData( soundId, m_pAllocator, SoundArchiveLoader::LOAD_SEQ ) )
836         {
837             NW_WARNING( false, "failed to load SEQ(%08x) to PlayerHeap", soundId );
838             if ( m_Callback )
839             {
840                 m_Callback( false, NULL, NULL, m_CallbackData );
841                 return;
842             }
843         }
844         m_LoadInfoSeq.address = m_pDataManager->detail_GetFileAddressByItemId( soundId );
845     }
846 
847     for ( int i = 0; i < SoundArchive::SEQ_BANK_MAX; i++ )
848     {
849         if ( ( m_LoadInfoBanks[i].address == NULL ) &&
850              ( m_LoadInfoBanks[i].itemId != SoundArchive::INVALID_ID ) )
851         {
852             SoundArchive::ItemId bankId = m_LoadInfoBanks[i].itemId;
853             if ( ! m_pDataManager->LoadData(
854                         bankId, m_pAllocator, SoundArchiveLoader::LOAD_BANK ) )
855             {
856                 // ロードリクエストがあるのにロードできなかった場合
857                 NW_WARNING( false, "failed to load BANK(%08x) to PlayerHeap", bankId );
858                 if ( m_Callback )
859                 {
860                     m_Callback( false, NULL, NULL, m_CallbackData );
861                     return;
862                 }
863             }
864             m_LoadInfoBanks[i].address = m_pDataManager->detail_GetFileAddressByItemId( bankId );
865         }
866 
867         if ( m_LoadInfoBanks[i].itemId != SoundArchive::INVALID_ID )
868         {
869             bool result = Util::IsLoadedWaveArchive(
870                     m_LoadInfoBanks[i].address, *m_pSoundArchive, *m_pSoundDataManager );
871             if ( ! result )
872             {
873                 // 未ロードなら、ここでロードする
874                 if ( ! m_pDataManager->detail_LoadWaveArchiveByBankFile(
875                             m_LoadInfoBanks[i].address, m_pAllocator ) )
876                 {
877                     NW_WARNING( false,
878                             "failed to load BANK(%08x)'s WARC to PlayerHeap",
879                             m_LoadInfoBanks[i].itemId );
880                     m_Callback( false, NULL, NULL, m_CallbackData );
881                     return;
882                 }
883             }
884         }
885     }
886 
887     // ロード完了
888     if ( m_Callback )
889     {
890         m_Callback( true, &m_LoadInfoSeq, m_LoadInfoBanks, m_CallbackData );
891     }
892 }
893 
894 } // namespace nw::snd::internal
895 } // namespace nw::snd
896 } // namespace nw
897 
898