public void InterruptInput() { bool passed = false, aborted = false; var evt = new AlsaSequencerEvent(); AlsaSequencer seq = null; int appPort = -1; var waitStart = new ManualResetEvent(false); using (seq = new AlsaSequencer(AlsaIOType.Input, AlsaIOMode.None)) { appPort = seq.CreateSimplePort("alsa-sharp-test-input", AlsaPortCapabilities.Write | AlsaPortCapabilities.NoExport, AlsaPortType.Application | AlsaPortType.MidiGeneric); var cinfo = new AlsaClientInfo { Client = -1 }; int client = -1; while (seq.QueryNextClient(cinfo)) { if (cinfo.Name.Contains("Midi Through")) { client = cinfo.Client; } } if (client < 0) { Console.Error.WriteLine("Midi Through not found. Not testable."); return; // not testable } seq.ConnectFrom(appPort, client, 0); try { seq.ResetPoolInput(); var task = Task.Run(() => { waitStart.Set(); try { seq.Input(evt, appPort); passed = true; } catch (Exception ex) { passed = false; aborted = true; Console.Error.WriteLine("Input threw an error: " + ex); } }); waitStart.WaitOne(); // it will cause ALSA error as it's waiting for input in blocking mode. seq.DisconnectFrom(appPort, client, 0); task.Wait(50); Assert.IsFalse(passed, "input should keep listening"); seq.DeleteSimplePort(appPort); task.Wait(50); seq.Dispose(); seq = null; task.Wait(50); } finally { if (seq != null) { seq.Dispose(); } } // It doesn't even run exception part... Assert.IsFalse(aborted, "We expect it not to abort..."); } }
public void InputToObserveSystemAnnoucements() { bool passed = false; var evt = new AlsaSequencerEvent(); AlsaSequencer inseq = null; int appPort = -1; Task task = new TaskFactory().StartNew(() => { using (inseq = new AlsaSequencer(AlsaIOType.Input, AlsaIOMode.None)) { appPort = inseq.CreateSimplePort("alsa-sharp-test-input", AlsaPortCapabilities.Write | AlsaPortCapabilities.NoExport, AlsaPortType.Application | AlsaPortType.MidiGeneric); inseq.ConnectFrom(appPort, AlsaSequencer.ClientSystem, AlsaPortInfo.PortSystemAnnouncement); try { inseq.ResetPoolInput(); // ClientStart, PortStart, PortSubscribed, PortUnsubscribed, PortExit inseq.Input(evt, appPort); Assert.AreEqual(AlsaSequencerEventType.ClientStart, evt.EventType, "evt1"); inseq.Input(evt, appPort); Assert.AreEqual(AlsaSequencerEventType.PortStart, evt.EventType, "evt2"); inseq.Input(evt, appPort); Assert.AreEqual(AlsaSequencerEventType.PortSubscribed, evt.EventType, "evt3"); passed = true; } finally { inseq.DisconnectFrom(appPort, AlsaSequencer.ClientSystem, AlsaPortInfo.PortSystemAnnouncement); appPort = -1; } } }); Thread.Sleep(50); // give some time for announcement client to start. // create another port, which is a dummy and just subscribes to notify the system to raise an announcement event. var cinfo = new AlsaClientInfo { Client = -1 }; int lastClient = -1; var outseq = new AlsaSequencer(AlsaIOType.Input, AlsaIOMode.NonBlocking); while (outseq.QueryNextClient(cinfo)) { if (cinfo.Name.Contains("Midi Through")) { lastClient = cinfo.Client; } } if (lastClient < 0) { Console.Error.WriteLine("Midi Through not found. Not testable."); return; // not testable } int targetPort = 0; int testPort = outseq.CreateSimplePort("alsa-sharp-test-output", AlsaPortCapabilities.Write | AlsaPortCapabilities.NoExport, AlsaPortType.Application | AlsaPortType.MidiGeneric); try { outseq.ConnectTo(testPort, lastClient, targetPort); outseq.DisconnectTo(testPort, lastClient, targetPort); Thread.Sleep(50); // give some time for announcement client to finish. Assert.IsTrue(passed, "failed to receive an announcement"); } finally { outseq.DeleteSimplePort(testPort); } }