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