/*---------------------------------------------------------------------------* Project: NintendoWare File: snd_SequenceSound.h Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. These coded instructions, statements, and computer programs contain proprietary information of Nintendo of America Inc. and/or Nintendo Company Ltd., and are protected by Federal copyright law. They may not be disclosed to third parties or copied or duplicated in any form, in whole or in part, without the prior written consent of Nintendo. $Revision: 28902 $ *---------------------------------------------------------------------------*/ #ifndef NW_SND_SEQUENCE_SOUND_H_ #define NW_SND_SEQUENCE_SOUND_H_ #include #include #include #include #include #include #include namespace nw { namespace snd { /* ======================================================================== type declarataion ======================================================================== */ class SequenceSoundHandle; namespace internal { namespace driver { class NoteOnCallback; } class SequenceSound; typedef SoundInstanceManager SequenceSoundInstanceManager; class SequenceSound : public BasicSound { friend class SequenceSoundHandle; public: NW_UT_RUNTIME_TYPEINFO; // ダウンキャスト用の実行時型情報を埋め込みます struct StartInfo { s32 seqOffset; driver::SequenceSoundPlayer::OffsetType startOffsetType; int startOffset; }; struct LoadInfo { const SoundArchive* arc; const SoundDataManager* mgr; const LoadItemInfo* seq; const LoadItemInfo* banks; }; /* ------------------------------------------------------------------------ DataLoadTask class ------------------------------------------------------------------------ */ private: typedef void (*NotifyAsyncLoadFinished)( bool result, const LoadItemInfo* seq, const LoadItemInfo banks[], void* userData ); class DataLoadTask : public Task { public: DataLoadTask(); virtual void Execute(); PlayerHeapDataManager* m_pDataManager; PlayerHeap* m_pAllocator; NotifyAsyncLoadFinished m_Callback; void* m_CallbackData; const SoundDataManager* m_pSoundDataManager; const SoundArchive* m_pSoundArchive; LoadItemInfo m_LoadInfoSeq; LoadItemInfo m_LoadInfoBanks[SoundArchive::SEQ_BANK_MAX]; }; /* ------------------------------------------------------------------------ class member ------------------------------------------------------------------------ */ public: SequenceSound( SequenceSoundInstanceManager& manager ); void Setup( driver::SequenceTrackAllocator* trackAllocator, u32 allocTracks, driver::NoteOnCallback* callback ); void Prepare( const void* seqBase, const StartInfo& startInfo ); void SetBankData( const LoadItemInfo banks[] ); // プレイヤーヒープへのロードタスクを登録する // (ロード完了後、必要であれば Prepare 処理が実行される) bool RegisterDataLoadTask( const LoadInfo& loadInfo, const StartInfo& startInfo ); virtual void Initialize(); virtual void Finalize(); virtual bool IsPrepared() const { return m_PreparedFlag; } // パラメータ設定 void SetTempoRatio( f32 tempoRatio ); void SetChannelPriority( int priority ); void SetReleasePriorityFix( bool fix ); void SetSequenceUserprocCallback( SequenceUserprocCallback callback, void* arg ); // パラメータ取得 u32 GetTick() const; // トラックパラメータ設定 void SetTrackMute( u32 trackBitFlag, SeqMute mute ); void SetTrackMute( u32 trackBitFlag, bool muteFlag ); void SetTrackSilence( u32 trackBitFlag, bool silenceFlag, int fadeTimes ); void SetTrackBiquadFilter( u32 trackBitFlag, int type, f32 value ); void SetTrackBankIndex( u32 trackBitFlag, int bankIndex ); void SetTrackVolume( u32 trackBitFlag, f32 volume ); void SetTrackPitch( u32 trackBitFlag, f32 pitch ); void SetTrackPan( u32 trackBitFlag, f32 pan ); void SetTrackSurroundPan( u32 trackBitFlag, f32 surroundPan ); void SetTrackLpfFreq( u32 trackBitFlag, f32 lpfFreq ); void SetTrackPanRange( u32 trackBitFlag, f32 panRange ); void SetTrackModDepth( u32 trackBitFlag, f32 depth ); void SetTrackModSpeed( u32 trackBitFlag, f32 speed ); // シーケンス変数 bool ReadVariable( int varNo, s16* var ) const; static bool ReadGlobalVariable( int varNo, s16* var ); bool ReadTrackVariable( int trackNo, int varNo, s16* var ) const; void WriteVariable( int varNo, s16 var ); static void WriteGlobalVariable( int varNo, s16 var ); void WriteTrackVariable( int trackNo, int varNo, s16 var ); // const driver::SequenceSoundPlayer& GetSequenceSoundPlayer() const { return m_SequenceSoundPlayer; } // デバッグ関数 DebugSoundType GetSoundType() const { return DEBUG_SOUND_TYPE_SEQSOUND; } protected: virtual bool IsAttachedTempSpecialHandle(); virtual void DetachTempSpecialHandle(); virtual driver::BasicSoundPlayer* GetBasicSoundPlayerHandle() { return &m_SequenceSoundPlayerInstance; } virtual void OnUpdatePlayerPriority(); private: void Skip( driver::SequenceSoundPlayer::OffsetType offsetType, int offset ); static void NotifyAsyncLoadFinishedFunc( bool result, const LoadItemInfo* seq, const LoadItemInfo banks[], void* userData ); driver::SequenceSoundPlayer m_SequenceSoundPlayerInstance; SequenceSoundHandle* m_pTempSpecialHandle; SequenceSoundInstanceManager& m_Manager; StartInfo m_StartInfo; DataLoadTask m_DataLoadTask; PlayerHeapDataManager m_DataManager; volatile bool m_LoadingFlag; bool m_PreparedFlag; bool m_InitializeFlag; }; } // namespace nw::snd::internal } // namespace nw::snd } // namespace nw #endif /* NW_SND_SEQUENCE_SOUND_H_ */