Hack pulseaudio channel map for 5.1 DCPs to see if it fixes multi-channel playback...
[rtaudio-cdist.git] / include / asio.cpp
1 /*\r
2         Steinberg Audio Stream I/O API\r
3         (c) 1996, Steinberg Soft- und Hardware GmbH\r
4 \r
5         asio.cpp\r
6         \r
7         asio functions entries which translate the\r
8         asio interface to the asiodrvr class methods\r
9 */ \r
10         \r
11 #include <string.h>\r
12 #include "asiosys.h"            // platform definition\r
13 #include "asio.h"\r
14 \r
15 #if MAC\r
16 #include "asiodrvr.h"\r
17 \r
18 #pragma export on\r
19 \r
20 AsioDriver *theAsioDriver = 0;\r
21 \r
22 extern "C"\r
23 {\r
24 \r
25 long main()\r
26 {\r
27         return 'ASIO';\r
28 }\r
29 \r
30 #elif WINDOWS\r
31 \r
32 #include "windows.h"\r
33 #include "iasiodrv.h"\r
34 #include "asiodrivers.h"\r
35 \r
36 IASIO *theAsioDriver = 0;\r
37 extern AsioDrivers *asioDrivers;\r
38 \r
39 #elif SGI || SUN || BEOS || LINUX\r
40 #include "asiodrvr.h"\r
41 static AsioDriver *theAsioDriver = 0;\r
42 #endif\r
43 \r
44 //-----------------------------------------------------------------------------------------------------\r
45 ASIOError ASIOInit(ASIODriverInfo *info)\r
46 {\r
47 #if MAC || SGI || SUN || BEOS || LINUX\r
48         if(theAsioDriver)\r
49         {\r
50                 delete theAsioDriver;\r
51                 theAsioDriver = 0;\r
52         }               \r
53         info->driverVersion = 0;\r
54         strcpy(info->name, "No ASIO Driver");\r
55         theAsioDriver = getDriver();\r
56         if(!theAsioDriver)\r
57         {\r
58                 strcpy(info->errorMessage, "Not enough memory for the ASIO driver!"); \r
59                 return ASE_NotPresent;\r
60         }\r
61         if(!theAsioDriver->init(info->sysRef))\r
62         {\r
63                 theAsioDriver->getErrorMessage(info->errorMessage);\r
64                 delete theAsioDriver;\r
65                 theAsioDriver = 0;\r
66                 return ASE_NotPresent;\r
67         }\r
68         strcpy(info->errorMessage, "No ASIO Driver Error");\r
69         theAsioDriver->getDriverName(info->name);\r
70         info->driverVersion = theAsioDriver->getDriverVersion();\r
71         return ASE_OK;\r
72 \r
73 #else\r
74 \r
75         info->driverVersion = 0;\r
76         strcpy(info->name, "No ASIO Driver");\r
77         if(theAsioDriver)       // must be loaded!\r
78         {\r
79                 if(!theAsioDriver->init(info->sysRef))\r
80                 {\r
81                         theAsioDriver->getErrorMessage(info->errorMessage);\r
82                         theAsioDriver = 0;\r
83                         return ASE_NotPresent;\r
84                 }               \r
85 \r
86                 strcpy(info->errorMessage, "No ASIO Driver Error");\r
87                 theAsioDriver->getDriverName(info->name);\r
88                 info->driverVersion = theAsioDriver->getDriverVersion();\r
89                 return ASE_OK;\r
90         }\r
91         return ASE_NotPresent;\r
92 \r
93 #endif  // !MAC\r
94 }\r
95 \r
96 ASIOError ASIOExit(void)\r
97 {\r
98         if(theAsioDriver)\r
99         {\r
100 #if WINDOWS\r
101                 asioDrivers->removeCurrentDriver();\r
102 #else\r
103                 delete theAsioDriver;\r
104 #endif\r
105         }               \r
106         theAsioDriver = 0;\r
107         return ASE_OK;\r
108 }\r
109 \r
110 ASIOError ASIOStart(void)\r
111 {\r
112         if(!theAsioDriver)\r
113                 return ASE_NotPresent;\r
114         return theAsioDriver->start();\r
115 }\r
116 \r
117 ASIOError ASIOStop(void)\r
118 {\r
119         if(!theAsioDriver)\r
120                 return ASE_NotPresent;\r
121         return theAsioDriver->stop();\r
122 }\r
123 \r
124 ASIOError ASIOGetChannels(long *numInputChannels, long *numOutputChannels)\r
125 {\r
126         if(!theAsioDriver)\r
127         {\r
128                 *numInputChannels = *numOutputChannels = 0;\r
129                 return ASE_NotPresent;\r
130         }\r
131         return theAsioDriver->getChannels(numInputChannels, numOutputChannels);\r
132 }\r
133 \r
134 ASIOError ASIOGetLatencies(long *inputLatency, long *outputLatency)\r
135 {\r
136         if(!theAsioDriver)\r
137         {\r
138                 *inputLatency = *outputLatency = 0;\r
139                 return ASE_NotPresent;\r
140         }\r
141         return theAsioDriver->getLatencies(inputLatency, outputLatency);\r
142 }\r
143 \r
144 ASIOError ASIOGetBufferSize(long *minSize, long *maxSize, long *preferredSize, long *granularity)\r
145 {\r
146         if(!theAsioDriver)\r
147         {\r
148                 *minSize = *maxSize = *preferredSize = *granularity = 0;\r
149                 return ASE_NotPresent;\r
150         }\r
151         return theAsioDriver->getBufferSize(minSize, maxSize, preferredSize, granularity);\r
152 }\r
153 \r
154 ASIOError ASIOCanSampleRate(ASIOSampleRate sampleRate)\r
155 {\r
156         if(!theAsioDriver)\r
157                 return ASE_NotPresent;\r
158         return theAsioDriver->canSampleRate(sampleRate);\r
159 }\r
160 \r
161 ASIOError ASIOGetSampleRate(ASIOSampleRate *currentRate)\r
162 {\r
163         if(!theAsioDriver)\r
164                 return ASE_NotPresent;\r
165         return theAsioDriver->getSampleRate(currentRate);\r
166 }\r
167 \r
168 ASIOError ASIOSetSampleRate(ASIOSampleRate sampleRate)\r
169 {\r
170         if(!theAsioDriver)\r
171                 return ASE_NotPresent;\r
172         return theAsioDriver->setSampleRate(sampleRate);\r
173 }\r
174 \r
175 ASIOError ASIOGetClockSources(ASIOClockSource *clocks, long *numSources)\r
176 {\r
177         if(!theAsioDriver)\r
178         {\r
179                 *numSources = 0;\r
180                 return ASE_NotPresent;\r
181         }\r
182         return theAsioDriver->getClockSources(clocks, numSources);\r
183 }\r
184 \r
185 ASIOError ASIOSetClockSource(long reference)\r
186 {\r
187         if(!theAsioDriver)\r
188                 return ASE_NotPresent;\r
189         return theAsioDriver->setClockSource(reference);\r
190 }\r
191 \r
192 ASIOError ASIOGetSamplePosition(ASIOSamples *sPos, ASIOTimeStamp *tStamp)\r
193 {\r
194         if(!theAsioDriver)\r
195                 return ASE_NotPresent;\r
196         return theAsioDriver->getSamplePosition(sPos, tStamp);\r
197 }\r
198 \r
199 ASIOError ASIOGetChannelInfo(ASIOChannelInfo *info)\r
200 {\r
201         if(!theAsioDriver)\r
202         {\r
203                 info->channelGroup = -1;\r
204                 info->type = ASIOSTInt16MSB;\r
205                 strcpy(info->name, "None");\r
206                 return ASE_NotPresent;\r
207         }\r
208         return theAsioDriver->getChannelInfo(info);\r
209 }\r
210 \r
211 ASIOError ASIOCreateBuffers(ASIOBufferInfo *bufferInfos, long numChannels,\r
212         long bufferSize, ASIOCallbacks *callbacks)\r
213 {\r
214         if(!theAsioDriver)\r
215         {\r
216                 ASIOBufferInfo *info = bufferInfos;\r
217                 for(long i = 0; i < numChannels; i++, info++)\r
218                         info->buffers[0] = info->buffers[1] = 0;\r
219                 return ASE_NotPresent;\r
220         }\r
221         return theAsioDriver->createBuffers(bufferInfos, numChannels, bufferSize, callbacks);\r
222 }\r
223 \r
224 ASIOError ASIODisposeBuffers(void)\r
225 {\r
226         if(!theAsioDriver)\r
227                 return ASE_NotPresent;\r
228         return theAsioDriver->disposeBuffers();\r
229 }\r
230 \r
231 ASIOError ASIOControlPanel(void)\r
232 {\r
233         if(!theAsioDriver)\r
234                 return ASE_NotPresent;\r
235         return theAsioDriver->controlPanel();\r
236 }\r
237 \r
238 ASIOError ASIOFuture(long selector, void *opt)\r
239 {\r
240         if(!theAsioDriver)\r
241                 return ASE_NotPresent;\r
242         return theAsioDriver->future(selector, opt);\r
243 }\r
244 \r
245 ASIOError ASIOOutputReady(void)\r
246 {\r
247         if(!theAsioDriver)\r
248                 return ASE_NotPresent;\r
249         return theAsioDriver->outputReady();\r
250 }\r
251 \r
252 #if MAC\r
253 }       // extern "C"\r
254 #pragma export off\r
255 #endif\r
256 \r
257 \r