annotate src/portaudio_20140130/bindings/cpp/source/portaudiocpp/System.cxx @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 7ddb4fc30dac
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