1 module derelict.portmidi.porttime; 2 3 private { 4 import derelict.util.loader; 5 import derelict.util.system; 6 7 //Note: On Linux, libportmidi and libporttime are separate libraries. 8 //Under Windows, both sets of functions are actually supplied by libPortMidi.dll 9 static if(Derelict_OS_Windows) 10 enum libNames = "libPortMidi.dll"; 11 12 //NOTE: According to the documentation found in /pm_mac/README_MAC.txt, 13 //everything is contained in libportmidi.dylib, no mention of a libporttime.dylib 14 else static if(Derelict_OS_Mac) 15 enum libNames = "libportmidi.dylib, /usr/local/lib/libportmidi.dylib"; 16 17 else static if(Derelict_OS_Posix) 18 enum libNames = "libporttime.so, /usr/local/lib/libporttime.so"; 19 20 else 21 static assert(0, "Need to implement libporttime libNames for this operating system."); 22 } 23 24 alias PtError = int; 25 26 enum : PtError { 27 ptNoError = 0, 28 ptHostError = -10000, 29 ptAlreadyStarted, 30 ptAlreadyStopped, 31 ptInsufficientMemory 32 } 33 34 alias PtTimestamp = int; 35 extern(C) nothrow alias PtCallback = void function(PtTimestamp timestamp, void* userData); 36 37 extern(C) @nogc nothrow { 38 alias da_Pt_Start = PtError function(int resolution, PtCallback callback, void* userData); 39 alias da_Pt_Stop = PtError function(); 40 alias da_Pt_Started = int function(); 41 alias da_Pt_Time = PtTimestamp function(); 42 alias da_Pt_Sleep = void function(int duration); 43 } 44 45 __gshared { 46 da_Pt_Start Pt_Start; 47 da_Pt_Stop Pt_Stop; 48 da_Pt_Started Pt_Started; 49 da_Pt_Time Pt_Time; 50 da_Pt_Sleep Pt_Sleep; 51 } 52 53 class DerelictPortTimeLoader : SharedLibLoader { 54 public this() { 55 super(libNames); 56 } 57 58 protected override void loadSymbols() { 59 bindFunc(cast(void**)&Pt_Start, "Pt_Start"); 60 bindFunc(cast(void**)&Pt_Stop, "Pt_Stop"); 61 bindFunc(cast(void**)&Pt_Started, "Pt_Started"); 62 bindFunc(cast(void**)&Pt_Time, "Pt_Time"); 63 bindFunc(cast(void**)&Pt_Sleep, "Pt_Sleep"); 64 } 65 } 66 67 __gshared DerelictPortTimeLoader DerelictPortTime; 68 69 shared static this() { 70 DerelictPortTime = new DerelictPortTimeLoader; 71 } 72