23 #include "JackError.h"
24 #include "JackMidiRawOutputWriteQueue.h"
25 #include "JackMidiUtil.h"
29 #define STILL_TIME(c, b) ((! (b)) || ((c) < (b)))
31 JackMidiRawOutputWriteQueue::
33 size_t max_non_rt_messages,
size_t max_rt_messages)
36 std::auto_ptr<JackMidiAsyncQueue> non_rt_ptr(non_rt_queue);
38 std::auto_ptr<JackMidiAsyncQueue> rt_ptr(rt_queue);
42 this->send_queue = send_queue;
47 JackMidiRawOutputWriteQueue::~JackMidiRawOutputWriteQueue()
54 JackMidiRawOutputWriteQueue::DequeueNonRealtimeEvent()
58 non_rt_event_time = non_rt_event->
time;
59 running_status = ApplyRunningStatus(non_rt_event, running_status);
64 JackMidiRawOutputWriteQueue::DequeueRealtimeEvent()
68 rt_event_time = rt_event->
time;
72 Jack::JackMidiWriteQueue::EnqueueResult
74 jack_midi_data_t *buffer)
83 jack_midi_data_t byte)
85 jack_error(
"JackMidiRawOutputWriteQueue::HandleWriteQueueBug - **BUG** "
86 "The write queue told us that it couldn't enqueue a 1-byte "
87 "MIDI event scheduled for frame '%d'. This is probably a bug "
88 "in the write queue implementation.", time);
95 DequeueNonRealtimeEvent();
98 DequeueRealtimeEvent();
102 if ((rt_event_time > current_frame) && non_rt_event &&
103 (non_rt_event_time < rt_event_time)) {
104 if (! SendNonRTBytes(rt_event_time < boundary_frame ?
105 rt_event_time : boundary_frame)) {
106 return non_rt_event_time;
110 if (! STILL_TIME(current_frame, boundary_frame)) {
111 return (! non_rt_event) ? rt_event_time :
112 non_rt_event_time < rt_event_time ? non_rt_event_time :
115 if (! SendByte(rt_event_time, *(rt_event->
buffer))) {
116 return rt_event_time;
118 DequeueRealtimeEvent();
120 SendNonRTBytes(boundary_frame);
121 return non_rt_event ? non_rt_event_time : 0;
125 JackMidiRawOutputWriteQueue::SendByte(jack_nframes_t time,
126 jack_midi_data_t byte)
129 case BUFFER_TOO_SMALL:
142 JackMidiRawOutputWriteQueue::SendNonRTBytes(jack_nframes_t boundary_frame)
144 while (non_rt_event) {
145 for (; non_rt_event->
size;
146 (non_rt_event->
size)--, (non_rt_event->
buffer)++) {
148 if (! STILL_TIME(current_frame, boundary_frame)) {
151 if (! SendByte(non_rt_event_time, *(non_rt_event->
buffer))) {
155 DequeueNonRealtimeEvent();
jack_midi_data_t * buffer
SERVER_EXPORT void jack_error(const char *fmt,...)
virtual EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)=0
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 void HandleWriteQueueBug(jack_nframes_t time, jack_midi_data_t byte)
virtual EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)
virtual jack_nframes_t GetNextScheduleFrame()