/// <summary> /// Attaches a new input pin which will run either in sync or async mode depending /// on its SyncMode property. Once attached, the sync mode must not change unless /// the pin is re-attached. /// </summary> public void SetInputPin(ISoundProvider source) { if (_bufferedProvider != null) { _bufferedProvider.BaseSoundProvider = null; _bufferedProvider.DiscardSamples(); _bufferedProvider = null; } if (source == null) { return; } if (source.SyncMode == SyncSoundMode.Sync) { _bufferedProvider = _outputProvider; } else if (source.SyncMode == SyncSoundMode.Async) { _bufferedAsync.RecalculateMagic(Global.Emulator.VsyncRate()); _bufferedProvider = _bufferedAsync; } else { throw new InvalidOperationException("Unsupported sync mode."); } _bufferedProvider.BaseSoundProvider = source; }