Jack2  1.9.10
JackCoreMidiOutputPort.h
00001 /*
00002 Copyright (C) 2011 Devin Anderson
00003 
00004 This program is free software; you can redistribute it and/or modify
00005 it under the terms of the GNU General Public License as published by
00006 the Free Software Foundation; either version 2 of the License, or
00007 (at your option) any later version.
00008 
00009 This program is distributed in the hope that it will be useful,
00010 but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00012 GNU General Public License for more details.
00013 
00014 You should have received a copy of the GNU General Public License
00015 along with this program; if not, write to the Free Software
00016 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 
00018 */
00019 
00020 #ifndef __JackCoreMidiOutputPort__
00021 #define __JackCoreMidiOutputPort__
00022 
00023 #include <semaphore.h>
00024 
00025 #include "JackCoreMidiPort.h"
00026 #include "JackMidiAsyncQueue.h"
00027 #include "JackMidiBufferReadQueue.h"
00028 #include "JackThread.h"
00029 
00030 namespace Jack {
00031 
00032     class JackCoreMidiOutputPort:
00033         public JackCoreMidiPort, public JackRunnableInterface {
00034 
00035     private:
00036 
00037         jack_midi_event_t *
00038         GetCoreMidiEvent(bool block);
00039 
00040         MIDITimeStamp
00041         GetTimeStampFromFrames(jack_nframes_t frames);
00042 
00043         static const size_t PACKET_BUFFER_SIZE = 65536;
00044 
00045         SInt32 advance_schedule_time;
00046         char packet_buffer[PACKET_BUFFER_SIZE];
00047         JackMidiBufferReadQueue *read_queue;
00048         char semaphore_name[128];
00049         JackThread *thread;
00050         JackMidiAsyncQueue *thread_queue;
00051         sem_t *thread_queue_semaphore;
00052 
00053     protected:
00054 
00055         virtual bool
00056         SendPacketList(MIDIPacketList *packet_list) = 0;
00057 
00058         void
00059         Initialize(const char *alias_name, const char *client_name,
00060                    const char *driver_name, int index,
00061                    MIDIEndpointRef endpoint, SInt32 advance_schedule_time);
00062 
00063     public:
00064 
00065         JackCoreMidiOutputPort(double time_ratio, size_t max_bytes=4096,
00066                                size_t max_messages=1024);
00067 
00068         virtual
00069         ~JackCoreMidiOutputPort();
00070 
00071         bool
00072         Execute();
00073 
00074         bool
00075         Init();
00076 
00077         void
00078         ProcessJack(JackMidiBuffer *port_buffer, jack_nframes_t frames);
00079 
00080         bool
00081         Start();
00082 
00083         bool
00084         Stop();
00085 
00086     };
00087 
00088 }
00089 
00090 #endif