annotate src/portaudio_20140130/bindings/cpp/source/portaudiocpp/System.cxx @ 39:7ddb4fc30dac

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