Jack2  1.9.8
JackWinMMEOutputPort.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 __JackWinMMEOutputPort__
00021 #define __JackWinMMEOutputPort__
00022 
00023 #include "JackMidiAsyncQueue.h"
00024 #include "JackMidiBufferReadQueue.h"
00025 #include "JackThread.h"
00026 #include "JackWinMMEPort.h"
00027 
00028 namespace Jack {
00029 
00030     class JackWinMMEOutputPort :
00031             public JackWinMMEPort, public JackRunnableInterface {
00032 
00033     private:
00034 
00035         static void CALLBACK
00036         HandleMessageEvent(HMIDIOUT handle, UINT message, DWORD_PTR port,
00037                            DWORD_PTR param1, DWORD_PTR param2);
00038 
00039         void
00040         GetOutErrorString(MMRESULT error, LPTSTR text);
00041 
00042         void
00043         HandleMessage(UINT message, DWORD_PTR param1, DWORD_PTR param2);
00044 
00045         bool
00046         Signal(HANDLE semaphore);
00047 
00048         bool
00049         Wait(HANDLE semaphore);
00050 
00051         void
00052         WriteOutError(const char *jack_func, const char *mm_func,
00053                                    MMRESULT result);
00054 
00055         HMIDIOUT handle;
00056         JackMidiBufferReadQueue *read_queue;
00057         HANDLE sysex_semaphore;
00058         JackThread *thread;
00059         JackMidiAsyncQueue *thread_queue;
00060         HANDLE thread_queue_semaphore;
00061         HANDLE timer;
00062 
00063     public:
00064 
00065         JackWinMMEOutputPort(const char *alias_name, const char *client_name,
00066                              const char *driver_name, UINT index,
00067                              size_t max_bytes=4096, size_t max_messages=1024);
00068 
00069         ~JackWinMMEOutputPort();
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