47 class SeqPlayer :
public BasicPlayer,
65 SETUP_ERR_CANNOT_ALLOCATE_TRACK,
86 typedef void SeqUserprocCallback(u16 procId,
100 virtual void Pause(
bool flag);
101 virtual bool IsActive()
const {
return mActiveFlag; }
102 virtual bool IsStarted()
const {
return mStartedFlag; }
103 virtual bool IsPause()
const {
return mPauseFlag; }
106 virtual void InvalidateData(
void const *start,
void const *end);
107 virtual void InvalidateWaveData(
void const *,
void const *) {}
113 virtual void ChannelCallback(Channel *channel ATTR_UNUSED) {}
116 virtual void OnUpdateFrameSoundThread() { Update(); }
117 virtual void OnShutdownSoundThread() { Stop(); }
120 SetupResult Setup(SeqTrackAllocator *trackAllocator, ulong allocTracks,
121 int voiceOutCount, NoteOnCallback *callback);
123 void Skip(OffsetType offsetType,
int offset);
126 bool IsReleasePriorityFix()
const {
return mReleasePriorityFixFlag; }
127 f32 GetPanRange()
const {
return mPanRange; }
128 int GetVoiceOutCount()
const {
return mVoiceOutCount; }
130 SeqTrack *GetPlayerTrack(
int trackNo);
131 s16
volatile *GetVariablePtr(
int varNo);
133 s16 GetLocalVariable(
int varNo)
const;
134 void SetLocalVariable(
int varNo, s16 value);
135 static void SetGlobalVariable(
int varNo, s16 value);
137 void SetTempoRatio(f32 tempo);
138 void SetReleasePriorityFix(
bool fix);
139 void SetChannelPriority(
int priority);
140 void SetSeqUserprocCallback(SeqUserprocCallback *callback,
void *arg);
141 void SetPlayerTrack(
int trackNo, SeqTrack *track);
143 f32 CalcTickPerMsec()
const
145 return CalcTickPerMinute() / (60 * 1000);
147 f32 CalcTickPerMinute()
const
149 return mParserParam.timebase * mParserParam.tempo * mTempoRatio;
152 ulong GetTickCounter()
const {
156 void SetSeqData(
void const *seqBase, s32 seqOffset);
158 void CallSeqUserprocCallback(u16 procId, SeqTrack *track);
159 Channel *NoteOn(
int bankNo, NoteOnInfo
const ¬eOnInfo);
161 void SetTrackMute(ulong trackFlags, SeqMute mute);
162 void SetTrackSilence(ulong trackFlags,
bool silence,
int fadeFrames);
163 void SetTrackVolume(ulong trackFlags, f32 volume);
165 static void InitSeqPlayer();
168 void InitParam(
int voiceOutCount, NoteOnCallback *callback);
170 void UpdateChannelParam();
172 void CloseTrack(
int trackNo);
175 int ParseNextTick(
bool doNoteOn);
176 void UpdateTick(
int msec);
179 template <
typename T>
180 void SetTrackParam(ulong trackFlags,
void (SeqTrack::*pSetter)(T), T param) {
181 ut::AutoInterruptLock lock;
183 for (
int i = 0; i < TRACK_NUM && trackFlags != 0;
184 trackFlags >>= 1, i++) {
186 if (trackFlags & 1) {
187 SeqTrack* pTrack = GetPlayerTrack(i);
189 if (pTrack != NULL) {
190 (pTrack->*pSetter)(param);
196 template <
typename T,
typename U>
197 void SetTrackParam(ulong trackFlags,
void (SeqTrack::*pSetter)(T, U), T param, U param2) {
198 ut::AutoInterruptLock lock;
200 for (
int i = 0; i < TRACK_NUM && trackFlags != 0;
201 trackFlags >>= 1, i++) {
203 if (trackFlags & 1) {
204 SeqTrack* pTrack = GetPlayerTrack(i);
206 if (pTrack != NULL) {
207 (pTrack->*pSetter)(param, param2);
215 static int const MAX_SKIP_TICK_PER_FRAME = 768;
216 static int const DEFAULT_TEMPO = 120;
217 static int const DEFAULT_TIMEBASE = 48;
218 static int const VARIABLE_DEFAULT_VALUE = -1;
219 static int const TRACK_NUM_PER_PLAYER = 16;
220 static int const GLOBAL_VARIABLE_NUM = 16;
221 static int const PLAYER_VARIABLE_NUM = 16;
223 static const int TRACK_NUM = 16;
226 static s16 mGlobalVariable[GLOBAL_VARIABLE_NUM];
236 bool mReleasePriorityFixFlag;
240 ulong mSkipTickCounter;
241 f32 mSkipTimeCounter;
244 SeqTrackAllocator *mSeqTrackAllocator;
245 SeqUserprocCallback *mSeqUserprocCallback;
246 void *mSeqUserprocCallbackArg;
247 SeqTrack *mTracks[TRACK_NUM_PER_PLAYER];
248 s16
volatile mLocalVariable[PLAYER_VARIABLE_NUM];