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