/// <summary> /// Pushes a long midi message into the queue, marked as error. /// </summary> /// <param name="buffer">A long midi message. Must not be null.</param> /// <param name="timestamp">A time indication of the midi message.</param> public void PushLongError(MidiBufferStream buffer, long timestamp) { MidiPortEvent rec = new MidiPortEvent( MidiPortEventType.LongError, buffer, timestamp); this.Push(rec); }
/// <summary> /// Pushes a short midi message into the queue, marked as error. /// </summary> /// <param name="data">A short midi message.</param> /// <param name="timestamp">A time indication of the midi message.</param> public void PushShortError(int data, long timestamp) { MidiPortEvent rec = new MidiPortEvent( MidiPortEventType.ShortError, data, timestamp); this.Push(rec); }
/// <summary> /// Pushes a short midi message into the queue, marked as more-data. /// </summary> /// <param name="data">A short midi message.</param> /// <param name="timestamp">A time indication of the midi message.</param> public void PushMoreData(int data, long timestamp) { MidiPortEvent rec = new MidiPortEvent( MidiPortEventType.MoreData, data, timestamp); this.Push(rec); }
/// <summary> /// Pushes a long midi message into the queue. /// </summary> /// <param name="buffer">A long midi message. Must not be null.</param> /// <param name="timestamp">A time indication of the midi message.</param> public void PushLongData(MidiBufferStream buffer, long timestamp) { MidiPortEvent rec = new MidiPortEvent( MidiPortEventType.LongData, buffer, timestamp); Push(rec); }
/// <summary> /// Pushes a short midi message into the queue. /// </summary> /// <param name="data">A short midi message.</param> /// <param name="timestamp">A time indication of the midi message.</param> public void PushShortData(int data, long timestamp) { MidiPortEvent rec = new MidiPortEvent( MidiPortEventType.ShortData, data, timestamp); Push(rec); }
public void Push(MidiPortEvent record) { Check.IfArgumentNull(record, "record"); this.queue.Enqueue(record); this.signal.Set(); }
/// <summary> /// Pushes a new record onto the queue. /// </summary> /// <param name="record">A midi record.</param> /// <remarks>This method synchronizes access to the internal queue.</remarks> public void Push(MidiPortEvent record) { Check.IfArgumentNull(record, nameof(record)); _queue.Enqueue(record); _signal.Set(); }
/// <summary> /// Clears all records from the queue. /// </summary> /// <remarks>This method synchronizes access to the internal queue.</remarks> public void Clear() { MidiPortEvent item = null; while (this.queue.TryDequeue(out item)) { // eat the items. } }
/// <summary> /// De-queue's the next port events. /// </summary> /// <returns>Returns null when no event was in the queue.</returns> public MidiPortEvent Pop() { MidiPortEvent record = null; if (this.queue.TryDequeue(out record)) { return(record); } return(null); }
/// <summary> /// The thread procedure. /// </summary> /// <param name="state">Not used.</param> private void AsyncReadLoop(object state) { // loop until port is closed while (_queue.Wait(Timeout.Infinite) && PortStatus != MidiPortStatus.Closed) { while (_queue.Count > 0) { MidiPortEvent record = _queue.Pop(); if (record != null) { DispatchRecord(record); } } } // throw away queued records _queue.Clear(); }
/// <summary> /// Receives a port event. /// </summary> /// <param name="midiEvent">The port event. Must not be null.</param> /// <remarks>A new event is created with a new timestamp and send to the component's successors.</remarks> public override void PortEvent(MidiPortEvent midiEvent) { Check.IfArgumentNull(midiEvent, nameof(midiEvent)); if (NextPortEventReceiver != null) { MidiPortEvent newEvent; if (midiEvent.IsShortMessage) { newEvent = new MidiPortEvent(midiEvent.RecordType, midiEvent.Data, GetCurrentTimestamp()); } else { newEvent = new MidiPortEvent(midiEvent.RecordType, midiEvent.Buffer, GetCurrentTimestamp()); } NextPortEventReceiver.PortEvent(newEvent); } }
/// <summary> /// Dispatches the <paramref name="record"/> to the appropriate receiver component. /// </summary> /// <param name="record">Must not be null.</param> private void DispatchRecord(MidiPortEvent record) { Contract.Requires(record != null); Check.IfArgumentNull(record, "record"); if (NextReceiver != null) { switch (record.RecordType) { case MidiPortEventType.MoreData: case MidiPortEventType.ShortData: NextReceiver.ShortData(record.Data, (int)record.Timestamp); break; case MidiPortEventType.LongData: NextReceiver.LongData(record.Buffer, (int)record.Timestamp); break; } } if (NextErrorReceiver != null) { switch (record.RecordType) { case MidiPortEventType.ShortError: NextErrorReceiver.ShortError(record.Data, (int)record.Timestamp); break; case MidiPortEventType.LongError: NextErrorReceiver.LongError(record.Buffer, (int)record.Timestamp); break; } } if (NextPortEventReceiver != null) { NextPortEventReceiver.PortEvent(record); } }
/// <summary> /// Puts a Port Event on the queue. /// </summary> /// <param name="midiEvent">The Port Event. Must not be null.</param> public override void PortEvent(MidiPortEvent midiEvent) { Check.IfArgumentNull(midiEvent, nameof(midiEvent)); _queue.Push(midiEvent); }
/// <summary> /// Puts a Port Event on the queue. /// </summary> /// <param name="midiEvent">The Port Event. Must not be null.</param> public override void PortEvent(MidiPortEvent midiEvent) { Check.IfArgumentNull(midiEvent, "portEvent"); this.queue.Push(midiEvent); }
/// <inheritdocs/> public abstract void PortEvent(MidiPortEvent midiEvent);