aboutsummaryrefslogtreecommitdiff
path: root/src/chips/dosbox_opl3.cpp
diff options
context:
space:
mode:
authorVitaly Novichkov <admin@wohlnet.ru>2018-06-19 15:04:50 +0300
committerVitaly Novichkov <admin@wohlnet.ru>2018-06-19 15:04:50 +0300
commitc0873278718da57ff19194377a35601027926c5f (patch)
tree6fca461d067a1e615788cecf7a74c175f0033fc8 /src/chips/dosbox_opl3.cpp
parent5a194eb263125e5505cca3ec0256c7efa348eaa4 (diff)
parent1026ecd3fd8dc865fb3a85ab4a130d9d1b494fd9 (diff)
downloadlibADLMIDI-c0873278718da57ff19194377a35601027926c5f.tar.gz
libADLMIDI-c0873278718da57ff19194377a35601027926c5f.tar.bz2
libADLMIDI-c0873278718da57ff19194377a35601027926c5f.zip
Merge branch 'master' into stable
Diffstat (limited to 'src/chips/dosbox_opl3.cpp')
-rw-r--r--src/chips/dosbox_opl3.cpp90
1 files changed, 16 insertions, 74 deletions
diff --git a/src/chips/dosbox_opl3.cpp b/src/chips/dosbox_opl3.cpp
index e748b85..af4cb08 100644
--- a/src/chips/dosbox_opl3.cpp
+++ b/src/chips/dosbox_opl3.cpp
@@ -1,22 +1,16 @@
#include "dosbox_opl3.h"
#include "dosbox/dbopl.h"
+#include <new>
#include <cstdlib>
#include <assert.h>
DosBoxOPL3::DosBoxOPL3() :
- OPLChipBase(),
- m_chip(NULL)
+ OPLChipBaseBufferedT(),
+ m_chip(new DBOPL::Handler)
{
reset();
}
-DosBoxOPL3::DosBoxOPL3(const DosBoxOPL3 &c) :
- OPLChipBase(c),
- m_chip(NULL)
-{
- setRate(c.m_rate);
-}
-
DosBoxOPL3::~DosBoxOPL3()
{
DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(m_chip);
@@ -25,23 +19,20 @@ DosBoxOPL3::~DosBoxOPL3()
void DosBoxOPL3::setRate(uint32_t rate)
{
- OPLChipBase::setRate(rate);
- reset();
+ OPLChipBaseBufferedT::setRate(rate);
+ DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(m_chip);
+ chip_r->~Handler();
+ new(chip_r) DBOPL::Handler;
+ chip_r->Init(49716);
}
void DosBoxOPL3::reset()
{
+ OPLChipBaseBufferedT::reset();
DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(m_chip);
- if(m_chip && chip_r)
- delete chip_r;
- m_chip = new DBOPL::Handler;
- chip_r = reinterpret_cast<DBOPL::Handler*>(m_chip);
- chip_r->Init(m_rate);
-}
-
-void DosBoxOPL3::reset(uint32_t rate)
-{
- setRate(rate);
+ chip_r->~Handler();
+ new(chip_r) DBOPL::Handler;
+ chip_r->Init(49716);
}
void DosBoxOPL3::writeReg(uint16_t addr, uint8_t data)
@@ -50,63 +41,14 @@ void DosBoxOPL3::writeReg(uint16_t addr, uint8_t data)
chip_r->WriteReg(static_cast<Bit32u>(addr), data);
}
-int DosBoxOPL3::generate(int16_t *output, size_t frames)
-{
- DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(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<DBOPL::Handler*>(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;
-}
-
-int DosBoxOPL3::generate32(int32_t *output, size_t frames)
-{
- DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(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::generateAndMix32(int32_t *output, size_t frames)
+void DosBoxOPL3::nativeGenerateN(int16_t *output, size_t frames)
{
DBOPL::Handler *chip_r = reinterpret_cast<DBOPL::Handler*>(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;
+ Bitu frames_i = frames;
+ chip_r->GenerateArr(output, &frames_i);
}
const char *DosBoxOPL3::emulatorName()
{
- return "DosBox 0.74 OPL3";
+ return "DosBox 0.74-r4111 OPL3";
}