diff --git a/src/sound/mididevices/music_opl_mididevice.cpp b/src/sound/mididevices/music_opl_mididevice.cpp index a740548b3..d92c53ae8 100644 --- a/src/sound/mididevices/music_opl_mididevice.cpp +++ b/src/sound/mididevices/music_opl_mididevice.cpp @@ -52,7 +52,6 @@ void I_DebugPrint(const char *cp); #endif // EXTERNAL FUNCTION PROTOTYPES -------------------------------------------- -void OPL_SetCore(const char *args); // PUBLIC FUNCTION PROTOTYPES ---------------------------------------------- @@ -75,11 +74,18 @@ CVAR(Bool, opl_fullpan, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG); // OPLMIDIDevice Contructor // //========================================================================== +EXTERN_CVAR(Int, opl_core) +int getOPLCore(const char* args) +{ + int current_opl_core = opl_core; + if (args != NULL && *args >= '0' && *args < '4') current_opl_core = *args - '0'; + return current_opl_core; +} + OPLMIDIDevice::OPLMIDIDevice(const char *args) - : SoftSynthMIDIDevice((int)OPL_SAMPLE_RATE) + : SoftSynthMIDIDevice((int)OPL_SAMPLE_RATE), OPLmusicBlock(getOPLCore(args)) { - OPL_SetCore(args); FullPan = opl_fullpan; auto lump = Wads.CheckNumForName("GENMIDI", ns_global); if (lump < 0) I_Error("No GENMIDI lump found"); @@ -101,7 +107,7 @@ OPLMIDIDevice::OPLMIDIDevice(const char *args) int OPLMIDIDevice::Open(MidiCallback callback, void *userdata) { - if (io == NULL || 0 == (NumChips = io->Init(opl_numchips, FullPan, true))) + if (io == NULL || 0 == (NumChips = io->Init(currentCore, opl_numchips, FullPan, true))) { return 1; } diff --git a/src/sound/music/i_musicinterns.h b/src/sound/music/i_musicinterns.h index 2c750379d..dd0b8df19 100644 --- a/src/sound/music/i_musicinterns.h +++ b/src/sound/music/i_musicinterns.h @@ -297,23 +297,14 @@ public: bool IsPlaying (); bool IsValid () const; void ResetChips (); - MusInfo *GetOPLDumper(const char *filename); protected: - OPLMUSSong(const OPLMUSSong *original, const char *filename); // OPL dump constructor static bool FillStream (SoundStream *stream, void *buff, int len, void *userdata); OPLmusicFile *Music; }; -class OPLMUSDumper : public OPLMUSSong -{ -public: - OPLMUSDumper(const OPLMUSSong *original, const char *filename); - void Play(bool looping, int); -}; - // CD track/disk played through the multimedia system ----------------------- class CDSong : public MusInfo diff --git a/src/sound/musicformats/music_opl.cpp b/src/sound/musicformats/music_opl.cpp index f91b43aa6..d3cf14ec9 100644 --- a/src/sound/musicformats/music_opl.cpp +++ b/src/sound/musicformats/music_opl.cpp @@ -59,24 +59,18 @@ CUSTOM_CVAR(Int, opl_core, 0, CVAR_ARCHIVE | CVAR_GLOBALCONFIG) MIDIDeviceChanged(-1, true); } } -int current_opl_core; -// Get OPL core override from $mididevice -void OPL_SetCore(const char *args) -{ - current_opl_core = opl_core; - if (args != NULL && *args >= '0' && *args < '4') current_opl_core = *args - '0'; -} +int getOPLCore(const char* args); OPLMUSSong::OPLMUSSong (FileReader &reader, const char *args) { int samples = int(OPL_SAMPLE_RATE / 14); - OPL_SetCore(args); - Music = new OPLmusicFile (reader); + int core = getOPLCore(args); + Music = new OPLmusicFile (reader, core); m_Stream = GSnd->CreateStream (FillStream, samples*4, - (current_opl_core == 0 ? SoundStream::Mono : 0) | SoundStream::Float, int(OPL_SAMPLE_RATE), this); + (core == 0 ? SoundStream::Mono : 0) | SoundStream::Float, int(OPL_SAMPLE_RATE), this); if (m_Stream == NULL) { Printf (PRINT_BOLD, "Could not create music stream.\n"); @@ -131,23 +125,3 @@ bool OPLMUSSong::FillStream (SoundStream *stream, void *buff, int len, void *use return song->Music->ServiceStream (buff, len); } -MusInfo *OPLMUSSong::GetOPLDumper(const char *filename) -{ - return new OPLMUSDumper(this, filename); -} - -OPLMUSSong::OPLMUSSong(const OPLMUSSong *original, const char *filename) -{ - Music = new OPLmusicFile(original->Music, filename); - m_Stream = NULL; -} - -OPLMUSDumper::OPLMUSDumper(const OPLMUSSong *original, const char *filename) -: OPLMUSSong(original, filename) -{ -} - -void OPLMUSDumper::Play(bool looping, int) -{ - Music->Dump(); -} diff --git a/src/sound/oplsynth/opl_mus_player.cpp b/src/sound/oplsynth/opl_mus_player.cpp index cf4a702d6..3d68420e2 100644 --- a/src/sound/oplsynth/opl_mus_player.cpp +++ b/src/sound/oplsynth/opl_mus_player.cpp @@ -48,8 +48,9 @@ EXTERN_CVAR (Int, opl_numchips) -OPLmusicBlock::OPLmusicBlock() +OPLmusicBlock::OPLmusicBlock(int core) { + currentCore = core; scoredata = NULL; NextTickIn = 0; LastOffset = 0; @@ -69,7 +70,7 @@ void OPLmusicBlock::ResetChips () { std::lock_guard lock(ChipAccess); io->Reset (); - NumChips = io->Init(MIN(*opl_numchips, 2), FullPan); + NumChips = io->Init(currentCore, MIN(*opl_numchips, 2), FullPan, false); } void OPLmusicBlock::Restart() @@ -80,8 +81,8 @@ void OPLmusicBlock::Restart() LastOffset = 0; } -OPLmusicFile::OPLmusicFile (FileReader &reader) - : ScoreLen ((int)reader.GetLength()) +OPLmusicFile::OPLmusicFile (FileReader &reader, int core) + : OPLmusicBlock(core), ScoreLen ((int)reader.GetLength()) { if (io == NULL) { @@ -97,7 +98,7 @@ fail: delete[] scoredata; return; } - if (0 == (NumChips = io->Init(NumChips))) + if (0 == (NumChips = io->Init(core, NumChips, false, false))) { goto fail; } @@ -528,14 +529,8 @@ int OPLmusicFile::PlayTick () return 0; } -/* -ADD_STAT (opl) -{ - return YM3812GetVoiceString (); -} -*/ - -OPLmusicFile::OPLmusicFile(const OPLmusicFile *source, const char *filename) +OPLmusicFile::OPLmusicFile(int core, const OPLmusicFile *source, const char *filename) + : OPLmusicBlock(core) { ScoreLen = source->ScoreLen; scoredata = new uint8_t[ScoreLen]; @@ -550,7 +545,7 @@ OPLmusicFile::OPLmusicFile(const OPLmusicFile *source, const char *filename) delete io; } io = new DiskWriterIO(filename); - NumChips = io->Init(NumChips); + NumChips = io->Init(core, NumChips, false, false); Restart(); } diff --git a/src/sound/oplsynth/opl_mus_player.h b/src/sound/oplsynth/opl_mus_player.h index bd6e2612a..cecbd72fd 100644 --- a/src/sound/oplsynth/opl_mus_player.h +++ b/src/sound/oplsynth/opl_mus_player.h @@ -6,7 +6,7 @@ class FileReader; class OPLmusicBlock : public musicBlock { public: - OPLmusicBlock(); + OPLmusicBlock(int core); virtual ~OPLmusicBlock(); bool ServiceStream(void *buff, int numbytes); @@ -20,12 +20,13 @@ protected: uint8_t *score; uint8_t *scoredata; - int playingcount; double NextTickIn; double SamplesPerTick; - int NumChips; - bool Looping; double LastOffset; + int playingcount; + int NumChips; + int currentCore; + bool Looping; bool FullPan; std::mutex ChipAccess; @@ -34,8 +35,8 @@ protected: class OPLmusicFile : public OPLmusicBlock { public: - OPLmusicFile(FileReader &reader); - OPLmusicFile(const OPLmusicFile *source, const char *filename); + OPLmusicFile(FileReader &reader, int core); + OPLmusicFile(int core, const OPLmusicFile *source, const char *filename); virtual ~OPLmusicFile(); bool IsValid() const; @@ -44,7 +45,7 @@ public: void Dump(); protected: - OPLmusicFile() {} + OPLmusicFile(int core) : OPLmusicBlock(core) {} int PlayTick(); enum { RDosPlay, IMF, DosBox1, DosBox2 } RawPlayer; diff --git a/src/sound/oplsynth/oplio.cpp b/src/sound/oplsynth/oplio.cpp index fb4d507a7..d28b8f242 100644 --- a/src/sound/oplsynth/oplio.cpp +++ b/src/sound/oplsynth/oplio.cpp @@ -32,9 +32,6 @@ const double HALF_PI = (M_PI*0.5); -EXTERN_CVAR(Int, opl_core) -extern int current_opl_core; - OPLio::~OPLio() { } @@ -53,11 +50,11 @@ void OPLio::WriteDelay(int ticks) // //---------------------------------------------------------------------------- -int OPLio::Init(uint32_t numchips, bool stereo, bool initopl3) +int OPLio::Init(int core, uint32_t numchips, bool stereo, bool initopl3) { assert(numchips >= 1 && numchips <= countof(chips)); uint32_t i; - IsOPL3 = (current_opl_core == 1 || current_opl_core == 2 || current_opl_core == 3); + IsOPL3 = (core == 1 || core == 2 || core == 3); memset(chips, 0, sizeof(chips)); if (IsOPL3) @@ -66,7 +63,7 @@ int OPLio::Init(uint32_t numchips, bool stereo, bool initopl3) } for (i = 0; i < numchips; ++i) { - OPLEmul *chip = IsOPL3 ? (current_opl_core == 1 ? DBOPLCreate(stereo) : (current_opl_core == 2 ? JavaOPLCreate(stereo) : NukedOPL3Create(stereo))) : YM3812Create(stereo); + OPLEmul *chip = IsOPL3 ? (core == 1 ? DBOPLCreate(stereo) : (core == 2 ? JavaOPLCreate(stereo) : NukedOPL3Create(stereo))) : YM3812Create(stereo); if (chip == NULL) { break; diff --git a/src/sound/oplsynth/oplio.h b/src/sound/oplsynth/oplio.h index 93b7e281c..c46fd5157 100644 --- a/src/sound/oplsynth/oplio.h +++ b/src/sound/oplsynth/oplio.h @@ -72,7 +72,7 @@ struct OPLio void MuteChannel(uint32_t chan); void StopPlayback(); - virtual int Init(uint32_t numchips, bool stereo = false, bool initopl3 = false); + virtual int Init(int core, uint32_t numchips, bool stereo, bool initopl3); virtual void Reset(); virtual void WriteRegister(int which, uint32_t reg, uint8_t data); virtual void SetClockRate(double samples_per_tick);