From 8a0a939a3281a31fc17327d24f0a4c0975a1b9fa Mon Sep 17 00:00:00 2001 From: Vitaly Novichkov Date: Tue, 10 Apr 2018 02:15:03 +0300 Subject: [Experimental] Added support for emulation core switching in real time! Due to clunky playback on updated Nuked OPL3 emulator v 1.8, I kept the Nuked OPL3 1.7.4 work in parallel and be a separated switchable emulator. --- src/chips/dosbox_opl3.cpp | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/chips/dosbox_opl3.cpp (limited to 'src/chips/dosbox_opl3.cpp') diff --git a/src/chips/dosbox_opl3.cpp b/src/chips/dosbox_opl3.cpp new file mode 100644 index 0000000..b696343 --- /dev/null +++ b/src/chips/dosbox_opl3.cpp @@ -0,0 +1,84 @@ +#include "dosbox_opl3.h" +#include "dosbox/dbopl.h" +#include +#include + +DosBoxOPL3::DosBoxOPL3() : + OPLChipBase(), + m_chip(nullptr) +{ + reset(); +} + +DosBoxOPL3::DosBoxOPL3(const DosBoxOPL3 &c) : + OPLChipBase(c), + m_chip(nullptr) +{ + setRate(c.m_rate); +} + +DosBoxOPL3::~DosBoxOPL3() +{ + DBOPL::Handler *chip_r = reinterpret_cast(m_chip); + delete chip_r; +} + +void DosBoxOPL3::setRate(uint32_t rate) +{ + OPLChipBase::setRate(rate); + reset(); +} + +void DosBoxOPL3::reset() +{ + DBOPL::Handler *chip_r = reinterpret_cast(m_chip); + if(m_chip && chip_r) + delete chip_r; + m_chip = new DBOPL::Handler; + chip_r = reinterpret_cast(m_chip); + chip_r->Init(m_rate); +} + +void DosBoxOPL3::reset(uint32_t rate) +{ + setRate(rate); +} + +void DosBoxOPL3::writeReg(uint16_t addr, uint8_t data) +{ + DBOPL::Handler *chip_r = reinterpret_cast(m_chip); + chip_r->WriteReg(static_cast(addr), data); +} + +int DosBoxOPL3::generate(int16_t *output, size_t frames) +{ + DBOPL::Handler *chip_r = reinterpret_cast(m_chip); + ssize_t left = (ssize_t)frames; + while(left > 0) + { + ssize_t frames_i = left; + chip_r->GenerateArr(output, &frames_i); + output += (frames_i * 2); + left -= frames_i; + } + return (int)frames; +} + +int DosBoxOPL3::generateAndMix(int16_t *output, size_t frames) +{ + DBOPL::Handler *chip_r = reinterpret_cast(m_chip); + ssize_t left = (ssize_t)frames; + while(left > 0) + { + ssize_t frames_i = left; + chip_r->GenerateArrMix(output, &frames_i); + output += (frames_i * 2); + left -= frames_i; + } + return (int)frames; +} + +const char *DosBoxOPL3::emulatorName() +{ + return "DosBox 0.74 OPL3"; +} -- cgit v1.2.3