23 #include "JackALSARawMidiOutputPort.h"
24 #include "JackError.h"
28 JackALSARawMidiOutputPort::JackALSARawMidiOutputPort(
const char* client_name,
29 snd_rawmidi_info_t *info,
31 size_t max_bytes_per_poll,
34 JackALSARawMidiPort(client_name, info, index, POLLOUT)
37 read_queue =
new JackMidiBufferReadQueue();
38 std::unique_ptr<JackMidiBufferReadQueue> read_ptr(read_queue);
39 send_queue =
new JackALSARawMidiSendQueue(rawmidi, max_bytes_per_poll);
40 std::unique_ptr<JackALSARawMidiSendQueue> send_ptr(send_queue);
41 thread_queue =
new JackMidiAsyncQueue(max_bytes, max_messages);
42 std::unique_ptr<JackMidiAsyncQueue> thread_ptr(thread_queue);
43 raw_queue =
new JackMidiRawOutputWriteQueue(send_queue, max_bytes,
44 max_messages, max_messages);
50 JackALSARawMidiOutputPort::~JackALSARawMidiOutputPort()
59 JackALSARawMidiOutputPort::ProcessJack(JackMidiBuffer *port_buffer,
60 jack_nframes_t frames)
63 bool enqueued =
false;
67 case JackMidiWriteQueue::BUFFER_FULL:
68 jack_error(
"JackALSARawMidiOutputPort::ProcessJack - The thread "
69 "queue doesn't have enough room to enqueue a %d-byte "
70 "event. Dropping event.", event->size);
72 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
73 jack_error(
"JackALSARawMidiOutputPort::ProcessJack - The thread "
74 "queue is too small to enqueue a %d-byte event. "
75 "Dropping event.", event->size);
81 return enqueued ? TriggerQueueEvent() : true;
85 JackALSARawMidiOutputPort::ProcessPollEvents(
bool handle_output,
bool timeout,
86 jack_nframes_t *frame)
90 send_queue->ResetPollByteCount();
91 if (! handle_output) {
93 goto process_raw_queue;
95 io_event = GetIOPollEvent();
99 queue_event = GetQueuePollEvent();
100 if (queue_event == -1) {
103 if (io_event || timeout) {
108 }
else if (! queue_event) {
114 for (; alsa_event; alsa_event = thread_queue->
DequeueEvent()) {
116 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
117 jack_error(
"JackALSARawMidiOutputPort::ProcessQueues - The raw "
118 "output queue couldn't enqueue a %d-byte event. "
119 "Dropping event.", alsa_event->
size);
121 case JackMidiWriteQueue::OK:
131 case JackMidiWriteQueue::BUFFER_FULL:
133 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
142 bool blocked = send_queue->IsBlocked();
143 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)