public MidiDriver_TOWNS(IMixer mixer) { _baseTempo = 10080; _rand = 1; // We set exteral mutex handling to true to avoid lockups in SCUMM which has its own mutex. _intf = new TownsAudioInterface(mixer, this, true); _channels = new TownsMidiInputChannel[32]; for (int i = 0; i < 32; i++) _channels[i] = new TownsMidiInputChannel(this, i > 8 ? (i + 1) : i); _out = new TownsMidiOutputChannel[6]; for (int i = 0; i < 6; i++) { _out[i] = new TownsMidiOutputChannel(this, i); } _chanState = new TownsMidiChanState[32]; for (int i = 0; i < _chanState.Length; i++) { _chanState[i] = new TownsMidiChanState(); } _operatorLevelTable = new byte[2048]; for (int i = 0; i < 64; i++) { for (int ii = 0; ii < 32; ii++) _operatorLevelTable[(i << 5) + ii] = (byte)(((i * (ii + 1)) >> 5) & 0xff); } for (int i = 0; i < 64; i++) _operatorLevelTable[i << 5] = 0; }
bool AssignPluginDriver(TownsAudioInterface owner, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling) { if (_refCount <= 1) { return(true); } if (_drv != null) { if (driver != null && driver != _drv) { return(false); } } else { lock (_mutex) { _drv = driver; _drvOwner = owner; _externalMutex = externalMutexHandling; } } return(true); }
public Player_Towns_v2(ScummEngine vm, IMixer mixer, IIMuse imuse, bool disposeIMuse) : base(vm, true) { _imuse = imuse; _imuseDispose = disposeIMuse; _soundOverride = new SoundOvrParameters[_numSoundMax]; _intf = new TownsAudioInterface(mixer, null); }
void RemovePluginDriver(TownsAudioInterface owner) { if (_drvOwner == owner) { lock (_mutex) { _drv = null; } } }
public static TownsAudioInterfaceInternal AddNewRef(IMixer mixer, TownsAudioInterface owner, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling) { _refCount++; if (_refCount == 1 && _refInstance == null) { _refInstance = new TownsAudioInterfaceInternal(mixer, owner, driver, externalMutexHandling); } else if (_refCount < 2 || _refInstance == null) { throw new InvalidOperationException("TownsAudioInterfaceInternal::addNewRef(): Internal reference management failure"); } else if (!_refInstance.AssignPluginDriver(owner, driver, externalMutexHandling)) { throw new InvalidOperationException("TownsAudioInterfaceInternal::addNewRef(): Plugin driver conflict"); } return(_refInstance); }
public static void ReleaseRef(TownsAudioInterface owner) { if (_refCount == 0) { return; } _refCount--; if (_refCount != 0) { if (_refInstance != null) { _refInstance.RemovePluginDriver(owner); } } else if (_refInstance != null) { _refInstance.Dispose(); _refInstance = null; } }
public MidiDriver_TOWNS(IMixer mixer) { _baseTempo = 10080; _rand = 1; // We set exteral mutex handling to true to avoid lockups in SCUMM which has its own mutex. _intf = new TownsAudioInterface(mixer, this, true); _channels = new TownsMidiInputChannel[32]; for (int i = 0; i < 32; i++) { _channels[i] = new TownsMidiInputChannel(this, i > 8 ? (i + 1) : i); } _out = new TownsMidiOutputChannel[6]; for (int i = 0; i < 6; i++) { _out[i] = new TownsMidiOutputChannel(this, i); } _chanState = new TownsMidiChanState[32]; for (int i = 0; i < _chanState.Length; i++) { _chanState[i] = new TownsMidiChanState(); } _operatorLevelTable = new byte[2048]; for (int i = 0; i < 64; i++) { for (int ii = 0; ii < 32; ii++) { _operatorLevelTable[(i << 5) + ii] = (byte)(((i * (ii + 1)) >> 5) & 0xff); } } for (int i = 0; i < 64; i++) { _operatorLevelTable[i << 5] = 0; } }
public TownsEuphonyDriver(IMixer mixer) { _intf = new TownsAudioInterface(mixer, this); ResetTempo(); }
TownsAudioInterfaceInternal(IMixer mixer, TownsAudioInterface owner, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling) : base(mixer, FmSynthEmuType.Towns, externalMutexHandling) { _baserate = 55125.0f / mixer.OutputRate; _drv = driver; _drvOwner = owner; _musicVolume = Mixer.MaxMixerVolume; _sfxVolume = Mixer.MaxMixerVolume; _timerBase = (uint)(_baserate * 1000000.0f); _tickLength = 2 * _timerBase; _intfOpcodes = new Dictionary <int, TownsAudioIntfCallback> { { 0, intf_reset }, { 1, intf_keyOn }, { 2, intf_keyOff }, { 3, intf_setPanPos }, // 4 { 4, intf_setInstrument }, { 5, intf_loadInstrument }, { 7, intf_setPitch }, // 8 { 8, intf_setLevel }, { 9, intf_chanOff }, // 12 // 16 { 17, intf_writeReg }, { 19, intf_writeRegBuffer }, // 20 { 20, intf_readRegBuffer }, { 21, intf_setTimerA }, { 22, intf_setTimerB }, { 23, intf_enableTimerA }, // 24 { 24, intf_enableTimerB }, // 28 // 32 { 32, intf_loadSamples }, { 33, intf_reserveEffectChannels }, { 34, intf_loadWaveTable }, { 35, intf_unloadWaveTable }, // 36 { 37, intf_pcmPlayEffect }, { 39, intf_pcmChanOff }, // 40 { 40, intf_pcmEffectPlaying }, // 44 // 48 { 50, intf_fmKeyOn }, { 51, intf_fmKeyOff }, // 52 { 52, intf_fmSetPanPos }, { 53, intf_fmSetInstrument }, { 54, intf_fmLoadInstrument }, // 56 { 56, intf_fmSetPitch }, { 57, intf_fmSetLevel }, { 58, intf_fmReset }, // 60 // 64 { 67, intf_setOutputVolume }, // 68 { 68, intf_resetOutputVolume }, { 69, intf_getOutputVolume }, { 70, intf_setOutputMute }, // 72 { 73, intf_cdaToggle }, { 74, intf_getOutputVolume2 }, { 75, intf_getOutputMute }, // 76 // 80 { 80, intf_pcmUpdateEnvelopeGenerator } }; }
TownsAudioInterfaceInternal(IMixer mixer, TownsAudioInterface owner, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling) : base(mixer, FmSynthEmuType.Towns, externalMutexHandling) { _baserate = 55125.0f / mixer.OutputRate; _drv = driver; _drvOwner = owner; _musicVolume = Mixer.MaxMixerVolume; _sfxVolume = Mixer.MaxMixerVolume; _timerBase = (uint)(_baserate * 1000000.0f); _tickLength = 2 * _timerBase; _intfOpcodes = new Dictionary<int, TownsAudioIntfCallback> { { 0,intf_reset }, { 1,intf_keyOn }, { 2,intf_keyOff }, { 3,intf_setPanPos }, // 4 { 4,intf_setInstrument }, { 5,intf_loadInstrument }, { 7,intf_setPitch }, // 8 { 8,intf_setLevel }, { 9,intf_chanOff }, // 12 // 16 { 17,intf_writeReg }, { 19,intf_writeRegBuffer }, // 20 { 20,intf_readRegBuffer }, { 21,intf_setTimerA }, { 22,intf_setTimerB }, { 23,intf_enableTimerA }, // 24 { 24,intf_enableTimerB }, // 28 // 32 { 32,intf_loadSamples }, { 33,intf_reserveEffectChannels }, { 34,intf_loadWaveTable }, { 35,intf_unloadWaveTable }, // 36 { 37,intf_pcmPlayEffect }, { 39,intf_pcmChanOff }, // 40 { 40,intf_pcmEffectPlaying }, // 44 // 48 { 50,intf_fmKeyOn }, { 51,intf_fmKeyOff }, // 52 { 52,intf_fmSetPanPos }, { 53,intf_fmSetInstrument }, { 54,intf_fmLoadInstrument }, // 56 { 56,intf_fmSetPitch }, { 57,intf_fmSetLevel }, { 58,intf_fmReset }, // 60 // 64 { 67,intf_setOutputVolume }, // 68 { 68,intf_resetOutputVolume }, { 69,intf_getOutputVolume }, { 70,intf_setOutputMute }, // 72 { 73,intf_cdaToggle }, { 74,intf_getOutputVolume2 }, { 75,intf_getOutputMute }, // 76 // 80 { 80,intf_pcmUpdateEnvelopeGenerator } }; }
bool AssignPluginDriver(TownsAudioInterface owner, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling) { if (_refCount <= 1) return true; if (_drv != null) { if (driver != null && driver != _drv) return false; } else { lock (_mutex) { _drv = driver; _drvOwner = owner; _externalMutex = externalMutexHandling; } } return true; }
public static void ReleaseRef(TownsAudioInterface owner) { if (_refCount == 0) return; _refCount--; if (_refCount != 0) { if (_refInstance != null) _refInstance.RemovePluginDriver(owner); } else if (_refInstance != null) { _refInstance.Dispose(); _refInstance = null; } }
public static TownsAudioInterfaceInternal AddNewRef(IMixer mixer, TownsAudioInterface owner, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling) { _refCount++; if (_refCount == 1 && _refInstance == null) _refInstance = new TownsAudioInterfaceInternal(mixer, owner, driver, externalMutexHandling); else if (_refCount < 2 || _refInstance == null) throw new InvalidOperationException("TownsAudioInterfaceInternal::addNewRef(): Internal reference management failure"); else if (!_refInstance.AssignPluginDriver(owner, driver, externalMutexHandling)) throw new InvalidOperationException("TownsAudioInterfaceInternal::addNewRef(): Plugin driver conflict"); return _refInstance; }