예제 #1
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);
        }
예제 #2
0
        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);
        }
예제 #3
0
        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 }
            };
        }
예제 #4
0
 public TownsAudioInterface(IMixer mixer, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling = false)
 {
     _intf = TownsAudioInterfaceInternal.AddNewRef(mixer, this, driver, externalMutexHandling);
 }
예제 #5
0
        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 }
            };
        }
예제 #6
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;
        }
예제 #7
0
        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;
        }
예제 #8
0
 public TownsAudioInterface(IMixer mixer, ITownsAudioInterfacePluginDriver driver, bool externalMutexHandling = false)
 {
     _intf = TownsAudioInterfaceInternal.AddNewRef(mixer, this, driver, externalMutexHandling);
 }