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