using System; using System.Collections.Generic; using UnityEngine; namespace cylvester { public interface IPdBackend { IPdArray LevelArray { get; } IPdArrayContainer SpectrumArrayContainer{ get; } IPdArrayContainer WaveformArrayContainer{ get; } } public class PdBackend : MonoBehaviour, IPdBackend { [SerializeField] UnityControlEvent controlMessageReceived = null; public int samplePlayback; private IChangeObserver samplePlaybackObserver_; private IPdSender pdSender_; private IPdReceiver pdReceiver_; private IMidiParser midiParser_; private IDspController dspController_; public IPdArray LevelArray { get; private set; } public IPdArrayContainer SpectrumArrayContainer { get; private set; } public IPdArrayContainer WaveformArrayContainer { get; private set; } private List updaters_; private Action onSamplePlaybackChanged_; private Action onControlMessageReceived_; private void Awake() { SpectrumArrayContainer = new PdArrayContainer("fft_"); WaveformArrayContainer = new PdArrayContainer("wave_"); LevelArray = new PdArray("level", PdConstant.NumMaxInputChannels); updaters_ = new List {(IUpdater) LevelArray, (IUpdater) SpectrumArrayContainer, (IUpdater) WaveformArrayContainer}; pdSender_ = new PdSender(PdConstant.ip, PdConstant.sendPort); pdReceiver_ = new PdReceiver(PdConstant.receivedPort); midiParser_ = new MidiParser(pdReceiver_); dspController_ = new DspController(pdSender_); samplePlaybackObserver_ = new ChangeObserver(samplePlayback); onSamplePlaybackChanged_ = () => { pdSender_.Send(new[]{(byte)PdMessage.SampleSound, (byte)samplePlayback}); }; onControlMessageReceived_ = (message) => { controlMessageReceived.Invoke(message); }; samplePlaybackObserver_.ValueChanged += onSamplePlaybackChanged_; midiParser_.ControlMessageReceived += onControlMessageReceived_; dspController_.State = true; } private void OnDestroy() { dspController_.State = false; pdSender_?.Dispose(); samplePlaybackObserver_.ValueChanged -= onSamplePlaybackChanged_; midiParser_.ControlMessageReceived -= onControlMessageReceived_; } public void Update() { pdReceiver_.Update(); foreach (var updater in updaters_) updater.Update(); samplePlaybackObserver_.Value = samplePlayback; } } }