Esempio n. 1
0
        /// <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);
        }
Esempio n. 2
0
        /// <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);
        }
Esempio n. 3
0
        /// <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);
        }
Esempio n. 4
0
        /// <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);
        }
Esempio n. 5
0
        /// <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);
        }
Esempio n. 6
0
        public void Push(MidiPortEvent record)
        {
            Check.IfArgumentNull(record, "record");

            this.queue.Enqueue(record);

            this.signal.Set();
        }
Esempio n. 7
0
        /// <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();
        }
Esempio n. 8
0
        /// <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.
            }
        }
Esempio n. 9
0
        /// <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);
        }
Esempio n. 10
0
        /// <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);
            }
        }
Esempio n. 12
0
        /// <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);
            }
        }
Esempio n. 13
0
        /// <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);
        }
Esempio n. 14
0
        /// <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);
        }
Esempio n. 15
0
 /// <inheritdocs/>
 public abstract void PortEvent(MidiPortEvent midiEvent);