From 12ee3271c4bbf0f740dc98e036a56f5554e18816 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 6 Nov 2012 06:10:04 +0000 Subject: [PATCH] - Replaced the opl_onechip cvar with opl_numchips. You can now emulate up to 8 of them for MIDI playback. (Raw OPL playback will still clamp it to 2, since there's no use for more than that with any of the raw OPL formats.) SVN r3945 (trunk) --- src/oplsynth/mlopl_io.cpp | 24 ++++++++++-------------- src/oplsynth/music_opl_mididevice.cpp | 4 +++- src/oplsynth/muslib.h | 5 +++-- src/oplsynth/opl_mus_player.cpp | 19 +++++++++---------- src/oplsynth/opl_mus_player.h | 2 +- src/sound/music_mus_opl.cpp | 13 +++++++++++-- wadsrc/static/menudef.txt | 2 +- 7 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/oplsynth/mlopl_io.cpp b/src/oplsynth/mlopl_io.cpp index 8ec6f49f7..6f33fa7f7 100644 --- a/src/oplsynth/mlopl_io.cpp +++ b/src/oplsynth/mlopl_io.cpp @@ -68,12 +68,11 @@ void OPLio::OPLwriteReg(int which, uint reg, uchar data) */ void OPLio::OPLwriteChannel(uint regbase, uint channel, uchar data1, uchar data2) { - static const uint op_num[] = { - 0x000, 0x001, 0x002, 0x008, 0x009, 0x00A, 0x010, 0x011, 0x012, - 0x100, 0x101, 0x102, 0x108, 0x109, 0x10A, 0x110, 0x111, 0x112}; + static const uint op_num[OPL2CHANNELS] = { + 0x00, 0x01, 0x02, 0x08, 0x09, 0x0A, 0x10, 0x11, 0x12}; - uint reg = regbase+op_num[channel]; - uint which = reg>>8; + uint which = channel / OPL2CHANNELS; + uint reg = regbase + op_num[channel % OPL2CHANNELS]; OPLwriteReg (which, reg, data1); OPLwriteReg (which, reg+3, data2); } @@ -84,12 +83,8 @@ void OPLio::OPLwriteChannel(uint regbase, uint channel, uchar data1, uchar data2 */ void OPLio::OPLwriteValue(uint regbase, uint channel, uchar value) { - static const uint reg_num[] = { - 0x000, 0x001, 0x002, 0x003, 0x004, 0x005, 0x006, 0x007, 0x008, - 0x100, 0x101, 0x102, 0x103, 0x104, 0x105, 0x106, 0x107, 0x108}; - - uint reg = regbase+reg_num[channel]; - uint which = reg>>8; + uint which = channel / OPL2CHANNELS; + uint reg = regbase + (channel % OPL2CHANNELS); OPLwriteReg (which, reg, value); } @@ -254,9 +249,10 @@ void OPLio::OPLwritePan(uint channel, struct OPL2instrument *instr, int pan) OPLwriteValue(0xC0, channel, instr->feedback | bits); // Set real panning if we're using emulated chips. - if (chips[0] != NULL) + int which = channel / OPL2CHANNELS; + if (chips[which] != NULL) { - chips[channel/9]->SetPanning(channel%9, pan+64); + chips[which]->SetPanning(channel % OPL2CHANNELS, pan + 64); } } } @@ -306,7 +302,7 @@ void OPLio::OPLshutup(void) */ int OPLio::OPLinit(uint numchips, bool stereo) { - assert(numchips >= 1 && numchips <= 2); + assert(numchips >= 1 && numchips <= countof(chips)); uint i; memset(chips, 0, sizeof(chips)); for (i = 0; i < numchips; ++i) diff --git a/src/oplsynth/music_opl_mididevice.cpp b/src/oplsynth/music_opl_mididevice.cpp index bd3736fe9..f9c28d0cc 100644 --- a/src/oplsynth/music_opl_mididevice.cpp +++ b/src/oplsynth/music_opl_mididevice.cpp @@ -60,6 +60,8 @@ // EXTERNAL DATA DECLARATIONS ---------------------------------------------- +EXTERN_CVAR(Int, opl_numchips) + // PRIVATE DATA DEFINITIONS ------------------------------------------------ // PUBLIC DATA DEFINITIONS ------------------------------------------------- @@ -92,7 +94,7 @@ OPLMIDIDevice::OPLMIDIDevice() int OPLMIDIDevice::Open(void (*callback)(unsigned int, void *, DWORD, DWORD), void *userdata) { - if (io == NULL || 0 == io->OPLinit(TwoChips + 1, IsStereo)) + if (io == NULL || 0 == (NumChips = io->OPLinit(opl_numchips, IsStereo))) { return 1; } diff --git a/src/oplsynth/muslib.h b/src/oplsynth/muslib.h index 75539b2f6..4c4bd6e88 100644 --- a/src/oplsynth/muslib.h +++ b/src/oplsynth/muslib.h @@ -141,7 +141,8 @@ struct OP2instrEntry { /* From MLOPL_IO.CPP */ #define OPL2CHANNELS 9 #define OPL3CHANNELS 18 -#define MAXCHANNELS 18 +#define MAXOPL2CHIPS 8 +#define MAXCHANNELS (OPL2CHANNELS * MAXOPL2CHIPS) /* Channel Flags: */ @@ -183,7 +184,7 @@ struct OPLio { virtual void SetClockRate(double samples_per_tick); virtual void WriteDelay(int ticks); - class OPLEmul *chips[2]; + class OPLEmul *chips[MAXOPL2CHIPS]; uint OPLchannels; uint NumChips; }; diff --git a/src/oplsynth/opl_mus_player.cpp b/src/oplsynth/opl_mus_player.cpp index 6be111430..6140d327e 100644 --- a/src/oplsynth/opl_mus_player.cpp +++ b/src/oplsynth/opl_mus_player.cpp @@ -16,14 +16,14 @@ #define IMF_RATE 700.0 -EXTERN_CVAR (Bool, opl_onechip) +EXTERN_CVAR (Int, opl_numchips) OPLmusicBlock::OPLmusicBlock() { scoredata = NULL; NextTickIn = 0; LastOffset = 0; - TwoChips = !opl_onechip; + NumChips = MIN(*opl_numchips, 2); Looping = false; IsStereo = false; io = NULL; @@ -37,10 +37,9 @@ OPLmusicBlock::~OPLmusicBlock() void OPLmusicBlock::ResetChips () { - TwoChips = !opl_onechip; ChipAccess.Enter(); io->OPLdeinit (); - TwoChips = io->OPLinit(TwoChips + 1, IsStereo) == 2; + NumChips = io->OPLinit(MIN(*opl_numchips, 2), IsStereo); ChipAccess.Leave(); } @@ -77,7 +76,7 @@ fail: delete[] scoredata; memcpy(scoredata, &musiccache[0], len); } - if (0 == io->OPLinit (TwoChips + 1)) + if (0 == (NumChips = io->OPLinit(NumChips))) { goto fail; } @@ -411,7 +410,7 @@ int OPLmusicFile::PlayTick () break; default: // It's something to stuff into the OPL chip - if (WhichChip == 0 || TwoChips) + if (WhichChip < NumChips) { io->OPLwriteReg(WhichChip, reg, data); } @@ -454,7 +453,7 @@ int OPLmusicFile::PlayTick () { data = *score++; } - if (WhichChip == 0 || TwoChips) + if (WhichChip < NumChips) { io->OPLwriteReg(WhichChip, reg, data); } @@ -485,7 +484,7 @@ int OPLmusicFile::PlayTick () { return (data + 1) << 8; } - else if (code < to_reg_size && (which = 0 || TwoChips)) + else if (code < to_reg_size && which < NumChips) { io->OPLwriteReg(which, to_reg[code], data); } @@ -527,14 +526,14 @@ OPLmusicFile::OPLmusicFile(const OPLmusicFile *source, const char *filename) SamplesPerTick = source->SamplesPerTick; RawPlayer = source->RawPlayer; score = source->score; - TwoChips = source->TwoChips; + NumChips = source->NumChips; WhichChip = 0; if (io != NULL) { delete io; } io = new DiskWriterIO(filename); - io->OPLinit(TwoChips + 1); + NumChips = io->OPLinit(NumChips); Restart(); } diff --git a/src/oplsynth/opl_mus_player.h b/src/oplsynth/opl_mus_player.h index 57744ebfc..03765c10a 100644 --- a/src/oplsynth/opl_mus_player.h +++ b/src/oplsynth/opl_mus_player.h @@ -18,7 +18,7 @@ protected: double NextTickIn; double SamplesPerTick; - bool TwoChips; + int NumChips; bool Looping; double LastOffset; bool IsStereo; diff --git a/src/sound/music_mus_opl.cpp b/src/sound/music_mus_opl.cpp index 8f5d430ba..0d9c35bb2 100644 --- a/src/sound/music_mus_opl.cpp +++ b/src/sound/music_mus_opl.cpp @@ -1,10 +1,19 @@ #include "i_musicinterns.h" +#include "oplsynth/muslib.h" static bool OPL_Active; -CUSTOM_CVAR (Bool, opl_onechip, false, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) +CUSTOM_CVAR (Int, opl_numchips, 2, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) { - if (OPL_Active && currSong != NULL) + if (*self <= 0) + { + self = 1; + } + else if (*self > MAXOPL2CHIPS) + { + self = MAXOPL2CHIPS; + } + else if (OPL_Active && currSong != NULL) { static_cast(currSong)->ResetChips (); } diff --git a/wadsrc/static/menudef.txt b/wadsrc/static/menudef.txt index c7dd62233..80e4ad0e0 100644 --- a/wadsrc/static/menudef.txt +++ b/wadsrc/static/menudef.txt @@ -1408,7 +1408,7 @@ OptionMenu AdvSoundOptions Option "Buffer count", "snd_buffercount", "BufferCounts" StaticText " " StaticText "OPL Synthesis", 1 - Option "Only emulate one OPL chip", "opl_onechip", "OnOff" + Slider "Number of emulated OPL chips", "opl_numchips", 1, 8, 1, 0 Option "Support MIDI stero panning", "opl_stereo", "OnOff" StaticText " " StaticText "GUS Emulation", 1