diff options
Diffstat (limited to 'sound/mods/paula.h')
-rw-r--r-- | sound/mods/paula.h | 77 |
1 files changed, 70 insertions, 7 deletions
diff --git a/sound/mods/paula.h b/sound/mods/paula.h index e3c6002451..647dc5fe56 100644 --- a/sound/mods/paula.h +++ b/sound/mods/paula.h @@ -40,12 +40,29 @@ namespace Audio { class Paula : public AudioStream { public: static const int NUM_VOICES = 4; + enum { + kPalSystemClock = 7093790, + kNtscSystemClock = 7159090, + kPalCiaClock = kPalSystemClock / 10, + kNtscCiaClock = kNtscSystemClock / 10, + kPalPaulaClock = kPalSystemClock / 2, + kNtscPauleClock = kNtscSystemClock / 2 + }; - Paula(bool stereo = false, int rate = 44100, int interruptFreq = 0); + Paula(bool stereo = false, int rate = 44100, uint interruptFreq = 0); ~Paula(); bool playing() const { return _playing; } - void setInterruptFreq(int freq) { _curInt = _intFreq = freq; } + void setTimerBaseValue( uint32 ticksPerSecond ) { _timerBase = ticksPerSecond; } + uint32 getTimerBaseValue() { return _timerBase; } + void setSingleInterrupt(uint sampleDelay) { assert(sampleDelay < _intFreq); _curInt = sampleDelay; } + void setSingleInterruptUnscaled(uint timerDelay) { + setSingleInterrupt((uint)(((double)timerDelay * getRate()) / _timerBase)); + } + void setInterruptFreq(uint sampleDelay) { _intFreq = sampleDelay; _curInt = 0; } + void setInterruptFreqUnscaled(uint timerDelay) { + setInterruptFreq((uint)(((double)timerDelay * getRate()) / _timerBase)); + } void clearVoice(byte voice); void clearVoices() { for (int i = 0; i < NUM_VOICES; ++i) clearVoice(i); } void startPlay(void) { _playing = true; } @@ -68,6 +85,7 @@ protected: byte volume; frac_t offset; byte panning; // For stereo mixing: 0 = far left, 255 = far right + int dmaCount; }; bool _end; @@ -90,6 +108,21 @@ protected: _voice[channel].panning = panning; } + void disableChannel(byte channel) { + assert(channel < NUM_VOICES); + _voice[channel].data = 0; + } + + void enableChannel(byte channel) { + assert(channel < NUM_VOICES); + Channel &ch = _voice[channel]; + ch.data = ch.dataRepeat; + ch.length = ch.lengthRepeat; + // actually first 2 bytes are dropped? + ch.offset = intToFrac(0); + // ch.period = ch.periodRepeat; + } + void setChannelPeriod(byte channel, int16 period) { assert(channel < NUM_VOICES); _voice[channel].period = period; @@ -100,6 +133,17 @@ protected: _voice[channel].volume = volume; } + void setChannelSampleStart(byte channel, const int8 *data) { + assert(channel < NUM_VOICES); + _voice[channel].dataRepeat = data; + } + + void setChannelSampleLen(byte channel, uint32 length) { + assert(channel < NUM_VOICES); + assert(length < 32768/2); + _voice[channel].lengthRepeat = 2 * length; + } + void setChannelData(uint8 channel, const int8 *data, const int8 *dataRepeat, uint32 length, uint32 lengthRepeat, int32 offset = 0) { assert(channel < NUM_VOICES); @@ -110,11 +154,14 @@ protected: assert(lengthRepeat < 32768); Channel &ch = _voice[channel]; - ch.data = data; + + ch.dataRepeat = data; + ch.lengthRepeat = length; + enableChannel(channel); + ch.offset = intToFrac(offset); + ch.dataRepeat = dataRepeat; - ch.length = length; ch.lengthRepeat = lengthRepeat; - ch.offset = intToFrac(offset); } void setChannelOffset(byte channel, frac_t offset) { @@ -128,13 +175,29 @@ protected: return _voice[channel].offset; } + int getChannelDmaCount(byte channel) { + assert(channel < NUM_VOICES); + return _voice[channel].dmaCount; + } + + void setChannelDmaCount(byte channel, int dmaVal = 0) { + assert(channel < NUM_VOICES); + _voice[channel].dmaCount = dmaVal; + } + + void setAudioFilter(bool enable) { + // TODO: implement + } + private: Channel _voice[NUM_VOICES]; const bool _stereo; const int _rate; - int _intFreq; - int _curInt; + const double _periodScale; + uint _intFreq; + uint _curInt; + uint32 _timerBase; bool _playing; template<bool stereo> |