22 #ifndef MADS_DRAGONSPHERE_ASOUND_H 23 #define MADS_DRAGONSPHERE_ASOUND_H 25 #include "audio/fmopl.h" 26 #include "common/mutex.h" 27 #include "common/queue.h" 28 #include "common/util.h" 29 #include "mads/core/sound_manager.h" 32 namespace Dragonsphere {
34 #define ADLIB_CHANNEL_COUNT 9 37 static bool _isDisabled;
41 uint8 _activeCount = 0;
43 uint8 _volumeFadeStep = 0;
44 uint8 _vibratoDepth = 0;
46 uint8 _sampleIndex = 0;
48 uint8 _noteOffset = 0;
49 uint8 _durationOverride = 0;
50 uint8 _keyOnDelay = 0;
51 uint8 _fadePeriodCounter = 0;
52 uint8 _fadePeriodReload = 0;
53 uint8 _arpPeriodCounter = 0;
54 uint8 _vibPeriodCounter = 0;
55 uint8 _vibPeriodReload = 0;
56 uint8 _patchAttenuation = 0;
58 uint8 _writeVolumePending = 0;
59 uint8 _arpPeriodReload = 0;
60 uint8 _arpCounterReload = 0;
64 byte *_loopStartPtr =
nullptr;
65 byte *_pSrc =
nullptr;
66 byte *_innerLoopPtr =
nullptr;
67 byte *_outerLoopPtr =
nullptr;
68 byte *_soundData =
nullptr;
69 byte *_branchTargetPtr =
nullptr;
73 uint16 _innerLoopCount = 0;
74 uint16 _outerLoopCount = 0;
75 uint16 _noiseFreqMask = 0;
76 uint16 _freqAccum = 0;
85 uint8 _cachedCarrierTL = 0;
86 uint8 _savedFreqSweep = 0;
87 uint8 _freqSweepCounter = 0;
88 uint8 _savedSweepCounter = 0;
94 uint8 _octaveTranspose = 0;
95 uint8 _pendingStop = 0;
96 uint8 _vibratoMode = 0;
109 void load(byte *soundData);
138 uint8 _attackRate = 0;
139 uint8 _decayRate = 0;
140 uint8 _sustainLevel = 0;
141 uint8 _releaseRate = 0;
144 uint8 _totalLevel = 0;
145 uint8 _scalingLevel = 0;
146 uint8 _waveformSelect = 0;
147 uint8 _freqMultiple = 0;
152 uint8 _freqSweepInit = 0;
154 uint16 _freqMask = 0;
155 uint16 _freqBase = 0;
156 uint16 _outerLoopPtr = 0;
194 typedef void (
ASound::*CallbackFunction)();
200 uint16 _callbackCounter = 0;
201 uint16 _callbackPeriod = 0;
205 CallbackFunction _callbackFnPtr =
nullptr;
209 uint8 _activeChannelNumber = 0;
210 uint16 _activeChannelReg = 0;
211 uint16 _currentOpBase = 0;
215 byte *pSrc =
nullptr;
216 int16 _pollResult = 0;
217 int16 _resultFlag = 0;
218 uint16 _randomSeed = 0x4D2;
221 uint16 _isDisabled = 0;
222 uint8 _findChannelMode = 0;
229 uint8 _anySweepActive = 0;
230 int _frameNumber2 = 0;
233 uint8 _scriptVars[32] = {};
237 uint16 _musicIndex = 0;
240 uint8 _musicOnlyFlag = 0;
241 uint16 _tempoFineStep = 0;
242 uint16 _tempoCoarseStep = 0;
243 uint16 _tempoPeriod = 0;
244 uint8 _tempoEnabled = 0;
245 uint16 _tempoTickCounter = 0;
246 uint16 _tempoShift = 0;
256 void clearCallback();
257 void resetCallback() {
267 void adlib_channelOff(uint8 portIndex);
294 void writeFrequency();
300 void writePitchBend();
308 void writeArpeggio();
328 void writeSampleRegs();
350 void update1(
int channelIndex);
356 void setFrequency(uint8 voice, uint16 freq);
363 void noise_inner(
int channelIndex);
368 void updateAllChannels();
374 uint16 readWord_impl();
389 &_channel0, &_channel1, &_channel2,
390 &_channel3, &_channel4, &_channel5,
391 &_channel6, &_channel7, &_channel8
394 uint8 _adlibPorts[0x100] = { 0 };
407 int isMusicChannelsActive();
413 int isAnyChannelActive();
428 _callbackFnPtr =
nullptr;
429 _callbackCounter = period;
430 _callbackPeriod = period;
438 _callbackFnPtr =
nullptr;
439 _callbackCounter = counter;
440 _callbackPeriod = period;
454 void write(uint8 reg, uint8 value);
457 uint16 getRandomNumber();
465 void adlib_channelOn(uint8 portIndex);
468 void signalSoundPlaying();
474 void pollAllChannels();
494 void pollActiveChannel();
497 bool isSoundActive(byte *ptr)
const;
504 void findFreeChannel(byte *soundData);
511 void findFreeChannelFull(byte *soundData);
515 return &_soundData[offset];
594 virtual void callFunction(uint16 offset);
613 static void validate(
bool isDemo);
624 int dataOffset,
int dataSize);
631 virtual int stop()
override;
640 void noise()
override;
646 void playSound(
int offset);
void scheduleCallback(CallbackFunction fn)
Definition: asound.h:421
void setVolume(int volume) override
Definition: asound.h:648
void setScriptVar(int idx, uint8 val)
Definition: asound.h:449
static OPL * create(DriverId driver, OplType type)
void processChannelFade()
byte * loadData(int offset)
Definition: asound.h:514
Definition: sound_manager.h:38
Definition: anim_timer.h:27
void load(byte *soundData)
void resetCallbackTimerEx(uint16 counter, uint16 period)
Definition: asound.h:437
void setMusicIndex(uint16 idx)
Definition: asound.h:444
uint16 getMusicIndex() const
Definition: asound.h:446
void resetCallbackTimer(uint16 period)
Definition: asound.h:427