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)
    61     read_queue->ResetMidiBuffer(port_buffer);
    62     bool enqueued = 
false;
    64          event = read_queue->DequeueEvent()) {
    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);
 SERVER_EXPORT void jack_error(const char *fmt,...)
virtual jack_midi_event_t * DequeueEvent()
virtual EnqueueResult EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer)