1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: snd_SequenceSound.h 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 #ifndef NW_SND_SEQUENCE_SOUND_H_ 19 #define NW_SND_SEQUENCE_SOUND_H_ 20 21 #include <nw/snd/snd_BasicSound.h> 22 #include <nw/snd/snd_BasicSoundPlayer.h> 23 #include <nw/snd/snd_SequenceSoundPlayer.h> 24 #include <nw/snd/snd_SoundInstanceManager.h> 25 #include <nw/snd/snd_Task.h> 26 #include <nw/snd/snd_Debug.h> 27 #include <nw/snd/snd_PlayerHeapDataManager.h> 28 29 namespace nw { 30 namespace snd { 31 32 /* ======================================================================== 33 type declarataion 34 ======================================================================== */ 35 36 class SequenceSoundHandle; 37 38 namespace internal { 39 40 namespace driver { 41 42 class NoteOnCallback; 43 44 } 45 46 class SequenceSound; 47 48 typedef SoundInstanceManager<SequenceSound, driver::SequenceSoundPlayer> SequenceSoundInstanceManager; 49 50 51 class SequenceSound : public BasicSound 52 { 53 friend class SequenceSoundHandle; 54 55 public: 56 NW_UT_RUNTIME_TYPEINFO; // ダウンキャスト用の実行時型情報を埋め込みます 57 58 struct StartInfo 59 { 60 s32 seqOffset; 61 driver::SequenceSoundPlayer::OffsetType startOffsetType; 62 int startOffset; 63 }; 64 65 struct LoadInfo 66 { 67 const SoundArchive* arc; 68 const SoundDataManager* mgr; 69 const LoadItemInfo* seq; 70 const LoadItemInfo* banks; 71 }; 72 73 /* ------------------------------------------------------------------------ 74 DataLoadTask class 75 ------------------------------------------------------------------------ */ 76 private: 77 typedef void (*NotifyAsyncLoadFinished)( 78 bool result, 79 const LoadItemInfo* seq, 80 const LoadItemInfo banks[], 81 void* userData 82 ); 83 84 class DataLoadTask : public Task 85 { 86 public: 87 DataLoadTask(); 88 virtual void Execute(); 89 90 PlayerHeapDataManager* m_pDataManager; 91 PlayerHeap* m_pAllocator; 92 NotifyAsyncLoadFinished m_Callback; 93 void* m_CallbackData; 94 95 const SoundDataManager* m_pSoundDataManager; 96 const SoundArchive* m_pSoundArchive; 97 98 LoadItemInfo m_LoadInfoSeq; 99 LoadItemInfo m_LoadInfoBanks[SoundArchive::SEQ_BANK_MAX]; 100 }; 101 102 /* ------------------------------------------------------------------------ 103 class member 104 ------------------------------------------------------------------------ */ 105 public: 106 SequenceSound( SequenceSoundInstanceManager& manager ); 107 108 void Setup( 109 driver::SequenceTrackAllocator* trackAllocator, 110 u32 allocTracks, 111 driver::NoteOnCallback* callback 112 ); 113 void Prepare( const void* seqBase, const StartInfo& startInfo ); 114 void SetBankData( const LoadItemInfo banks[] ); 115 116 // プレイヤーヒープへのロードタスクを登録する 117 // (ロード完了後、必要であれば Prepare 処理が実行される) 118 bool RegisterDataLoadTask( const LoadInfo& loadInfo, const StartInfo& startInfo ); 119 120 virtual void Initialize(); 121 virtual void Finalize(); IsPrepared()122 virtual bool IsPrepared() const { return m_PreparedFlag; } 123 124 // パラメータ設定 125 void SetTempoRatio( f32 tempoRatio ); 126 void SetChannelPriority( int priority ); 127 void SetReleasePriorityFix( bool fix ); 128 void SetSequenceUserprocCallback( SequenceUserprocCallback callback, void* arg ); 129 130 // パラメータ取得 131 u32 GetTick() const; 132 133 // トラックパラメータ設定 134 void SetTrackMute( u32 trackBitFlag, SeqMute mute ); 135 void SetTrackMute( u32 trackBitFlag, bool muteFlag ); 136 void SetTrackSilence( u32 trackBitFlag, bool silenceFlag, int fadeTimes ); 137 138 void SetTrackBiquadFilter( u32 trackBitFlag, int type, f32 value ); 139 void SetTrackBankIndex( u32 trackBitFlag, int bankIndex ); 140 141 void SetTrackVolume( u32 trackBitFlag, f32 volume ); 142 void SetTrackPitch( u32 trackBitFlag, f32 pitch ); 143 void SetTrackPan( u32 trackBitFlag, f32 pan ); 144 void SetTrackSurroundPan( u32 trackBitFlag, f32 surroundPan ); 145 void SetTrackLpfFreq( u32 trackBitFlag, f32 lpfFreq ); 146 void SetTrackPanRange( u32 trackBitFlag, f32 panRange ); 147 void SetTrackModDepth( u32 trackBitFlag, f32 depth ); 148 void SetTrackModSpeed( u32 trackBitFlag, f32 speed ); 149 150 // シーケンス変数 151 bool ReadVariable( int varNo, s16* var ) const; 152 static bool ReadGlobalVariable( int varNo, s16* var ); 153 bool ReadTrackVariable( int trackNo, int varNo, s16* var ) const; 154 void WriteVariable( int varNo, s16 var ); 155 static void WriteGlobalVariable( int varNo, s16 var ); 156 void WriteTrackVariable( int trackNo, int varNo, s16 var ); 157 158 // const driver::SequenceSoundPlayer& GetSequenceSoundPlayer() const { return m_SequenceSoundPlayer; } 159 160 // デバッグ関数 GetSoundType()161 DebugSoundType GetSoundType() const { return DEBUG_SOUND_TYPE_SEQSOUND; } 162 163 protected: 164 virtual bool IsAttachedTempSpecialHandle(); 165 virtual void DetachTempSpecialHandle(); 166 GetBasicSoundPlayerHandle()167 virtual driver::BasicSoundPlayer* GetBasicSoundPlayerHandle() { return &m_SequenceSoundPlayerInstance; } 168 169 virtual void OnUpdatePlayerPriority(); 170 171 private: 172 173 void Skip( driver::SequenceSoundPlayer::OffsetType offsetType, int offset ); 174 175 static void NotifyAsyncLoadFinishedFunc( 176 bool result, 177 const LoadItemInfo* seq, 178 const LoadItemInfo banks[], 179 void* userData 180 ); 181 182 driver::SequenceSoundPlayer m_SequenceSoundPlayerInstance; 183 SequenceSoundHandle* m_pTempSpecialHandle; 184 SequenceSoundInstanceManager& m_Manager; 185 186 StartInfo m_StartInfo; 187 188 DataLoadTask m_DataLoadTask; 189 PlayerHeapDataManager m_DataManager; 190 191 volatile bool m_LoadingFlag; 192 bool m_PreparedFlag; 193 bool m_InitializeFlag; 194 }; 195 196 } // namespace nw::snd::internal 197 } // namespace nw::snd 198 } // namespace nw 199 200 201 #endif /* NW_SND_SEQUENCE_SOUND_H_ */ 202 203