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