/* 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 . * */ #ifndef MM_SHARED_XEEN_SOUND_DRIVER_ADLIB_H #define MM_SHARED_XEEN_SOUND_DRIVER_ADLIB_H #include "audio/mididrv.h" #include "mm/shared/xeen/sound_driver.h" namespace OPL { class OPL; } namespace MM { namespace Shared { namespace Xeen { class SoundDriverAdlib : public SoundDriver { struct RegisterValue { uint8 _regNum; uint8 _value; RegisterValue(int regNum, int value) { _regNum = regNum; _value = value; } }; private: static const byte OPERATOR1_INDEXES[CHANNEL_COUNT]; static const byte OPERATOR2_INDEXES[CHANNEL_COUNT]; static const uint WAVEFORMS[24]; private: OPL::OPL *_opl; Common::Queue _queue; Common::Mutex _driverMutex; const byte *_musInstrumentPtrs[16]; const byte *_fxInstrumentPtrs[16]; int _field180; int _field181; int _field182; int _musicVolume, _sfxVolume; private: /** * Initializes the state of the Adlib OPL driver */ void initialize(); /** * Adds a register write to the pending queue that will be flushed * out to the OPL on the next timer call */ void write(int reg, int val); /** * Timer function for OPL */ void onTimer(); /** * Flushes any pending writes to the OPL */ void flush(); /** * Resets all the output frequencies */ void resetFrequencies(); /** * Sets the frequency for an operator */ void setFrequency(byte operatorNum, uint frequency); /** * Calculates the frequency for a note */ uint calcFrequency(byte note); /** * Sets the output level for a channel */ void setOutputLevel(byte channelNum, uint level); /** * Starts playing an instrument */ void playInstrument(byte channelNum, const byte *data, bool isFx); /** * Calculates the scaling/volume level to output based on sfx or music master volume */ byte calculateLevel(byte level, bool isFx); protected: bool musSetInstrument(const byte *&srcP, byte param) override; bool musSetPitchWheel(const byte *&srcP, byte param) override; bool musSetPanning(const byte *&srcP, byte param) override; bool musFade(const byte *&srcP, byte param) override; bool musStartNote(const byte *&srcP, byte param) override; bool musSetVolume(const byte *&srcP, byte param) override; bool musInjectMidi(const byte *&srcP, byte param) override; bool musPlayInstrument(const byte *&srcP, byte param) override; bool cmdFreezeFrequency(const byte *&srcP, byte param) override; bool cmdChangeFrequency(const byte *&srcP, byte param) override; bool fxSetInstrument(const byte *&srcP, byte param) override; bool fxSetVolume(const byte *&srcP, byte param) override; bool fxMidiReset(const byte *&srcP, byte param) override; bool fxMidiDword(const byte *&srcP, byte param) override; bool fxSetPanning(const byte *&srcP, byte param) override; bool fxChannelOff(const byte *&srcP, byte param) override; bool fxFade(const byte *&srcP, byte param) override; bool fxStartNote(const byte *&srcP, byte param) override; bool fxInjectMidi(const byte *&srcP, byte param) override; bool fxPlayInstrument(const byte *&srcP, byte param) override; /** * Post-processing done when a pause countdown starts or is in progress */ void pausePostProcess() override; /** * Does a reset of any sound effect */ void resetFX() override; /** * Sends SysEx message */ void sysExMessage(const byte *&data) override; public: /** * Constructor */ SoundDriverAdlib(); /** * Destructor */ ~SoundDriverAdlib() override; /** * Starts a special effect playing */ void playFX(uint effectId, const byte *data) override; /** * Plays a song */ void playSong(const byte *data) override; /** * Executes special music command */ int songCommand(uint commandId, byte musicVolume = 0, byte sfxVolume = 0) override; }; } // namespace Xeen } // namespace Shared } // namespace MM #endif