Mercurial > hg > sv-dependency-builds
comparison src/portaudio/bindings/cpp/source/portaudiocpp/System.cxx @ 4:e13257ea84a4
Add bzip2, zlib, liblo, portaudio sources
author | Chris Cannam |
---|---|
date | Wed, 20 Mar 2013 13:59:52 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
3:6c505a35919a | 4:e13257ea84a4 |
---|---|
1 #include "portaudiocpp/System.hxx" | |
2 | |
3 #include <cstddef> | |
4 #include <cassert> | |
5 | |
6 #include "portaudiocpp/HostApi.hxx" | |
7 #include "portaudiocpp/Device.hxx" | |
8 #include "portaudiocpp/Stream.hxx" | |
9 #include "portaudiocpp/Exception.hxx" | |
10 #include "portaudiocpp/SystemHostApiIterator.hxx" | |
11 #include "portaudiocpp/SystemDeviceIterator.hxx" | |
12 | |
13 namespace portaudio | |
14 { | |
15 // ----------------------------------------------------------------------------------- | |
16 | |
17 // Static members: | |
18 System *System::instance_ = NULL; | |
19 int System::initCount_ = 0; | |
20 HostApi **System::hostApis_ = NULL; | |
21 Device **System::devices_ = NULL; | |
22 Device *System::nullDevice_ = NULL; | |
23 | |
24 // ----------------------------------------------------------------------------------- | |
25 | |
26 int System::version() | |
27 { | |
28 return Pa_GetVersion(); | |
29 } | |
30 | |
31 const char *System::versionText() | |
32 { | |
33 return Pa_GetVersionText(); | |
34 } | |
35 | |
36 void System::initialize() | |
37 { | |
38 ++initCount_; | |
39 | |
40 if (initCount_ == 1) | |
41 { | |
42 // Create singleton: | |
43 assert(instance_ == NULL); | |
44 instance_ = new System(); | |
45 | |
46 // Initialize the PortAudio system: | |
47 { | |
48 PaError err = Pa_Initialize(); | |
49 | |
50 if (err != paNoError) | |
51 throw PaException(err); | |
52 } | |
53 | |
54 // Create and populate device array: | |
55 { | |
56 int numDevices = instance().deviceCount(); | |
57 | |
58 devices_ = new Device*[numDevices]; | |
59 | |
60 for (int i = 0; i < numDevices; ++i) | |
61 devices_[i] = new Device(i); | |
62 } | |
63 | |
64 // Create and populate host api array: | |
65 { | |
66 int numHostApis = instance().hostApiCount(); | |
67 | |
68 hostApis_ = new HostApi*[numHostApis]; | |
69 | |
70 for (int i = 0; i < numHostApis; ++i) | |
71 hostApis_[i] = new HostApi(i); | |
72 } | |
73 | |
74 // Create null device: | |
75 nullDevice_ = new Device(paNoDevice); | |
76 } | |
77 } | |
78 | |
79 void System::terminate() | |
80 { | |
81 PaError err = paNoError; | |
82 | |
83 if (initCount_ == 1) | |
84 { | |
85 // Destroy null device: | |
86 delete nullDevice_; | |
87 | |
88 // Destroy host api array: | |
89 { | |
90 if (hostApis_ != NULL) | |
91 { | |
92 int numHostApis = instance().hostApiCount(); | |
93 | |
94 for (int i = 0; i < numHostApis; ++i) | |
95 delete hostApis_[i]; | |
96 | |
97 delete[] hostApis_; | |
98 hostApis_ = NULL; | |
99 } | |
100 } | |
101 | |
102 // Destroy device array: | |
103 { | |
104 if (devices_ != NULL) | |
105 { | |
106 int numDevices = instance().deviceCount(); | |
107 | |
108 for (int i = 0; i < numDevices; ++i) | |
109 delete devices_[i]; | |
110 | |
111 delete[] devices_; | |
112 devices_ = NULL; | |
113 } | |
114 } | |
115 | |
116 // Terminate the PortAudio system: | |
117 assert(instance_ != NULL); | |
118 err = Pa_Terminate(); | |
119 | |
120 // Destroy singleton: | |
121 delete instance_; | |
122 instance_ = NULL; | |
123 } | |
124 | |
125 if (initCount_ > 0) | |
126 --initCount_; | |
127 | |
128 if (err != paNoError) | |
129 throw PaException(err); | |
130 } | |
131 | |
132 | |
133 System &System::instance() | |
134 { | |
135 assert(exists()); | |
136 | |
137 return *instance_; | |
138 } | |
139 | |
140 bool System::exists() | |
141 { | |
142 return (instance_ != NULL); | |
143 } | |
144 | |
145 // ----------------------------------------------------------------------------------- | |
146 | |
147 System::HostApiIterator System::hostApisBegin() | |
148 { | |
149 System::HostApiIterator tmp; | |
150 tmp.ptr_ = &hostApis_[0]; // begin (first element) | |
151 return tmp; | |
152 } | |
153 | |
154 System::HostApiIterator System::hostApisEnd() | |
155 { | |
156 int count = hostApiCount(); | |
157 | |
158 System::HostApiIterator tmp; | |
159 tmp.ptr_ = &hostApis_[count]; // end (one past last element) | |
160 return tmp; | |
161 } | |
162 | |
163 HostApi &System::defaultHostApi() | |
164 { | |
165 PaHostApiIndex defaultHostApi = Pa_GetDefaultHostApi(); | |
166 | |
167 if (defaultHostApi < 0) | |
168 throw PaException(defaultHostApi); | |
169 | |
170 return *hostApis_[defaultHostApi]; | |
171 } | |
172 | |
173 HostApi &System::hostApiByTypeId(PaHostApiTypeId type) | |
174 { | |
175 PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(type); | |
176 | |
177 if (index < 0) | |
178 throw PaException(index); | |
179 | |
180 return *hostApis_[index]; | |
181 } | |
182 | |
183 HostApi &System::hostApiByIndex(PaHostApiIndex index) | |
184 { | |
185 if (index < 0 || index >= hostApiCount()) | |
186 throw PaException(paInternalError); | |
187 | |
188 return *hostApis_[index]; | |
189 } | |
190 | |
191 int System::hostApiCount() | |
192 { | |
193 PaHostApiIndex count = Pa_GetHostApiCount(); | |
194 | |
195 if (count < 0) | |
196 throw PaException(count); | |
197 | |
198 return count; | |
199 } | |
200 | |
201 // ----------------------------------------------------------------------------------- | |
202 | |
203 System::DeviceIterator System::devicesBegin() | |
204 { | |
205 DeviceIterator tmp; | |
206 tmp.ptr_ = &devices_[0]; | |
207 | |
208 return tmp; | |
209 } | |
210 | |
211 System::DeviceIterator System::devicesEnd() | |
212 { | |
213 int count = deviceCount(); | |
214 | |
215 DeviceIterator tmp; | |
216 tmp.ptr_ = &devices_[count]; | |
217 | |
218 return tmp; | |
219 } | |
220 | |
221 ////// | |
222 /// Returns the System's default input Device, or the null Device if none | |
223 /// was available. | |
224 ////// | |
225 Device &System::defaultInputDevice() | |
226 { | |
227 PaDeviceIndex index = Pa_GetDefaultInputDevice(); | |
228 return deviceByIndex(index); | |
229 } | |
230 | |
231 ////// | |
232 /// Returns the System's default output Device, or the null Device if none | |
233 /// was available. | |
234 ////// | |
235 Device &System::defaultOutputDevice() | |
236 { | |
237 PaDeviceIndex index = Pa_GetDefaultOutputDevice(); | |
238 return deviceByIndex(index); | |
239 } | |
240 | |
241 ////// | |
242 /// Returns the Device for the given index. | |
243 /// Will throw a paInternalError equivalent PaException if the given index | |
244 /// is out of range. | |
245 ////// | |
246 Device &System::deviceByIndex(PaDeviceIndex index) | |
247 { | |
248 if (index < -1 || index >= deviceCount()) | |
249 { | |
250 throw PaException(paInternalError); | |
251 } | |
252 | |
253 if (index == -1) | |
254 return System::instance().nullDevice(); | |
255 | |
256 return *devices_[index]; | |
257 } | |
258 | |
259 int System::deviceCount() | |
260 { | |
261 PaDeviceIndex count = Pa_GetDeviceCount(); | |
262 | |
263 if (count < 0) | |
264 throw PaException(count); | |
265 | |
266 return count; | |
267 } | |
268 | |
269 Device &System::nullDevice() | |
270 { | |
271 return *nullDevice_; | |
272 } | |
273 | |
274 // ----------------------------------------------------------------------------------- | |
275 | |
276 void System::sleep(long msec) | |
277 { | |
278 Pa_Sleep(msec); | |
279 } | |
280 | |
281 int System::sizeOfSample(PaSampleFormat format) | |
282 { | |
283 PaError err = Pa_GetSampleSize(format); | |
284 if (err < 0) | |
285 { | |
286 throw PaException(err); | |
287 return 0; | |
288 } | |
289 | |
290 return err; | |
291 } | |
292 | |
293 // ----------------------------------------------------------------------------------- | |
294 | |
295 System::System() | |
296 { | |
297 // (left blank intentionally) | |
298 } | |
299 | |
300 System::~System() | |
301 { | |
302 // (left blank intentionally) | |
303 } | |
304 | |
305 // ----------------------------------------------------------------------------------- | |
306 | |
307 } // namespace portaudio | |
308 |