diff options
-rw-r--r-- | CMakeLists.txt | 15 | ||||
-rw-r--r-- | libADLMIDI-test.pro | 4 | ||||
-rw-r--r-- | src/adlmidi.cpp | 79 | ||||
-rw-r--r-- | src/adlmidi_private.hpp | 2 | ||||
-rw-r--r-- | src/dbopl.cpp | 82 | ||||
-rw-r--r-- | src/dbopl.h | 6 | ||||
-rw-r--r-- | utils/dumpmiles/dumpmiles.cpp | 4 | ||||
-rw-r--r-- | utils/gen_adldata/file_formats/load_op2.h | 2 | ||||
-rw-r--r-- | utils/gen_adldata/gen_adldata.cc | 3 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.cpp | 4 | ||||
-rw-r--r-- | utils/gen_adldata/progs_cache.h | 15 |
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 |