annotate src/portaudio_20161030/bindings/cpp/source/portaudiocpp/System.cxx @ 55:284acf908dcd

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