annotate src/portaudio/bindings/cpp/source/portaudiocpp/System.cxx @ 107:71c914cf6201

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