- removed the global current_opl_core variable and pass the needed info as function parameters

because using global variables for this is really bad style!
This also removes the unused OPLMUSDumper class.
This commit is contained in:
Christoph Oelckers 2019-09-26 17:40:39 +02:00
parent 159b98ea88
commit 2aa03e8e8a
7 changed files with 35 additions and 71 deletions

View file

@ -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;
}

View file

@ -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

View file

@ -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();
}

View file

@ -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<std::mutex> 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();
}

View file

@ -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;

View file

@ -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;

View file

@ -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);