// Author: Gockner, Simon // Created: 2021-04-07 // Copyright(c) 2021 SimonG. All Rights Reserved. using System.Collections.Generic; using System.Linq; using Lib.Audio.Factories; using Lib.Audio.Interfaces; using Lib.Driver.Interfaces; using Lib.Logging; using Lib.Midi.Factories; using Lib.Midi.Interfaces; using Lib.Midi.Messages.Interfaces; namespace Lib.Audio { public class Device : IDevice { private readonly IDriver _driver; private readonly IMidiCommunication _midiCommunication; private readonly IChannelFactory _channelFactory; public Device(IDriver driver, IControllableCollector controllableCollector, IMidiCommunicationFactory midiCommunicationFactory, IChannelFactory channelFactory) { _driver = driver; _midiCommunication = midiCommunicationFactory.Create(driver); _channelFactory = channelFactory; Channels = InitializeChannels(controllableCollector); _midiCommunication.MessageReceived += OnMidiCommunicationMessageReceived; _midiCommunication.ErrorReceived += OnMidiCommunicationErrorReceived; } public string Name => _driver.Name ?? ""; public List Channels { get; } public void StartCommunication(bool useMidiView) => _midiCommunication.Open(useMidiView); public void StopCommunication() => _midiCommunication.Close(); private List InitializeChannels(IControllableCollector controllableCollector) => _driver.Channels == null ? new List() : _driver.Channels.Select(c => _channelFactory.Create(c, controllableCollector, _midiCommunication)).ToList(); private void OnMidiCommunicationMessageReceived(object? sender, IMidiMessage message) { IChannel channel = Channels.First(c => c.ChannelNumber == message.ChannelNumber); channel.HandleMessage(message); channel.SendAcknowledge(); } private void OnMidiCommunicationErrorReceived(object? sender, IMidiMessage message) => Log.Write($"Midi Error: Message type: {message.GetType()}, Channel: {message.ChannelNumber}, RawMessage: {message.RawMessage}"); public void Dispose() { Channels.ForEach(c => c.Dispose()); _midiCommunication.Close(); } } }