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