aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CMakeLists.txt15
-rw-r--r--libADLMIDI-test.pro4
-rw-r--r--src/adlmidi.cpp79
-rw-r--r--src/adlmidi_private.hpp2
-rw-r--r--src/dbopl.cpp82
-rw-r--r--src/dbopl.h6
-rw-r--r--utils/dumpmiles/dumpmiles.cpp4
-rw-r--r--utils/gen_adldata/file_formats/load_op2.h2
-rw-r--r--utils/gen_adldata/gen_adldata.cc3
-rw-r--r--utils/gen_adldata/progs_cache.cpp4
-rw-r--r--utils/gen_adldata/progs_cache.h15
11 files changed, 129 insertions, 87 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4728a30..4d9c39b 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -42,7 +42,9 @@ option(USE_DOSBOX_EMULATOR "Use DosBox emulator" OFF)
option(libADLMIDI_STATIC "Build static library of libADLMIDI" ON)
option(libADLMIDI_SHARED "Build shared library of libADLMIDI" OFF)
-
+if(CMAKE_VERSION VERSION_EQUAL "3.1" OR CMAKE_VERSION VERSION_GREATER "3.1")
+ set(CMAKE_CXX_STANDARD 11)
+endif()
set(libADLMIDI_INSTALLS)
@@ -77,14 +79,19 @@ if(WITH_EMBEDDED_BANKS)
if(NOT MSVC)
target_link_libraries(gen_adldata pthread)
endif()
- if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
- message("Turned on C++11 on GCC")
+ if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU" OR
+ CMAKE_CXX_COMPILER_ID STREQUAL "Clang" OR
+ "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel")
+ message("Turned on C++11 on GCC/CLang/Intel")
target_compile_options(gen_adldata PUBLIC $<$<COMPILE_LANGUAGE:CXX>:-std=c++11>)
+ else(CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
+ message("Turned on C++11 on MSVC")
+ target_compile_options(gen_adldata PUBLIC "/std:c++latest")
endif()
add_custom_target(
gen-adldata-run
- COMMAND ${libADLMIDI_BINARY_DIR}/gen_adldata ${libADLMIDI_SOURCE_DIR}/src/adldata.cpp
+ COMMAND gen_adldata ${libADLMIDI_SOURCE_DIR}/src/adldata.cpp
WORKING_DIRECTORY ${libADLMIDI_SOURCE_DIR}
)
add_dependencies(gen-adldata-run gen_adldata)
diff --git a/libADLMIDI-test.pro b/libADLMIDI-test.pro
index 2a285d4..45313b4 100644
--- a/libADLMIDI-test.pro
+++ b/libADLMIDI-test.pro
@@ -31,7 +31,7 @@ HEADERS += \
src/adlmidi_xmi2mid.h \
src/fraction.h \
src/nukedopl3.h \
- #src/dbopl.h \
+ src/dbopl.h \
src/midiplay/wave_writer.h
SOURCES += \
@@ -45,7 +45,7 @@ SOURCES += \
src/adlmidi_private.cpp \
src/adlmidi_xmi2mid.c \
src/nukedopl3.c \
- #src/dbopl.cpp \
+ src/dbopl.cpp \
utils/midiplay/adlmidiplay.cpp \
utils/midiplay/wave_writer.c
diff --git a/src/adlmidi.cpp b/src/adlmidi.cpp
index a7bab22..7aa9e8b 100644
--- a/src/adlmidi.cpp
+++ b/src/adlmidi.cpp
@@ -346,43 +346,6 @@ ADLMIDI_EXPORT void adl_setTempo(struct ADL_MIDIPlayer *device, double tempo)
}
-#ifdef ADLMIDI_USE_DOSBOX_OPL
-
-#define ADLMIDI_CLAMP(V, MIN, MAX) std::max(std::min(V, (MAX)), (MIN))
-
-inline static void SendStereoAudio(MIDIplay::Setup &device,
- int &samples_requested,
- ssize_t &in_size,
- int *_in,
- ssize_t out_pos,
- short *_out)
-{
- if(!in_size) return;
-
- device.stored_samples = 0;
- ssize_t out;
- ssize_t offset;
- ssize_t pos = static_cast<ssize_t>(out_pos);
-
- for(ssize_t p = 0; p < in_size; ++p)
- {
- for(ssize_t w = 0; w < 2; ++w)
- {
- out = _in[p * 2 + w];
- offset = pos + p * 2 + w;
-
- if(offset < samples_requested)
- _out[offset] = static_cast<short>(ADLMIDI_CLAMP(out, static_cast<ssize_t>(INT16_MIN), static_cast<ssize_t>(INT16_MAX)));
- else
- {
- device.backup_samples[device.backup_samples_size] = static_cast<short>(out);
- device.backup_samples_size++;
- device.stored_samples++;
- }
- }
- }
-}
-#else
inline static void SendStereoAudio(MIDIplay::Setup &device,
int &samples_requested,
ssize_t &in_size,
@@ -409,7 +372,6 @@ inline static void SendStereoAudio(MIDIplay::Setup &device,
device.stored_samples += (ssize_t)appendSize;
}
}
-#endif
ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out)
@@ -460,70 +422,51 @@ ADLMIDI_EXPORT int adl_play(ADL_MIDIPlayer *device, int sampleCount, short *out)
setup.delay -= eat_delay;
setup.carry += setup.PCM_RATE * eat_delay;
n_periodCountStereo = static_cast<ssize_t>(setup.carry);
- //n_periodCountPhys = n_periodCountStereo * 2;
setup.carry -= n_periodCountStereo;
if(setup.SkipForward > 0)
setup.SkipForward -= 1;
else
{
- #ifdef ADLMIDI_USE_DOSBOX_OPL
- std::vector<int> out_buf;
- #else
- std::vector<int16_t> out_buf;
- #endif
- out_buf.resize(1024, 0);
-
if((player->atEnd) && (setup.delay <= 0.0))
break;//Stop to fetch samples at reaching the song end with disabled loop
+ //! Count of stereo samples
ssize_t in_generatedStereo = (n_periodCountStereo > 512) ? 512 : n_periodCountStereo;
+ //! Total count of samples
ssize_t in_generatedPhys = in_generatedStereo * 2;
-
+ //! Unsigned total sample count
//fill buffer with zeros
- size_t in_countStereoU = static_cast<size_t>(in_generatedStereo * 2);
+ int16_t *out_buf = player->outBuf;
+ std::memset(out_buf, 0, static_cast<size_t>(in_generatedPhys) * sizeof(int16_t));
if(player->m_setup.NumCards == 1)
{
#ifdef ADLMIDI_USE_DOSBOX_OPL
- player->opl.cards[0].GenerateArr(out_buf.data(), &in_generatedStereo);
+ player->opl.cards[0].GenerateArr(out_buf, &in_generatedStereo);
in_generatedPhys = in_generatedStereo * 2;
#else
- OPL3_GenerateStream(&player->opl.cards[0], out_buf.data(), static_cast<Bit32u>(in_generatedStereo));
+ OPL3_GenerateStream(&player->opl.cards[0], out_buf, static_cast<Bit32u>(in_generatedStereo));
#endif
- /* Process it */
- SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf.data(), gotten_len, out);
}
else if(n_periodCountStereo > 0)
{
- #ifdef ADLMIDI_USE_DOSBOX_OPL
- std::vector<int32_t> in_mixBuffer;
- in_mixBuffer.resize(1024); //n_samples * 2
- ssize_t in_generatedStereo = n_periodCountStereo;
- #endif
- std::memset(out_buf.data(), 0, in_countStereoU * sizeof(short));
-
/* Generate data from every chip and mix result */
for(unsigned card = 0; card < player->m_setup.NumCards; ++card)
{
#ifdef ADLMIDI_USE_DOSBOX_OPL
- player->opl.cards[card].GenerateArr(in_mixBuffer.data(), &in_generatedStereo);
+ player->opl.cards[card].GenerateArrMix(out_buf, &in_generatedStereo);
in_generatedPhys = in_generatedStereo * 2;
- size_t in_samplesCount = static_cast<size_t>(in_generatedPhys);
- for(size_t a = 0; a < in_samplesCount; ++a)
- out_buf[a] += in_mixBuffer[a];
#else
- OPL3_GenerateStreamMix(&player->opl.cards[card], out_buf.data(), static_cast<Bit32u>(in_generatedStereo));
+ OPL3_GenerateStreamMix(&player->opl.cards[card], out_buf, static_cast<Bit32u>(in_generatedStereo));
#endif
}
-
- /* Process it */
- SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf.data(), gotten_len, out);
}
+ /* Process it */
+ SendStereoAudio(setup, sampleCount, in_generatedStereo, out_buf, gotten_len, out);
left -= (int)in_generatedPhys;
gotten_len += (in_generatedPhys) - setup.stored_samples;
- out_buf.clear();
}
setup.delay = player->Tick(eat_delay, setup.mindelay);
diff --git a/src/adlmidi_private.hpp b/src/adlmidi_private.hpp
index a2ec8c1..622e9f2 100644
--- a/src/adlmidi_private.hpp
+++ b/src/adlmidi_private.hpp
@@ -479,6 +479,8 @@ public:
char ____padding2[2];
OPL3 opl;
+ int16_t outBuf[1024];
+
struct Setup
{
unsigned int AdlBank;
diff --git a/src/dbopl.cpp b/src/dbopl.cpp
index 8bb3eb4..fb28e20 100644
--- a/src/dbopl.cpp
+++ b/src/dbopl.cpp
@@ -45,6 +45,10 @@ typedef struct vswprintf {} swprintf;
#include <string.h>
#include "dbopl.h"
+#define DB_MAX(x, y) ((x) > (y) ? (x) : (y))
+#define DB_MIN(x, y) ((x) < (y) ? (x) : (y))
+
+#define DBOPL_CLAMP(V, MIN, MAX) DB_MAX(DB_MIN(V, (MAX)), (MIN))
#ifndef PI
#define PI 3.14159265358979323846
@@ -1482,7 +1486,7 @@ namespace DBOPL
{
while(total > 0)
{
- Bit32u samples = ForwardLFO(total);
+ Bit32u samples = ForwardLFO((Bit32u)total);
memset(output, 0, sizeof(Bit32s) * samples * 2);
int count = 0;
@@ -1497,6 +1501,39 @@ namespace DBOPL
}
}
+ void Chip::GenerateBlock2_Mix(Bitu total, Bit32s *output)
+ {
+ while(total > 0)
+ {
+ Bit32u samples = ForwardLFO((Bit32u)total);
+ int count = 0;
+ for(Channel *ch = chan; ch < chan + 9;)
+ {
+ count++;
+ ch = (ch->*(ch->synthHandler))(this, samples, output);
+ }
+
+ total -= samples;
+ output += samples;
+ }
+ }
+
+ void Chip::GenerateBlock3_Mix(Bitu total, Bit32s *output)
+ {
+ while(total > 0)
+ {
+ Bit32u samples = ForwardLFO(total);
+ int count = 0;
+ for(Channel *ch = chan; ch < chan + 18;)
+ {
+ count++;
+ ch = (ch->*(ch->synthHandler))(this, samples, output);
+ }
+ total -= samples;
+ output += samples * 2;
+ }
+ }
+
void Chip::Setup(Bit32u rate)
{
double original = OPLRATE;
@@ -1955,10 +1992,51 @@ namespace DBOPL
chip.GenerateBlock3(static_cast<Bitu>(*samples), out);
}
+ void Handler::GenerateArr(Bit16s *out, ssize_t *samples)
+ {
+ Bit32s out32[1024];
+ if(GCC_UNLIKELY(*samples > 512))
+ *samples = 512;
+ memset(out32, 0, sizeof(Bit32s) * 1024);
+ if(!chip.opl3Active)
+ chip.GenerateBlock2(static_cast<Bitu>(*samples), out32);
+ else
+ chip.GenerateBlock3(static_cast<Bitu>(*samples), out32);
+ ssize_t sz = *samples * 2;
+ for(ssize_t i = 0; i < sz; i++)
+ out[i] = static_cast<Bit16s>(DBOPL_CLAMP(out32[i], static_cast<ssize_t>(INT16_MIN), static_cast<ssize_t>(INT16_MAX)));
+ }
+
+ void Handler::GenerateArrMix(Bit32s *out, ssize_t *samples)
+ {
+ if(GCC_UNLIKELY(*samples > 512))
+ *samples = 512;
+ if(!chip.opl3Active)
+ chip.GenerateBlock2_Mix(static_cast<Bitu>(*samples), out);
+ else
+ chip.GenerateBlock3_Mix(static_cast<Bitu>(*samples), out);
+ }
+
+ void Handler::GenerateArrMix(Bit16s *out, ssize_t *samples)
+ {
+ Bit32s out32[1024];
+ if(GCC_UNLIKELY(*samples > 512))
+ *samples = 512;
+ memset(out32, 0, sizeof(Bit32s) * 1024);
+ if(!chip.opl3Active)
+ chip.GenerateBlock2(static_cast<Bitu>(*samples), out32);
+ else
+ chip.GenerateBlock3(static_cast<Bitu>(*samples), out32);
+ ssize_t sz = *samples * 2;
+ for(ssize_t i = 0; i < sz; i++)
+ out[i] += static_cast<Bit16s>(DBOPL_CLAMP(out32[i], static_cast<ssize_t>(INT16_MIN), static_cast<ssize_t>(INT16_MAX)));
+ }
+
+
void Handler::Init(Bitu rate)
{
InitTables();
- chip.Setup(rate);
+ chip.Setup((Bit32u)rate);
}
diff --git a/src/dbopl.h b/src/dbopl.h
index 54384da..826cb44 100644
--- a/src/dbopl.h
+++ b/src/dbopl.h
@@ -277,6 +277,9 @@ namespace DBOPL
void GenerateBlock2(Bitu samples, Bit32s *output);
void GenerateBlock3(Bitu samples, Bit32s *output);
+ void GenerateBlock2_Mix(Bitu samples, Bit32s *output);
+ void GenerateBlock3_Mix(Bitu samples, Bit32s *output);
+
void Generate(Bit32u samples);
void Setup(Bit32u r);
@@ -293,6 +296,9 @@ namespace DBOPL
Bitu samples);
void GenerateArr(Bit32s *out, Bitu *samples);
void GenerateArr(Bit32s *out, ssize_t *samples);
+ void GenerateArr(Bit16s *out, ssize_t *samples);
+ void GenerateArrMix(Bit32s *out, ssize_t *samples);
+ void GenerateArrMix(Bit16s *out, ssize_t *samples);
void Init(Bitu rate);
};
diff --git a/utils/dumpmiles/dumpmiles.cpp b/utils/dumpmiles/dumpmiles.cpp
index 832da93..e946c5d 100644
--- a/utils/dumpmiles/dumpmiles.cpp
+++ b/utils/dumpmiles/dumpmiles.cpp
@@ -32,9 +32,9 @@ static void LoadMiles(const char* fn)
unsigned offset = *(unsigned*)&data[a*6+2];
if(gmnumber == 0xFF) break;
- int gmno = gmnumber2==0x7F ? gmnumber+0x80 : gmnumber;
+ //int gmno = gmnumber2==0x7F ? gmnumber+0x80 : gmnumber;
unsigned length = data[offset] + data[offset+1]*256;
- signed char notenum = data[offset+2];
+ //signed char notenum = data[offset+2];
std::printf("%02X %02X ", gmnumber,gmnumber2); //, offset);
for(unsigned b=0; b<length; ++b)
diff --git a/utils/gen_adldata/file_formats/load_op2.h b/utils/gen_adldata/file_formats/load_op2.h
index 58d6988..1e51563 100644
--- a/utils/gen_adldata/file_formats/load_op2.h
+++ b/utils/gen_adldata/file_formats/load_op2.h
@@ -86,7 +86,7 @@ static bool LoadDoom(const char *fn, unsigned bank, const char *prefix)
Doom_opl_instr &ins = *(Doom_opl_instr *) &data[offset2];
- insdata tmp[2];
+ insdata tmp[2] = {InsertNoSoundIns(), InsertNoSoundIns()};
tmp[0].diff = false;
tmp[1].diff = true;
for(unsigned index = 0; index < 2; ++index)
diff --git a/utils/gen_adldata/gen_adldata.cc b/utils/gen_adldata/gen_adldata.cc
index 6c77a12..88981c2 100644
--- a/utils/gen_adldata/gen_adldata.cc
+++ b/utils/gen_adldata/gen_adldata.cc
@@ -4,6 +4,7 @@
#include <cstdio>
#include <string>
#include <cstring>
+#include <inttypes.h>
#include "ini/ini_processing.h"
@@ -390,7 +391,7 @@ int main(int argc, char**argv)
unsigned flags = (i->first.pseudo4op ? 1 : 0) | (info.nosound ? 2 : 0);
fprintf(outFile, " {");
- fprintf(outFile, "%4d,%4d,%3d, %d, %6ld,%6ld,%lf",
+ fprintf(outFile, "%4d,%4d,%3d, %d, %6" PRId64 ",%6" PRId64 ",%lf",
(unsigned) i->first.insno1,
(unsigned) i->first.insno2,
(int)(i->first.notenum),
diff --git a/utils/gen_adldata/progs_cache.cpp b/utils/gen_adldata/progs_cache.cpp
index 4aec9be..b51f4f8 100644
--- a/utils/gen_adldata/progs_cache.cpp
+++ b/utils/gen_adldata/progs_cache.cpp
@@ -100,7 +100,7 @@ size_t InsertIns(
size_t InsertNoSoundIns()
{
// { 0x0F70700,0x0F70710, 0xFF,0xFF, 0x0,+0 },
- insdata tmp1 = { {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}, 0, 0 };
+ insdata tmp1 = { {0x00, 0x10, 0x07, 0x07, 0xF7, 0xF7, 0x00, 0x00, 0xFF, 0xFF, 0x00}, 0, false};
struct ins tmp2 = { 0, 0, 0, false, 0.0 };
- return InsertIns(tmp1, tmp1, tmp2, "nosound");
+ return InsertIns(tmp1, tmp1, tmp2, "nosound", "");
}
diff --git a/utils/gen_adldata/progs_cache.h b/utils/gen_adldata/progs_cache.h
index 007c3b4..b0e63a4 100644
--- a/utils/gen_adldata/progs_cache.h
+++ b/utils/gen_adldata/progs_cache.h
@@ -7,6 +7,7 @@
#include <memory>
#include <cstring>
#include <cstdint>
+#include <string>
#include <vector>
struct insdata
@@ -16,9 +17,13 @@ struct insdata
bool diff;
bool operator==(const insdata &b) const
{
- return std::memcmp(data, b.data, 11) == 0 && finetune == b.finetune && diff == b.diff;
+ return (std::memcmp(data, b.data, 11) == 0) && (finetune == b.finetune) && (diff == b.diff);
}
- bool operator< (const insdata &b) const
+ bool operator!=(const insdata &b) const
+ {
+ return !operator==(b);
+ }
+ bool operator<(const insdata &b) const
{
int c = std::memcmp(data, b.data, 11);
if(c != 0) return c < 0;
@@ -26,9 +31,9 @@ struct insdata
if(diff != b.diff) return (!diff) == (b.diff);
return 0;
}
- bool operator!=(const insdata &b) const
+ bool operator>(const insdata &b) const
{
- return !operator==(b);
+ return !operator<(b) && operator!=(b);
}
};
@@ -79,7 +84,7 @@ extern std::vector<std::string> banknames;
void SetBank(unsigned bank, unsigned patch, size_t insno);
size_t InsertIns(const insdata &id, const insdata &id2, ins &in,
- const std::string &name, const std::string &name2 = "");
+ const std::string &name, const std::string &name2);
size_t InsertNoSoundIns();
#endif // PROGS_H