annotate src/portaudio_20161030/bindings/cpp/source/portaudiocpp/System.cxx @ 169:223a55898ab9 tip default

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