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 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); }
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 } }; }
public TownsAudioInterface(IMixer mixer, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling = false) { _intf = TownsAudioInterfaceInternal.AddNewRef(mixer, this, driver, externalMutexHandling); }
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 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; }