private void HandleMessage(object sender, MidiMessage message) { // If it's a Data Set message aimed at this device, handle it... if (DataSetMessage.TryParse(message, out var result) && result.RawDeviceId == rawDeviceId && result.ModelId == Identifier.ModelId) { HandleDataSetMessage(result); } // Otherwise, delegate to any other event handlers that have been set up. else { MessageReceived?.Invoke(this, message); } }
private void HandleDataSetMessage(DataSetMessage message) { DataSetMessageReceived?.Invoke(this, message); LinkedList <TaskCompletionSource <byte[]> > sourcesToComplete = new LinkedList <TaskCompletionSource <byte[]> >(); lock (sync) { var node = consumers.First; while (node != null) { var consumer = node.Value; if (consumer.ExpectedAddress == message.Address && consumer.ExpectedSize == message.Length) { sourcesToComplete.AddLast(consumer.TaskCompletionSource); consumers.Remove(node); } node = node.Next; } } foreach (var source in sourcesToComplete) { source.TrySetResult(message.Data); } }