aboutsummaryrefslogtreecommitdiff
path: root/src/chips
diff options
context:
space:
mode:
authorJP Cimalando <jpcima@users.noreply.github.com>2018-04-13 01:27:35 +0200
committerJP Cimalando <jpcima@users.noreply.github.com>2018-04-13 01:27:35 +0200
commit4eedcaafb9eba8d246b21e0471d44bdc9f254125 (patch)
treeb333fc755c776db7ff9db02225dc1a5cb277159e /src/chips
parent147822b9c45dbbc063a42280d4f5d8183662a163 (diff)
downloadlibADLMIDI-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.cpp30
-rw-r--r--src/chips/opl_chip_base.h4
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;
};