1 /*
2 
3 Boost Software License - Version 1.0 - August 17th, 2003
4 
5 Permission is hereby granted, free of charge, to any person or organization
6 obtaining a copy of the software and accompanying documentation covered by
7 this license (the "Software") to use, reproduce, display, distribute,
8 execute, and transmit the Software, and to prepare derivative works of the
9 Software, and to permit third-parties to whom the Software is furnished to
10 do so, all subject to the following:
11 
12 The copyright notices in the Software and this entire statement, including
13 the above license grant, this restriction and the following disclaimer,
14 must be included in all copies of the Software, in whole or in part, and
15 all derivative works of the Software, unless such copies or derivative
16 works are solely in the form of machine-executable object code generated by
17 a source language processor.
18 
19 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
20 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
21 FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
22 SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
23 FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
24 ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
25 DEALINGS IN THE SOFTWARE.
26 
27 */
28 module derelict.alure.alure;
29 
30 private {
31     import derelict.util.loader;
32     import derelict.util.system;
33 
34     static if( Derelict_OS_Windows )
35         enum libNames = "ALURE32.dll";
36     else static if( Derelict_OS_Mac )
37         enum libNames = "libalure.dylib";
38     else static if( Derelict_OS_Posix )
39         enum libNames = "libalure.so, libalure.so.1";
40     else
41         static assert( 0, "Need to implement ALURE libNames for this operating system." );
42 }
43 
44 public import derelict.openal.al;
45 
46 enum ALURE_VERSION_1_2 = true;
47 
48 alias alureInt64 = long;
49 
50 struct alureStream;
51 
52 extern( C ) {
53     alias alureInstallDecodeCallbacks_open_file = void* function( ALchar* );
54     alias alureInstallDecodeCallbacks_open_memory = void* function( ALubyte*, ALuint );
55     alias alureInstallDecodeCallbacks_get_format = ALboolean function( void*, ALenum*, ALuint*, ALuint* );
56     alias alureInstallDecodeCallbacks_decode = ALuint function( void*, ALubyte*, ALuint );
57     alias alureInstallDecodeCallbacks_rewind = ALboolean function( void* );
58     alias alureInstallDecodeCallbacks_close = void function( void* );
59 
60     alias alureCreateStreamFromCallback_callback = ALuint function( void*, ALubyte*, ALuint );
61 
62     alias alureSetIOCallbacks_open_callback = void* function( char*, ALuint );
63     alias alureSetIOCallbacks_close_callback = void function( char* );
64     alias alureSetIOCallbacks_read_callback = ALsizei function( void*, ALubyte*, ALuint );
65     alias alureSetIOCallbacks_write_callback = ALsizei function( void*, ALubyte*, ALuint );
66     alias alureSetIOCallbacks_seek_callback = alureInt64 function( void*, alureInt64, int );
67 
68     alias alurePlaySourceStream_eos_callback = void function( void*, ALuint );
69     alias alurePlaySource_callback = void function( void*, ALuint );
70 }
71 
72 extern( C ) nothrow {
73     alias da_alureGetVersion = void function( ALuint*, ALuint* );
74     alias da_alureGetErrorString = ALchar* function();
75     alias da_alureGetDeviceNames = ALCchar** function( ALCboolean all, ALCsizei* );
76     alias da_alureFreeDeviceNames = void function( ALCchar** );
77     alias da_alureInitDevice = ALCboolean function( ALCchar*, ALCint* );
78     alias da_alureShutdownDevice = ALCboolean function();
79     alias da_alureGetSampleFormat = ALenum function( ALuint, ALuint, ALuint );
80     alias da_alureInstallDecodeCallbacks = ALboolean function( ALint,
81         alureInstallDecodeCallbacks_open_file,
82         alureInstallDecodeCallbacks_open_memory,
83         alureInstallDecodeCallbacks_get_format,
84         alureInstallDecodeCallbacks_decode,
85         alureInstallDecodeCallbacks_rewind, alureInstallDecodeCallbacks_close );
86     alias da_alureSleep = ALboolean function( ALfloat );
87     alias da_alureGetProcAddress = void* function( ALchar* );
88 
89     alias da_alureCreateBufferFromFile = ALuint function( ALchar* );
90     alias da_alureCreateBufferFromMemory = ALuint function( ALubyte*, ALsizei );
91     alias da_alureBufferDataFromFile = ALboolean function( ALchar*, ALuint );
92     alias da_alureBufferDataFromMemory = ALboolean function( ALubyte*, ALsizei, ALuint );
93 
94     alias da_alureStreamSizeIsMicroSec = ALboolean function( ALboolean );
95     alias da_alureCreateStreamFromFile = alureStream* function( ALchar*, ALsizei, ALsizei, ALuint* );
96     alias da_alureCreateStreamFromMemory = alureStream* function( ALubyte*, ALuint, ALsizei, ALsizei, ALuint* );
97     alias da_alureCreateStreamFromStaticMemory = alureStream* function( ALubyte*, ALuint, ALsizei, ALsizei, ALuint* );
98     alias da_alureCreateStreamFromCallback = alureStream* function( alureCreateStreamFromCallback_callback,
99         void*, ALenum, ALuint,ALsizei, ALsizei, ALuint* );
100     alias da_alureGetStreamFrequency = ALsizei function( alureStream* );
101     alias da_alureBufferDataFromStream = ALsizei function( alureStream*, ALsizei, ALuint* );
102     alias da_alureRewindStream = ALboolean function( alureStream*, ALsizei );
103     alias da_alureSetStreamOrder = ALboolean function( alureStream*, ALuint );
104     alias da_alureSetStreamPatchset = ALboolean function( alureStream*, ALchar* );
105     alias da_alureGetStreamLength = alureInt64 function( alureStream* );
106     alias da_alureDestroyStream = ALboolean function( alureStream*, ALsizei, ALuint* );
107 
108     alias da_alureSetIOCallbacks = ALboolean function( alureSetIOCallbacks_open_callback,
109         alureSetIOCallbacks_close_callback,
110         alureSetIOCallbacks_read_callback,
111         alureSetIOCallbacks_write_callback, alureSetIOCallbacks_seek_callback );
112 
113     alias da_alurePlaySourceStream = ALboolean function( ALuint, alureStream*, ALsizei, ALsizei, alurePlaySourceStream_eos_callback, void* );
114     alias da_alurePlaySource = ALboolean function( ALuint, alurePlaySource_callback, void* );
115     alias da_alureStopSource = ALboolean function( ALuint, ALboolean );
116     alias da_alurePauseSource = ALboolean function( ALuint );
117     alias da_alureResumeSource = ALboolean function( ALuint );
118     alias da_alureUpdate = void function();
119     alias da_alureUpdateInterval = ALboolean function( ALfloat );
120 }
121 
122 __gshared {
123     da_alureGetVersion alureGetVersion;
124     da_alureGetErrorString alureGetErrorString;
125     da_alureGetDeviceNames alureGetDeviceNames;
126     da_alureFreeDeviceNames alureFreeDeviceNames;
127     da_alureInitDevice alureInitDevice;
128     da_alureShutdownDevice alureShutdownDevice;
129     da_alureGetSampleFormat alureGetSampleFormat;
130     da_alureInstallDecodeCallbacks alureInstallDecodeCallbacks;
131     da_alureSleep alureSleep;
132     da_alureGetProcAddress alureGetProcAddress;
133 
134     da_alureCreateBufferFromFile alureCreateBufferFromFile;
135     da_alureCreateBufferFromMemory alureCreateBufferFromMemory;
136     da_alureBufferDataFromFile alureBufferDataFromFile;
137     da_alureBufferDataFromMemory alureBufferDataFromMemory;
138 
139     da_alureStreamSizeIsMicroSec alureStreamSizeIsMicroSec ;
140     da_alureCreateStreamFromFile alureCreateStreamFromFile;
141     da_alureCreateStreamFromMemory alureCreateStreamFromMemory;
142     da_alureCreateStreamFromStaticMemory alureCreateStreamFromStaticMemory;
143     da_alureCreateStreamFromCallback alureCreateStreamFromCallback;
144     da_alureGetStreamFrequency alureGetStreamFrequency;
145     da_alureBufferDataFromStream alureBufferDataFromStream;
146     da_alureRewindStream alureRewindStream;
147     da_alureSetStreamOrder alureSetStreamOrder;
148     da_alureSetStreamPatchset alureSetStreamPatchset;
149     da_alureGetStreamLength alureGetStreamLength;
150     da_alureDestroyStream alureDestroyStream;
151 
152     da_alureSetIOCallbacks alureSetIOCallbacks;
153 
154     da_alurePlaySourceStream alurePlaySourceStream;
155     da_alurePlaySource alurePlaySource;
156     da_alureStopSource alureStopSource;
157     da_alurePauseSource alurePauseSource;
158     da_alureResumeSource alureResumeSource;
159     da_alureUpdate alureUpdate;
160     da_alureUpdateInterval alureUpdateInterval;
161 }
162 
163 class DerelictALURELoader : SharedLibLoader {
164     protected override void loadSymbols() {
165         bindFunc( cast( void** )&alureGetVersion, "alureGetVersion" );
166         bindFunc( cast( void** )&alureGetErrorString, "alureGetErrorString" );
167         bindFunc( cast( void** )&alureGetDeviceNames, "alureGetDeviceNames" );
168         bindFunc( cast( void** )&alureFreeDeviceNames, "alureFreeDeviceNames" );
169         bindFunc( cast( void** )&alureInitDevice, "alureInitDevice" );
170         bindFunc( cast( void** )&alureShutdownDevice, "alureShutdownDevice" );
171         bindFunc( cast( void** )&alureGetSampleFormat, "alureGetSampleFormat" );
172         bindFunc( cast( void** )&alureInstallDecodeCallbacks, "alureInstallDecodeCallbacks" );
173         bindFunc( cast( void** )&alureSleep, "alureSleep" );
174         bindFunc( cast( void** )&alureGetProcAddress, "alureGetProcAddress" );
175 
176         bindFunc( cast( void** )&alureCreateBufferFromFile, "alureCreateBufferFromFile" );
177         bindFunc( cast( void** )&alureCreateBufferFromMemory, "alureCreateBufferFromMemory" );
178         bindFunc( cast( void** )&alureBufferDataFromFile, "alureBufferDataFromFile" );
179         bindFunc( cast( void** )&alureBufferDataFromMemory, "alureBufferDataFromMemory" );
180 
181         bindFunc( cast( void** )&alureStreamSizeIsMicroSec, "alureStreamSizeIsMicroSec" );
182         bindFunc( cast( void** )&alureCreateStreamFromFile, "alureCreateStreamFromFile" );
183         bindFunc( cast( void** )&alureCreateStreamFromMemory, "alureCreateStreamFromMemory" );
184         bindFunc( cast( void** )&alureCreateStreamFromStaticMemory, "alureCreateStreamFromStaticMemory" );
185         bindFunc( cast( void** )&alureCreateStreamFromCallback, "alureCreateStreamFromCallback" );
186         bindFunc( cast( void** )&alureGetStreamFrequency, "alureGetStreamFrequency" );
187         bindFunc( cast( void** )&alureBufferDataFromStream, "alureBufferDataFromStream" );
188         bindFunc( cast( void** )&alureRewindStream, "alureRewindStream" );
189         bindFunc( cast( void** )&alureSetStreamOrder, "alureSetStreamOrder" );
190         bindFunc( cast( void** )&alureSetStreamPatchset, "alureSetStreamPatchset" );
191         bindFunc( cast( void** )&alureGetStreamLength, "alureGetStreamLength" );
192         bindFunc( cast( void** )&alureDestroyStream, "alureDestroyStream" );
193 
194         bindFunc( cast( void** )&alureSetIOCallbacks, "alureSetIOCallbacks" );
195 
196         bindFunc( cast( void** )&alurePlaySourceStream, "alurePlaySourceStream" );
197         bindFunc( cast( void** )&alurePlaySource, "alurePlaySource" );
198         bindFunc( cast( void** )&alureStopSource, "alureStopSource" );
199         bindFunc( cast( void** )&alurePauseSource, "alurePauseSource" );
200         bindFunc( cast( void** )&alureResumeSource, "alureResumeSource" );
201         bindFunc( cast( void** )&alureUpdate, "alureUpdate" );
202         bindFunc( cast( void** )&alureUpdateInterval, "alureUpdateInterval" );
203     }
204 
205     public this() {
206         super( libNames );
207     }
208 }
209 
210 __gshared DerelictALURELoader DerelictALURE;
211 
212 shared static this() {
213     DerelictALURE = new DerelictALURELoader();
214 }