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,...)
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 EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)=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()