23 #include "JackALSARawMidiOutputPort.h"
27 JackALSARawMidiOutputPort::JackALSARawMidiOutputPort(snd_rawmidi_info_t *info,
29 size_t max_bytes_per_poll,
32 JackALSARawMidiPort(info, index, POLLOUT)
35 read_queue =
new JackMidiBufferReadQueue();
36 std::auto_ptr<JackMidiBufferReadQueue> read_ptr(read_queue);
37 send_queue =
new JackALSARawMidiSendQueue(rawmidi, max_bytes_per_poll);
38 std::auto_ptr<JackALSARawMidiSendQueue> send_ptr(send_queue);
39 thread_queue =
new JackMidiAsyncQueue(max_bytes, max_messages);
40 std::auto_ptr<JackMidiAsyncQueue> thread_ptr(thread_queue);
41 raw_queue =
new JackMidiRawOutputWriteQueue(send_queue, max_bytes,
42 max_messages, max_messages);
48 JackALSARawMidiOutputPort::~JackALSARawMidiOutputPort()
57 JackALSARawMidiOutputPort::ProcessJack(JackMidiBuffer *port_buffer,
58 jack_nframes_t frames)
61 bool enqueued =
false;
65 case JackMidiWriteQueue::BUFFER_FULL:
66 jack_error(
"JackALSARawMidiOutputPort::ProcessJack - The thread "
67 "queue doesn't have enough room to enqueue a %d-byte "
68 "event. Dropping event.", event->size);
70 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
71 jack_error(
"JackALSARawMidiOutputPort::ProcessJack - The thread "
72 "queue is too small to enqueue a %d-byte event. "
73 "Dropping event.", event->size);
79 return enqueued ? TriggerQueueEvent() : true;
83 JackALSARawMidiOutputPort::ProcessPollEvents(
bool handle_output,
bool timeout,
84 jack_nframes_t *frame)
88 send_queue->ResetPollByteCount();
89 if (! handle_output) {
91 goto process_raw_queue;
93 io_event = GetIOPollEvent();
97 queue_event = GetQueuePollEvent();
98 if (queue_event == -1) {
101 if (io_event || timeout) {
106 }
else if (! queue_event) {
112 for (; alsa_event; alsa_event = thread_queue->
DequeueEvent()) {
114 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
115 jack_error(
"JackALSARawMidiOutputPort::ProcessQueues - The raw "
116 "output queue couldn't enqueue a %d-byte event. "
117 "Dropping event.", alsa_event->
size);
119 case JackMidiWriteQueue::OK:
129 case JackMidiWriteQueue::BUFFER_FULL:
131 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
140 bool blocked = send_queue->IsBlocked();
141 SetIOEventsEnabled(blocked);