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