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