diff options
author | JP Cimalando <jpcima@users.noreply.github.com> | 2018-04-13 01:27:35 +0200 |
---|---|---|
committer | JP Cimalando <jpcima@users.noreply.github.com> | 2018-04-13 01:27:35 +0200 |
commit | 4eedcaafb9eba8d246b21e0471d44bdc9f254125 (patch) | |
tree | b333fc755c776db7ff9db02225dc1a5cb277159e /src/chips | |
parent | 147822b9c45dbbc063a42280d4f5d8183662a163 (diff) | |
download | libADLMIDI-4eedcaafb9eba8d246b21e0471d44bdc9f254125.tar.gz libADLMIDI-4eedcaafb9eba8d246b21e0471d44bdc9f254125.tar.bz2 libADLMIDI-4eedcaafb9eba8d246b21e0471d44bdc9f254125.zip |
general 32bit generator methods, like OPNMIDI
Diffstat (limited to 'src/chips')
-rw-r--r-- | src/chips/opl_chip_base.cpp | 30 | ||||
-rw-r--r-- | src/chips/opl_chip_base.h | 4 |
2 files changed, 32 insertions, 2 deletions
diff --git a/src/chips/opl_chip_base.cpp b/src/chips/opl_chip_base.cpp index 65d4b73..4a7c4f5 100644 --- a/src/chips/opl_chip_base.cpp +++ b/src/chips/opl_chip_base.cpp @@ -20,3 +20,33 @@ void OPLChipBase::reset(uint32_t rate) { setRate(rate); } + +int OPLChipBase::generate32(int32_t *output, size_t frames) +{ + enum { maxFramesAtOnce = 256 }; + int16_t temp[2 * maxFramesAtOnce]; + for(size_t left = frames; left > 0;) { + size_t count = (left < maxFramesAtOnce) ? left : maxFramesAtOnce; + generate(temp, count); + for(size_t i = 0; i < 2 * count; ++i) + output[i] = temp[i]; + left -= count; + output += 2 * count; + } + return (int)frames; +} + +int OPLChipBase::generateAndMix32(int32_t *output, size_t frames) +{ + enum { maxFramesAtOnce = 256 }; + int16_t temp[2 * maxFramesAtOnce]; + for(size_t left = frames; left > 0;) { + size_t count = (left < maxFramesAtOnce) ? left : maxFramesAtOnce; + generate(temp, count); + for(size_t i = 0; i < 2 * count; ++i) + output[i] += temp[i]; + left -= count; + output += 2 * count; + } + return (int)frames; +} diff --git a/src/chips/opl_chip_base.h b/src/chips/opl_chip_base.h index 70f9375..3ab4cb8 100644 --- a/src/chips/opl_chip_base.h +++ b/src/chips/opl_chip_base.h @@ -19,8 +19,8 @@ public: virtual void writeReg(uint16_t addr, uint8_t data) = 0; virtual int generate(int16_t *output, size_t frames) = 0; virtual int generateAndMix(int16_t *output, size_t frames) = 0; - virtual int generate32(int32_t *output, size_t frames) = 0; - virtual int generateAndMix32(int32_t *output, size_t frames) = 0; + virtual int generate32(int32_t *output, size_t frames); + virtual int generateAndMix32(int32_t *output, size_t frames); virtual const char* emulatorName() = 0; }; |