54 START_OFFSET_TYPE_SAMPLE,
55 START_OFFSET_TYPE_MILLISEC,
63 SETUP_ERR_CANNOT_ALLOCATE_BUFFER,
81 class StrmHeaderLoadTask :
public Task
90 virtual void Execute();
91 virtual void Cancel();
92 virtual void OnCancel();
99 StartOffsetType startOffsetType;
104 class StrmDataLoadTask :
public Task
117 virtual void Execute();
118 virtual void Cancel();
119 virtual void OnCancel();
124 StrmPlayer *mStrmPlayer;
129 s32 mBufferBlockIndex;
130 bool mNeedUpdateAdpcmLoop;
138 virtual ~StrmPlayer();
142 virtual bool Start();
144 virtual void Pause(
bool flag);
145 virtual bool IsActive()
const {
return mActiveFlag; }
146 virtual bool IsStarted()
const {
return mStartedFlag; }
147 virtual bool IsPause()
const {
return mPauseFlag; }
150 virtual void OnUpdateFrameSoundThread() { Update(); }
151 virtual void OnUpdateVoiceSoundThread() { UpdateBuffer(); }
152 virtual void OnShutdownSoundThread() { Stop(); }
155 SetupResult Setup(StrmBufferPool *bufferPool,
int allocChannelCount,
156 u16 allocTrackFlag,
int voiceOutCount);
160 bool IsPrepared()
const {
return mPreparedFlag; }
161 StrmChannel *GetTrackChannel(
StrmTrack const &track,
int channelIndex);
164 void SetTaskErrorFlag() { mTaskErrorFlag =
true; }
165 void SetTaskCancelFlag() { mTaskCancelFlag =
true; }
169 return mStrmInfo.sampleFormat == SAMPLE_FORMAT_DSP_ADPCM;
171 bool CheckDiskDriveError()
const;
173 void SetAdpcmLoopContext(
int channelNum, u16 *predScale);
174 void SetTrackVolume(ulong trackBitFlag, f32 volume);
175 ulong GetPlaySamplePosition()
const;
177 bool ReadStrmDataInfo(StrmDataInfo*)
const;
180 bool Prepare(ut::FileStream *fileStream,
181 StartOffsetType startOffsetType,
int startOffset);
183 bool LoadHeader(ut::FileStream *fileStream,
184 StartOffsetType startOffsetType,
int startOffset);
185 bool LoadStreamData(ut::FileStream *fileStream,
int offset, ulong size,
186 ulong blockSize,
int bufferBlockIndex,
187 bool needUpdateAdpcmLoop);
189 bool AllocStrmBuffers();
190 void FreeStrmBuffers();
192 bool AllocVoices(
int voiceOutCount);
195 int CalcLoadingBufferBlockCount()
const;
196 bool CalcStartOffset(s32 *startBlockIndex, ulong *startBlockOffset,
199 void SetLoopEndToZeroBuffer(
int endBufferBlockIndex);
202 void UpdatePauseStatus();
203 void UpdateLoadingBlockIndex();
204 void UpdatePlayingBlockIndex();
205 void UpdateLoopAddress(ulong loopStartSamples, ulong loopEndSamples);
206 void UpdateDataLoopAddress(s32 endBlockBufferIndex);
207 void UpdateVoiceParams(
StrmTrack *track);
209 static ulong GetSampleByByte(ulong
byte, SampleFormat format);
212 static void VoiceCallbackFunc(Voice *voice,
213 Voice::VoiceCallbackStatus status,
218 static int const LOAD_BUFFER_SIZE = 0x4000;
219 static int const LOAD_BUFFER_CHANNEL_NUM;
220 static int const BUFFER_BLOCK_COUNT_MAX = 32;
221 static int const STRM_CHANNEL_NUM_PER_TRACK;
222 static int const STRM_CHANNEL_NUM = 16;
223 static int const DATA_BLOCK_SIZE_MAX = 0x2000;
224 static int const STRM_TRACK_NUM = 8;
227 static bool sStaticInitFlag;
228 static OSMutex sLoadBufferMutex;
229 static byte_t sLoadBuffer[LOAD_BUFFER_SIZE];
235 StrmFileReader::StrmInfo mStrmInfo;
236 bool volatile mSetupFlag;
241 bool mTaskCancelFlag;
242 bool mLoadingDelayFlag;
246 bool mNoRealtimeLoadFlag;
247 bool mSkipUpdateAdpcmLoop;
248 bool mValidAdpcmLoop;
249 bool mPlayFinishFlag;
250 bool mLoadFinishFlag;
251 bool mAllocStrmBufferFlag;
254 int mChangeNumBlocks;
256 int mBufferBlockCount;
257 int mBufferBlockCountBase;
258 int mLoadingBufferBlockCount;
259 int mLoadingBufferBlockIndex;
260 int mLoadingDataBlockIndex;
261 int mPlayingBufferBlockCount;
262 int mPlayingBufferBlockIndex;
263 int mPlayingDataBlockIndex;
264 int mLoopStartBlockIndex;
267 StartOffsetType mStartOffsetType;
270 StrmDataLoadTask::LinkList mStrmDataLoadTaskList;
271 InstancePool<StrmDataLoadTask> mStrmDataLoadTaskPool;
273 StrmBufferPool *mBufferPool;
274 ut::FileStream *mFileStream;
278 StrmChannel mChannels[STRM_CHANNEL_NUM];