/*---------------------------------------------------------------------------* 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: 20021 $ *---------------------------------------------------------------------------*/ #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; // ダウンキャスト用の実行時型情報を埋め込みます static const size_t FILE_STREAM_BUFFER_SIZE = 512; /* ------------------------------------------------------------------------ SeqLoadTask class ------------------------------------------------------------------------ */ private: typedef void (*NotifyAsyncEndCallback)( bool result, const void* seqBase, void* userData ); class SeqLoadTask : public Task { public: SeqLoadTask(); virtual void Execute(); io::FileStream* m_pFileStream; void* m_pBuffer; int m_BufferSize; NotifyAsyncEndCallback m_Callback; void* m_CallbackData; }; /* ------------------------------------------------------------------------ class member ------------------------------------------------------------------------ */ public: SequenceSound( SequenceSoundInstanceManager& manager ); void Setup( driver::SequenceTrackAllocator* trackAllocator, u32 allocTracks, driver::NoteOnCallback* callback, const void* bankFiles[], u32 bankFileCount ); void Prepare( const void* seqBase, s32 seqOffset, driver::SequenceSoundPlayer::OffsetType startOffsetType, int startOffset ); void Prepare( io::FileStream* fileStream, s32 seqOffset, driver::SequenceSoundPlayer::OffsetType startOffsetType, int startOffset ); virtual void Initialize(); virtual void Finalize(); virtual bool IsPrepared() const { return m_PreparedFlag; } void* GetFileStreamBuffer() { return m_FileStreamBuffer; } size_t GetFileStreamBufferSize() { return FILE_STREAM_BUFFER_SIZE; } // パラメータ設定 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: bool LoadData( NotifyAsyncEndCallback callback, void* callbackArg ); void Skip( driver::SequenceSoundPlayer::OffsetType offsetType, int offset ); // プレイヤーヒープロードの完了コールバック static void NotifyLoadAsyncEndSeqData( bool result, const void* seqBase, void* userData ); driver::SequenceSoundPlayer m_SequenceSoundPlayerInstance; SequenceSoundHandle* m_pTempSpecialHandle; SequenceSoundInstanceManager& m_Manager; s32 m_SeqOffset; driver::SequenceSoundPlayer::OffsetType m_StartOffsetType; int m_StartOffset; volatile bool m_LoadingFlag; volatile bool m_PreparedFlag; io::FileStream* m_pFileStream; int m_FileStreamBuffer[ FILE_STREAM_BUFFER_SIZE/sizeof(int) ]; SeqLoadTask m_SeqLoadTask; bool m_InitializeFlag; }; } // namespace nw::snd::internal } // namespace nw::snd } // namespace nw #endif /* NW_SND_SEQUENCE_SOUND_H_ */