00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <memory>
00021
00022 #include "JackFFADOMidiOutputPort.h"
00023 #include "JackMidiUtil.h"
00024
00025 using Jack::JackFFADOMidiOutputPort;
00026
00027 JackFFADOMidiOutputPort::JackFFADOMidiOutputPort(size_t non_rt_size,
00028 size_t max_non_rt_messages,
00029 size_t max_rt_messages)
00030 {
00031 event = 0;
00032 read_queue = new JackMidiBufferReadQueue();
00033 std::auto_ptr<JackMidiBufferReadQueue> read_queue_ptr(read_queue);
00034 send_queue = new JackFFADOMidiSendQueue();
00035 std::auto_ptr<JackFFADOMidiSendQueue> send_queue_ptr(send_queue);
00036 raw_queue = new JackMidiRawOutputWriteQueue(send_queue, non_rt_size,
00037 max_non_rt_messages,
00038 max_rt_messages);
00039 send_queue_ptr.release();
00040 read_queue_ptr.release();
00041 }
00042
00043 JackFFADOMidiOutputPort::~JackFFADOMidiOutputPort()
00044 {
00045 delete raw_queue;
00046 delete read_queue;
00047 delete send_queue;
00048 }
00049
00050 void
00051 JackFFADOMidiOutputPort::Process(JackMidiBuffer *port_buffer,
00052 uint32_t *output_buffer,
00053 jack_nframes_t frames)
00054 {
00055 read_queue->ResetMidiBuffer(port_buffer);
00056 send_queue->ResetOutputBuffer(output_buffer, frames);
00057 jack_nframes_t boundary_frame = GetLastFrame() + frames;
00058 if (! event) {
00059 event = read_queue->DequeueEvent();
00060 }
00061 for (; event; event = read_queue->DequeueEvent()) {
00062 switch (raw_queue->EnqueueEvent(event)) {
00063 case JackMidiWriteQueue::BUFFER_FULL:
00064
00065
00066
00067
00068 raw_queue->Process(boundary_frame);
00069 switch (raw_queue->EnqueueEvent(event)) {
00070 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
00071
00072
00073 jack_error("JackFFADOMidiOutputPort::Process - **BUG** "
00074 "JackMidiRawOutputWriteQueue::EnqueueEvent "
00075 "returned `BUFFER_FULL`, and then returned "
00076 "`BUFFER_TOO_SMALL` after a `Process()` call.");
00077
00078 case JackMidiWriteQueue::OK:
00079 continue;
00080 default:
00081 return;
00082 }
00083 case JackMidiWriteQueue::BUFFER_TOO_SMALL:
00084 jack_error("JackFFADOMidiOutputPort::Process - The write queue "
00085 "couldn't enqueue a %d-byte event. Dropping event.",
00086 event->size);
00087
00088 case JackMidiWriteQueue::OK:
00089 continue;
00090 default:
00091
00092
00093 ;
00094 }
00095 break;
00096 }
00097 raw_queue->Process(boundary_frame);
00098 }