MT32: Fix virtual dtor warning, incorrect delete, unnecessary allocation

This commit is contained in:
Colin Snover 2016-12-18 10:07:48 -06:00
parent 91fd236a53
commit d585c6f852

View File

@ -104,10 +104,9 @@ class MidiDriver_MT32 : public MidiDriver_Emulated {
private:
MidiChannel_MT32 _midiChannels[16];
uint16 _channelMask;
MT32Emu::Service *_service;
MT32Emu::ScummVMReportHandler *_reportHandler;
MT32Emu::Service _service;
MT32Emu::ScummVMReportHandler _reportHandler;
byte *_controlData, *_pcmData;
void deleteMuntStructures();
Common::Mutex _mutex;
int _outputRate;
@ -146,26 +145,13 @@ MidiDriver_MT32::MidiDriver_MT32(Audio::Mixer *mixer) : MidiDriver_Emulated(mixe
for (i = 0; i < ARRAYSIZE(_midiChannels); ++i) {
_midiChannels[i].init(this, i);
}
_service = nullptr;
_reportHandler = nullptr;
_outputRate = 0;
_controlData = nullptr;
_pcmData = nullptr;
}
MidiDriver_MT32::~MidiDriver_MT32() {
deleteMuntStructures();
}
void MidiDriver_MT32::deleteMuntStructures() {
delete _service;
_service = nullptr;
delete _reportHandler;
_reportHandler = nullptr;
delete _controlData;
_controlData = nullptr;
delete _pcmData;
_pcmData = nullptr;
close();
}
int MidiDriver_MT32::open() {
@ -199,39 +185,37 @@ int MidiDriver_MT32::open() {
_pcmData = new byte[pcmFile.size()];
pcmFile.read(_pcmData, pcmFile.size());
_reportHandler = new MT32Emu::ScummVMReportHandler();
_service = new MT32Emu::Service();
_service->createContext(*_reportHandler);
_service.createContext(_reportHandler);
if (_service->addROMData(_controlData, controlFile.size()) != MT32EMU_RC_ADDED_CONTROL_ROM) {
if (_service.addROMData(_controlData, controlFile.size()) != MT32EMU_RC_ADDED_CONTROL_ROM) {
error("Adding control ROM failed. Check that your control ROM is valid");
}
controlFile.close();
if (_service->addROMData(_pcmData, pcmFile.size()) != MT32EMU_RC_ADDED_PCM_ROM) {
if (_service.addROMData(_pcmData, pcmFile.size()) != MT32EMU_RC_ADDED_PCM_ROM) {
error("Adding PCM ROM failed. Check that your PCM ROM is valid");
}
pcmFile.close();
if (_service->openSynth() != MT32EMU_RC_OK)
if (_service.openSynth() != MT32EMU_RC_OK)
return MERR_DEVICE_NOT_AVAILABLE;
double gain = (double)ConfMan.getInt("midi_gain") / 100.0;
_service->setOutputGain(1.0f * gain);
_service->setReverbOutputGain(1.0f * gain);
_service.setOutputGain(1.0f * gain);
_service.setReverbOutputGain(1.0f * gain);
// We let the synthesizer play MIDI messages immediately. Our MIDI
// handling is synchronous to sample generation. This makes delaying MIDI
// events result in odd sound output in some cases. For example, the
// shattering window in the Indiana Jones and the Fate of Atlantis intro
// will sound like a bell if we use any delay here.
// Bug #6242 "AUDIO: Built-In MT-32 MUNT Produces Wrong Sounds".
_service->setMIDIDelayMode(MT32Emu::MIDIDelayMode_IMMEDIATE);
_service.setMIDIDelayMode(MT32Emu::MIDIDelayMode_IMMEDIATE);
// We need to report the sample rate MUNT renders at as sample rate of our
// AudioStream.
_outputRate = _service->getActualStereoOutputSamplerate();
_outputRate = _service.getActualStereoOutputSamplerate();
MidiDriver_Emulated::open();
@ -242,7 +226,7 @@ int MidiDriver_MT32::open() {
void MidiDriver_MT32::send(uint32 b) {
Common::StackLock lock(_mutex);
_service->playMsg(b);
_service.playMsg(b);
}
// Indiana Jones and the Fate of Atlantis (including the demo) uses
@ -253,13 +237,13 @@ void MidiDriver_MT32::setPitchBendRange(byte channel, uint range) {
}
byte benderRangeSysex[4] = { 0, 0, 4, (uint8)range };
Common::StackLock lock(_mutex);
_service->writeSysex(channel, benderRangeSysex, 4);
_service.writeSysex(channel, benderRangeSysex, 4);
}
void MidiDriver_MT32::sysEx(const byte *msg, uint16 length) {
if (msg[0] == 0xf0) {
Common::StackLock lock(_mutex);
_service->playSysex(msg, length);
_service.playSysex(msg, length);
} else {
enum {
SYSEX_CMD_DT1 = 0x12,
@ -268,7 +252,7 @@ void MidiDriver_MT32::sysEx(const byte *msg, uint16 length) {
if (msg[3] == SYSEX_CMD_DT1 || msg[3] == SYSEX_CMD_DAT) {
Common::StackLock lock(_mutex);
_service->writeSysex(msg[1], msg + 4, length - 5);
_service.writeSysex(msg[1], msg + 4, length - 5);
} else {
warning("Unused sysEx command %d", msg[3]);
}
@ -286,13 +270,17 @@ void MidiDriver_MT32::close() {
_mixer->stopHandle(_mixerSoundHandle);
Common::StackLock lock(_mutex);
_service->closeSynth();
deleteMuntStructures();
_service.closeSynth();
_service.freeContext();
delete[] _controlData;
_controlData = nullptr;
delete[] _pcmData;
_pcmData = nullptr;
}
void MidiDriver_MT32::generateSamples(int16 *data, int len) {
Common::StackLock lock(_mutex);
_service->renderBit16s(data, len);
_service.renderBit16s(data, len);
}
uint32 MidiDriver_MT32::property(int prop, uint32 param) {