00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
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