Files
scummvm/engines/scumm/imuse/imuse.h
T
athrxx 40b459164b SCUMM: (IMS) - add dedicated MT-32 sound driver
(fixes bug no. 1248 - "SAM: some MIDI channels missing on MT-32")

This is a very obvious bug if the speech is turned off (otherwise the speech will
kind of cover it up). In the SAMNMAX intro it is hardly playing anything.

The reason is that the newer sound system has an extra driver layer between the
imuse parts and the actual hardware which mananges the channels (similar to
what we already do for AdLib, Amiga, FM-Towns...). Whenever the songs are
attempting to use a Midi part > 9 our current system will fail.

I have written the MT-32 player to also handle the older games music and sound
effects. This will allow cleaning up various more hacks in the common sound code.
I have done only little cleanup here, since it is not the main purpose of the commit.

I will also write a GM driver. This is going to be easier. Currently, there is a only
some init and skeleton code for it, the rest is just pass-through...
2022-10-06 18:47:46 +02:00

88 lines
2.5 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#ifndef SCUMM_IMUSE_H
#define SCUMM_IMUSE_H
#include "audio/mididrv.h"
#include "common/scummsys.h"
#include "common/serializer.h"
#include "common/mutex.h"
#include "scumm/music.h"
class MidiDriver;
class OSystem;
namespace Scumm {
class IMuseInternal;
class Player;
class ScummEngine;
typedef void (*sysexfunc)(Player *, const byte *, uint16);
/**
* iMuse implementation interface.
* MusicEngine derivative for state-tracked, interactive,
* persistent event-based music playback and control.
* This class serves as an interface to actual implementations
* so that client code is not exposed to the details of
* any specific implementation.
*/
class IMuse : public MusicEngine {
public:
enum {
PROP_TEMPO_BASE,
PROP_LIMIT_PLAYERS,
PROP_RECYCLE_PLAYERS
};
enum {
kFlagNewSystem = 1 << 0,
kFlagNativeMT32 = 1 << 1,
kFlagRolandGS = 1 << 2
};
public:
virtual void on_timer(MidiDriver *midi) = 0;
virtual void pause(bool paused) = 0;
virtual void saveLoadIMuse(Common::Serializer &ser, ScummEngine *scumm, bool fixAfterLoad = true) = 0;
virtual bool get_sound_active(int sound) const = 0;
virtual int32 doCommand(int numargs, int args[]) = 0;
virtual int clear_queue() = 0;
virtual uint32 property(int prop, uint32 value) = 0;
virtual void addSysexHandler(byte mfgID, sysexfunc handler) = 0;
public:
virtual void startSoundWithNoteOffset(int sound, int offset) = 0;
// MusicEngine base class methods.
// Not actually redefined here because none are implemented.
public:
// Factory methods
static IMuse *create(ScummEngine *vm, MidiDriver *nativeMidiDriver, MidiDriver *adlibMidiDriver, MidiDriverFlags sndType, uint32 flags);
};
} // End of namespace Scumm
#endif