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