23 #include "JackCoreMidiInputPort.h"
24 #include "JackMidiUtil.h"
28 JackCoreMidiInputPort::JackCoreMidiInputPort(
double time_ratio,
31 JackCoreMidiPort(time_ratio)
33 thread_queue =
new JackMidiAsyncQueue(max_bytes, max_messages);
34 std::auto_ptr<JackMidiAsyncQueue> thread_queue_ptr(thread_queue);
35 write_queue =
new JackMidiBufferWriteQueue();
36 std::auto_ptr<JackMidiBufferWriteQueue> write_queue_ptr(write_queue);
37 sysex_buffer =
new jack_midi_data_t[max_bytes];
38 write_queue_ptr.release();
39 thread_queue_ptr.release();
43 JackCoreMidiInputPort::~JackCoreMidiInputPort()
47 delete[] sysex_buffer;
51 JackCoreMidiInputPort::GetFramesFromTimeStamp(MIDITimeStamp timestamp)
53 return GetFramesFromTime((jack_time_t) (timestamp * time_ratio));
57 JackCoreMidiInputPort::Initialize(
const char *alias_name,
58 const char *client_name,
59 const char *driver_name,
int index,
60 MIDIEndpointRef endpoint)
62 JackCoreMidiPort::Initialize(alias_name, client_name, driver_name, index, endpoint,
false);
66 JackCoreMidiInputPort::ProcessCoreMidi(
const MIDIPacketList *packet_list)
68 set_threaded_log_function();
70 unsigned int packet_count = packet_list->numPackets;
72 MIDIPacket *packet = (MIDIPacket *) packet_list->packet;
73 for (
unsigned int i = 0; i < packet_count; i++) {
74 jack_midi_data_t *data = packet->data;
75 size_t size = packet->length;
82 if (sysex_bytes_sent) {
84 jack_error(
"JackCoreMidiInputPort::ProcessCoreMidi - System "
85 "exclusive message aborted.");
90 if ((sysex_bytes_sent + size) <=
sizeof(sysex_buffer)) {
91 memcpy(sysex_buffer + sysex_bytes_sent, packet,
92 size *
sizeof(jack_midi_data_t));
94 sysex_bytes_sent += size;
95 if (data[size - 1] == 0xf7) {
96 if (sysex_bytes_sent >
sizeof(sysex_buffer)) {
97 jack_error(
"JackCoreMidiInputPort::ProcessCoreMidi - "
98 "Could not buffer a %d-byte system exclusive "
99 "message. Discarding message.",
101 sysex_bytes_sent = 0;
102 goto get_next_packet;
104 event.buffer = sysex_buffer;
105 event.size = sysex_bytes_sent;
106 sysex_bytes_sent = 0;
109 goto get_next_packet;
113 if (data[0] == 0xf0) {
114 if (data[size - 1] != 0xf7) {
115 goto buffer_sysex_bytes;
122 event.time = GetFramesFromTimeStamp(packet->timeStamp);
124 case JackMidiWriteQueue::BUFFER_FULL:
125 jack_error(
"JackCoreMidiInputPort::ProcessCoreMidi - The thread "
126 "queue buffer is full. Dropping event.");
128 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
129 jack_error(
"JackCoreMidiInputPort::ProcessCoreMidi - The thread "
130 "queue couldn't enqueue a %d-byte packet. Dropping "
131 "event.", event.
size);
138 packet = MIDIPacketNext(packet);
144 JackCoreMidiInputPort::ProcessJack(JackMidiBuffer *port_buffer,
145 jack_nframes_t frames)
152 for (; jack_event; jack_event = thread_queue->
DequeueEvent()) {
154 switch (write_queue->
EnqueueEvent(jack_event, frames)) {
155 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
156 jack_error(
"JackCoreMidiInputPort::ProcessJack - The write queue "
157 "couldn't enqueue a %d-byte event. Dropping event.",
160 case JackMidiWriteQueue::OK:
170 JackCoreMidiInputPort::Start()
175 sysex_bytes_sent = 0;
180 JackCoreMidiInputPort::Stop()