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