24 #include "JackMidiRawInputWriteQueue.h"
25 #include "JackError.h"
29 JackMidiRawInputWriteQueue::
31 size_t max_packet_data,
size_t max_packets)
34 std::auto_ptr<JackMidiAsyncQueue> packet_queue_ptr(packet_queue);
35 input_buffer =
new jack_midi_data_t[max_packet_data];
38 event_pending =
false;
39 input_buffer_size = max_packet_data;
42 this->write_queue = write_queue;
43 packet_queue_ptr.release();
46 JackMidiRawInputWriteQueue::~JackMidiRawInputWriteQueue()
48 delete[] input_buffer;
53 JackMidiRawInputWriteQueue::Clear()
59 Jack::JackMidiWriteQueue::EnqueueResult
61 jack_midi_data_t *buffer)
76 jack_error(
"JackMidiRawInputWriteQueue::HandleBufferFailure - %d MIDI "
77 "byte(s) of a %d byte message could not be buffered. The "
78 "message has been dropped.", unbuffered_bytes, total_bytes);
84 jack_error(
"JackMidiRawInputWriteQueue::HandleEventLoss - A %d byte MIDI "
85 "event scheduled for frame '%d' could not be processed because "
86 "the write queue cannot accomodate an event of that size. The "
87 "event has been discarded.", event->
size, event->
time);
93 jack_error(
"JackMidiRawInputWriteQueue::HandleIncompleteMessage - "
94 "Discarding %d MIDI byte(s) of an incomplete message. The "
95 "MIDI cable may have been unplugged.", total_bytes);
101 jack_error(
"JackMidiRawInputWriteQueue::HandleInvalidStatusByte - "
102 "Dropping invalid MIDI status byte '%x'.", (
unsigned int) byte);
108 jack_error(
"JackMidiRawInputWriteQueue::HandleUnexpectedSysexEnd - "
109 "Received a sysex end byte without first receiving a sysex "
110 "start byte. Discarding %d MIDI byte(s). The cable may have "
111 "been unplugged.", total_bytes);
115 JackMidiRawInputWriteQueue::PrepareBufferedEvent(jack_nframes_t time)
117 bool result = ! unbuffered_bytes;
121 PrepareEvent(time, total_bytes, input_buffer);
124 if (status_byte >= 0xf0) {
132 JackMidiRawInputWriteQueue::PrepareByteEvent(jack_nframes_t time,
133 jack_midi_data_t byte)
136 PrepareEvent(time, 1, &event_byte);
141 JackMidiRawInputWriteQueue::PrepareEvent(jack_nframes_t time,
size_t size,
142 jack_midi_data_t *buffer)
144 event.buffer = buffer;
147 event_pending =
true;
154 if (! WriteEvent(boundary_frame)) {
163 if (ProcessByte(packet->
time, *(packet->
buffer))) {
164 if (! WriteEvent(boundary_frame)) {
176 JackMidiRawInputWriteQueue::ProcessByte(jack_nframes_t time,
177 jack_midi_data_t byte)
185 return PrepareByteEvent(time, byte);
189 if (status_byte == 0xf0) {
191 return PrepareBufferedEvent(time);
206 switch (byte & 0xf0) {
244 bool result = PrepareByteEvent(time, byte);
264 RecordByte(status_byte);
267 return (total_bytes == expected_bytes) ? PrepareBufferedEvent(time) :
272 JackMidiRawInputWriteQueue::RecordByte(jack_midi_data_t byte)
274 if (total_bytes < input_buffer_size) {
275 input_buffer[total_bytes] = byte;
283 JackMidiRawInputWriteQueue::WriteEvent(jack_nframes_t boundary_frame)
285 if ((! boundary_frame) || (event.
time < boundary_frame)) {
287 case BUFFER_TOO_SMALL:
291 event_pending =
false;
jack_midi_data_t * buffer
SERVER_EXPORT void jack_error(const char *fmt,...)
size_t GetAvailableSpace()
virtual EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)=0
virtual jack_midi_event_t * DequeueEvent()
virtual EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)