24 #include "JackMidiRawInputWriteQueue.h"
28 JackMidiRawInputWriteQueue::
30 size_t max_packet_data,
size_t max_packets)
33 std::auto_ptr<JackMidiAsyncQueue> packet_queue_ptr(packet_queue);
34 input_buffer =
new jack_midi_data_t[max_packet_data];
37 event_pending =
false;
38 input_buffer_size = max_packet_data;
41 this->write_queue = write_queue;
42 packet_queue_ptr.release();
45 JackMidiRawInputWriteQueue::~JackMidiRawInputWriteQueue()
47 delete[] input_buffer;
52 JackMidiRawInputWriteQueue::Clear()
58 Jack::JackMidiWriteQueue::EnqueueResult
60 jack_midi_data_t *buffer)
75 jack_error(
"JackMidiRawInputWriteQueue::HandleBufferFailure - %d MIDI "
76 "byte(s) of a %d byte message could not be buffered. The "
77 "message has been dropped.", unbuffered_bytes, total_bytes);
83 jack_error(
"JackMidiRawInputWriteQueue::HandleEventLoss - A %d byte MIDI "
84 "event scheduled for frame '%d' could not be processed because "
85 "the write queue cannot accomodate an event of that size. The "
86 "event has been discarded.", event->
size, event->
time);
92 jack_error(
"JackMidiRawInputWriteQueue::HandleIncompleteMessage - "
93 "Discarding %d MIDI byte(s) of an incomplete message. The "
94 "MIDI cable may have been unplugged.", total_bytes);
100 jack_error(
"JackMidiRawInputWriteQueue::HandleInvalidStatusByte - "
101 "Dropping invalid MIDI status byte '%x'.", (
unsigned int) byte);
107 jack_error(
"JackMidiRawInputWriteQueue::HandleUnexpectedSysexEnd - "
108 "Received a sysex end byte without first receiving a sysex "
109 "start byte. Discarding %d MIDI byte(s). The cable may have "
110 "been unplugged.", total_bytes);
114 JackMidiRawInputWriteQueue::PrepareBufferedEvent(jack_nframes_t time)
116 bool result = ! unbuffered_bytes;
120 PrepareEvent(time, total_bytes, input_buffer);
123 if (status_byte >= 0xf0) {
131 JackMidiRawInputWriteQueue::PrepareByteEvent(jack_nframes_t time,
132 jack_midi_data_t byte)
135 PrepareEvent(time, 1, &event_byte);
140 JackMidiRawInputWriteQueue::PrepareEvent(jack_nframes_t time,
size_t size,
141 jack_midi_data_t *buffer)
143 event.buffer = buffer;
146 event_pending =
true;
153 if (! WriteEvent(boundary_frame)) {
162 if (ProcessByte(packet->
time, *(packet->
buffer))) {
163 if (! WriteEvent(boundary_frame)) {
175 JackMidiRawInputWriteQueue::ProcessByte(jack_nframes_t time,
176 jack_midi_data_t byte)
184 return PrepareByteEvent(time, byte);
188 if (status_byte == 0xf0) {
190 return PrepareBufferedEvent(time);
205 switch (byte & 0xf0) {
243 bool result = PrepareByteEvent(time, byte);
263 RecordByte(status_byte);
266 return (total_bytes == expected_bytes) ? PrepareBufferedEvent(time) :
271 JackMidiRawInputWriteQueue::RecordByte(jack_midi_data_t byte)
273 if (total_bytes < input_buffer_size) {
274 input_buffer[total_bytes] = byte;
282 JackMidiRawInputWriteQueue::WriteEvent(jack_nframes_t boundary_frame)
284 if ((! boundary_frame) || (event.
time < boundary_frame)) {
286 case BUFFER_TOO_SMALL:
290 event_pending =
false;