diff options
author | JP Cimalando <jpcima@users.noreply.github.com> | 2018-05-16 15:16:15 +0200 |
---|---|---|
committer | JP Cimalando <jpcima@users.noreply.github.com> | 2018-05-16 15:22:20 +0200 |
commit | e0576650d4b235c291ca68bf8d5aa6b7f6d3b6cf (patch) | |
tree | 1c03adad5b6ecd4673f9138d096f0f13476f819d | |
parent | a8ec2f990a624136ca3eefa39e3e87e92aea5a2e (diff) | |
download | libADLMIDI-e0576650d4b235c291ca68bf8d5aa6b7f6d3b6cf.tar.gz libADLMIDI-e0576650d4b235c291ca68bf8d5aa6b7f6d3b6cf.tar.bz2 libADLMIDI-e0576650d4b235c291ca68bf8d5aa6b7f6d3b6cf.zip |
make the AdlInstrumentTester a P-Impl
-rw-r--r-- | include/adlmidi.hpp | 21 | ||||
-rw-r--r-- | src/adlmidi_midiplay.cpp | 57 |
2 files changed, 44 insertions, 34 deletions
diff --git a/include/adlmidi.hpp b/include/adlmidi.hpp index 63f2abd..6d01b8d 100644 --- a/include/adlmidi.hpp +++ b/include/adlmidi.hpp @@ -24,24 +24,15 @@ #ifndef ADLMIDI_HPP #define ADLMIDI_HPP -#include "adlmidi.h" - -#include <stdint.h> -#include <vector> - -class OPL3; -class MIDIplay; +struct ADL_MIDIPlayer; class AdlInstrumentTester { - uint32_t cur_gm; - uint32_t ins_idx; - std::vector<uint32_t> adl_ins_list; - OPL3 *opl; - MIDIplay * play; + struct Impl; + Impl *P; public: - AdlInstrumentTester(ADL_MIDIPlayer *device); + explicit AdlInstrumentTester(ADL_MIDIPlayer *device); virtual ~AdlInstrumentTester(); // Find list of adlib instruments that supposedly implement this GM @@ -51,6 +42,10 @@ public: void NextGM(int offset); void NextAdl(int offset); bool HandleInputChar(char ch); + +private: + AdlInstrumentTester(const AdlInstrumentTester &); + AdlInstrumentTester &operator=(const AdlInstrumentTester &); }; #endif //ADLMIDI_HPP diff --git a/src/adlmidi_midiplay.cpp b/src/adlmidi_midiplay.cpp index 69c1808..9ccd3f8 100644 --- a/src/adlmidi_midiplay.cpp +++ b/src/adlmidi_midiplay.cpp @@ -2517,35 +2517,47 @@ retry_arpeggio: #ifndef ADLMIDI_DISABLE_CPP_EXTRAS +struct AdlInstrumentTester::Impl +{ + uint32_t cur_gm; + uint32_t ins_idx; + std::vector<uint32_t> adl_ins_list; + OPL3 *opl; + MIDIplay *play; +}; + ADLMIDI_EXPORT AdlInstrumentTester::AdlInstrumentTester(ADL_MIDIPlayer *device) + : P(new Impl) { - cur_gm = 0; - ins_idx = 0; - play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); - if(!play) - return; - opl = &play->opl; + MIDIplay *play = reinterpret_cast<MIDIplay *>(device->adl_midiPlayer); + P->cur_gm = 0; + P->ins_idx = 0; + P->play = play; + P->opl = play ? &play->opl : NULL; } ADLMIDI_EXPORT AdlInstrumentTester::~AdlInstrumentTester() -{} +{ + delete P; +} ADLMIDI_EXPORT void AdlInstrumentTester::FindAdlList() { const unsigned NumBanks = (unsigned)adl_getBanksCount(); std::set<unsigned> adl_ins_set; for(unsigned bankno = 0; bankno < NumBanks; ++bankno) - adl_ins_set.insert(banks[bankno][cur_gm]); - adl_ins_list.assign(adl_ins_set.begin(), adl_ins_set.end()); - ins_idx = 0; + adl_ins_set.insert(banks[bankno][P->cur_gm]); + P->adl_ins_list.assign(adl_ins_set.begin(), adl_ins_set.end()); + P->ins_idx = 0; NextAdl(0); - opl->Silence(); + P->opl->Silence(); } ADLMIDI_EXPORT void AdlInstrumentTester::Touch(unsigned c, unsigned volume) // Volume maxes at 127*127*127 { + OPL3 *opl = P->opl; if(opl->LogarithmicVolumes) opl->Touch_Real(c, volume * 127 / (127 * 127 * 127) / 2); else @@ -2559,11 +2571,13 @@ ADLMIDI_EXPORT void AdlInstrumentTester::Touch(unsigned c, unsigned volume) // V ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note) { - if(adl_ins_list.empty()) FindAdlList(); - const unsigned meta = adl_ins_list[ins_idx]; + MIDIplay *play = P->play; + OPL3 *opl = P->opl; + if(P->adl_ins_list.empty()) FindAdlList(); + const unsigned meta = P->adl_ins_list[P->ins_idx]; const adlinsdata &ains = opl->GetAdlMetaIns(meta); - int tone = (cur_gm & 128) ? (cur_gm & 127) : (note + 50); + int tone = (P->cur_gm & 128) ? (P->cur_gm & 127) : (note + 50); if(ains.tone) { /*if(ains.tone < 20) @@ -2611,15 +2625,16 @@ ADLMIDI_EXPORT void AdlInstrumentTester::DoNote(int note) ADLMIDI_EXPORT void AdlInstrumentTester::NextGM(int offset) { - cur_gm = (cur_gm + 256 + (uint32_t)offset) & 0xFF; + P->cur_gm = (P->cur_gm + 256 + (uint32_t)offset) & 0xFF; FindAdlList(); } ADLMIDI_EXPORT void AdlInstrumentTester::NextAdl(int offset) { - if(adl_ins_list.empty()) FindAdlList(); + OPL3 *opl = P->opl; + if(P->adl_ins_list.empty()) FindAdlList(); const unsigned NumBanks = (unsigned)adl_getBanksCount(); - ins_idx = (uint32_t)((int32_t)ins_idx + (int32_t)adl_ins_list.size() + offset) % adl_ins_list.size(); + P->ins_idx = (uint32_t)((int32_t)P->ins_idx + (int32_t)P->adl_ins_list.size() + offset) % P->adl_ins_list.size(); #if 0 UI.Color(15); @@ -2632,9 +2647,9 @@ ADLMIDI_EXPORT void AdlInstrumentTester::NextAdl(int offset) std::fflush(stderr); #endif - for(unsigned a = 0; a < adl_ins_list.size(); ++a) + for(unsigned a = 0, n = P->adl_ins_list.size(); a < n; ++a) { - const unsigned i = adl_ins_list[a]; + const unsigned i = P->adl_ins_list[a]; const adlinsdata &ains = opl->GetAdlMetaIns(i); char ToneIndication[8] = " "; @@ -2651,12 +2666,12 @@ ADLMIDI_EXPORT void AdlInstrumentTester::NextAdl(int offset) std::printf("%s%s%s%u\t", ToneIndication, ains.adlno1 != ains.adlno2 ? "[2]" : " ", - (ins_idx == a) ? "->" : "\t", + (P->ins_idx == a) ? "->" : "\t", i ); for(unsigned bankno = 0; bankno < NumBanks; ++bankno) - if(banks[bankno][cur_gm] == i) + if(banks[bankno][P->cur_gm] == i) std::printf(" %u", bankno); std::printf("\n"); |