23 #include "JackALSARawMidiOutputPort.h"
24 #include "JackError.h"
28 JackALSARawMidiOutputPort::JackALSARawMidiOutputPort(snd_rawmidi_info_t *info,
30 size_t max_bytes_per_poll,
33 JackALSARawMidiPort(info, index, POLLOUT)
36 read_queue =
new JackMidiBufferReadQueue();
37 std::auto_ptr<JackMidiBufferReadQueue> read_ptr(read_queue);
38 send_queue =
new JackALSARawMidiSendQueue(rawmidi, max_bytes_per_poll);
39 std::auto_ptr<JackALSARawMidiSendQueue> send_ptr(send_queue);
40 thread_queue =
new JackMidiAsyncQueue(max_bytes, max_messages);
41 std::auto_ptr<JackMidiAsyncQueue> thread_ptr(thread_queue);
42 raw_queue =
new JackMidiRawOutputWriteQueue(send_queue, max_bytes,
43 max_messages, max_messages);
49 JackALSARawMidiOutputPort::~JackALSARawMidiOutputPort()
58 JackALSARawMidiOutputPort::ProcessJack(JackMidiBuffer *port_buffer,
59 jack_nframes_t frames)
62 bool enqueued =
false;
66 case JackMidiWriteQueue::BUFFER_FULL:
67 jack_error(
"JackALSARawMidiOutputPort::ProcessJack - The thread "
68 "queue doesn't have enough room to enqueue a %d-byte "
69 "event. Dropping event.", event->size);
71 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
72 jack_error(
"JackALSARawMidiOutputPort::ProcessJack - The thread "
73 "queue is too small to enqueue a %d-byte event. "
74 "Dropping event.", event->size);
80 return enqueued ? TriggerQueueEvent() : true;
84 JackALSARawMidiOutputPort::ProcessPollEvents(
bool handle_output,
bool timeout,
85 jack_nframes_t *frame)
89 send_queue->ResetPollByteCount();
90 if (! handle_output) {
92 goto process_raw_queue;
94 io_event = GetIOPollEvent();
98 queue_event = GetQueuePollEvent();
99 if (queue_event == -1) {
102 if (io_event || timeout) {
107 }
else if (! queue_event) {
113 for (; alsa_event; alsa_event = thread_queue->
DequeueEvent()) {
115 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
116 jack_error(
"JackALSARawMidiOutputPort::ProcessQueues - The raw "
117 "output queue couldn't enqueue a %d-byte event. "
118 "Dropping event.", alsa_event->
size);
120 case JackMidiWriteQueue::OK:
130 case JackMidiWriteQueue::BUFFER_FULL:
132 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
141 bool blocked = send_queue->IsBlocked();
142 SetIOEventsEnabled(blocked);
jack_midi_event_t * DequeueEvent()
void ResetMidiBuffer(JackMidiBuffer *buffer)
SERVER_EXPORT void jack_error(const char *fmt,...)
EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)
jack_nframes_t Process(jack_nframes_t boundary_frame=0)
virtual jack_midi_event_t * DequeueEvent()
virtual EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)