23 #if !defined(AUDIO_MODS_TFMX_H) && (defined(ENABLE_SCUMM) || defined(DYNAMIC_MODULES)) 24 #define AUDIO_MODS_TFMX_H 26 #include "audio/mods/paula.h" 30 class Tfmx :
public Paula {
32 Tfmx(
int rate,
bool stereo);
42 void stopSong(
bool stopAudio =
true) {
Common::StackLock lock(_mutex); stopSongImpl(stopAudio); }
52 void doSong(
int songPos,
bool stopAudio =
false);
61 int doSfx(uint16 sfxIndex,
bool unlockChannel =
false);
67 void stopMacroEffect(
int channel);
69 void doMacro(
int note,
int macro,
int relVol = 0,
int finetune = 0,
int channelNo = 0);
70 int getTicks()
const {
return _playerCtx.tickCount; }
71 int getSongIndex()
const {
return _playerCtx.song; }
72 void setSignalPtr(uint16 *ptr, uint16 numSignals) { _playerCtx.signal = ptr; _playerCtx.numSignals = numSignals; }
73 void freeResources() { _deleteResource =
true; freeResourceDataImpl(); }
75 void setModuleData(Tfmx &otherPlayer);
81 enum { kPalDefaultCiaVal = 11822, kNtscDefaultCiaVal = 14320, kCiaBaseInterval = 0x1B51F8 };
82 enum { kNumVoices = 4, kNumChannels = 8, kNumSubsongs = 32, kMaxPatternOffsets = 128, kMaxMacroOffsets = 128 };
85 const byte *mdatAlloc;
97 } subsong[kNumSubsongs];
99 uint32 trackstepOffset;
100 uint32 sfxTableOffset;
102 uint32 patternOffset[kMaxPatternOffsets];
103 uint32 macroOffset[kMaxMacroOffsets];
105 void boundaryCheck(
const void *address,
size_t accessLen = 1)
const {
106 assert(mdatAlloc <= address && (
const byte *)address + accessLen <= (
const byte *)mdatData + mdatLen);
110 struct SampleResource {
111 const int8 *sampleData;
114 void boundaryCheck(
const void *address,
size_t accessLen = 2)
const {
115 assert(sampleData <= address && (
const byte *)address + accessLen <= (
const byte *)sampleData + sampleLen);
119 bool _deleteResource;
121 bool hasResources() {
122 return _resource && _resource->mdatLen && _resourceSample.sampleLen;
125 struct ChannelContext {
131 uint32 macroReturnOffset;
133 uint16 macroReturnStep;
134 uint8 macroLoopCount;
139 uint8 customMacroIndex;
140 uint8 customMacroPrio;
175 uint8 addBeginLength;
178 } _channelCtx[kNumVoices];
180 struct PatternContext {
190 } _patternCtx[kNumChannels];
192 struct TrackStepContext {
199 struct PlayerContext {
217 bool stopWithLastPattern;
220 const byte *getSfxPtr(uint16 index = 0)
const {
221 const byte *sfxPtr = (
const byte *)(_resource->mdatData + _resource->sfxTableOffset + index * 8);
223 _resource->boundaryCheck(sfxPtr, 8);
227 const uint16 *getTrackPtr(uint16 trackstep = 0)
const {
228 const uint16 *trackData = (
const uint16 *)(_resource->mdatData + _resource->trackstepOffset + 16 * trackstep);
230 _resource->boundaryCheck(trackData, 16);
234 const uint32 *getPatternPtr(uint32 offset)
const {
235 const uint32 *pattData = (
const uint32 *)(_resource->mdatData + offset);
237 _resource->boundaryCheck(pattData, 4);
241 const uint32 *getMacroPtr(uint32 offset)
const {
242 const uint32 *macroData = (
const uint32 *)(_resource->mdatData + offset);
244 _resource->boundaryCheck(macroData, 4);
248 const int8 *getSamplePtr(
const uint32 offset)
const {
249 const int8 *sample = _resourceSample.sampleData + offset;
251 _resourceSample.boundaryCheck(sample, 2);
255 static inline void initMacroProgramm(ChannelContext &channel);
256 static inline void clearEffects(ChannelContext &channel);
257 static inline void haltMacroProgramm(ChannelContext &channel);
258 static inline void unlockMacroChannel(ChannelContext &channel);
259 static inline void initPattern(PatternContext &pattern, uint8 cmd, int8 expose, uint32 offset);
260 void stopSongImpl(
bool stopAudio =
true);
261 static inline void setNoteMacro(ChannelContext &channel, uint note,
int fineTune);
262 void initFadeCommand(
const uint8 fadeTempo,
const int8 endVol);
263 void setModuleData(
const MdatResource *resource,
const int8 *sampleData, uint32 sampleLen,
bool autoDelete =
true);
266 void freeResourceDataImpl();
267 void effects(ChannelContext &channel);
268 void macroRun(ChannelContext &channel);
269 void advancePatterns();
270 bool patternRun(PatternContext &pattern);
271 bool trackRun(
bool incStep =
false);
272 void noteCommand(uint8 note, uint8 param1, uint8 param2, uint8 param3);
277 #endif // !defined(AUDIO_MODS_TFMX_H)