cannam@140: #include "portaudiocpp/System.hxx" cannam@140: cannam@140: #include cannam@140: #include cannam@140: cannam@140: #include "portaudiocpp/HostApi.hxx" cannam@140: #include "portaudiocpp/Device.hxx" cannam@140: #include "portaudiocpp/Stream.hxx" cannam@140: #include "portaudiocpp/Exception.hxx" cannam@140: #include "portaudiocpp/SystemHostApiIterator.hxx" cannam@140: #include "portaudiocpp/SystemDeviceIterator.hxx" cannam@140: cannam@140: namespace portaudio cannam@140: { cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: // Static members: cannam@140: System *System::instance_ = NULL; cannam@140: int System::initCount_ = 0; cannam@140: HostApi **System::hostApis_ = NULL; cannam@140: Device **System::devices_ = NULL; cannam@140: Device *System::nullDevice_ = NULL; cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: int System::version() cannam@140: { cannam@140: return Pa_GetVersion(); cannam@140: } cannam@140: cannam@140: const char *System::versionText() cannam@140: { cannam@140: return Pa_GetVersionText(); cannam@140: } cannam@140: cannam@140: void System::initialize() cannam@140: { cannam@140: ++initCount_; cannam@140: cannam@140: if (initCount_ == 1) cannam@140: { cannam@140: // Create singleton: cannam@140: assert(instance_ == NULL); cannam@140: instance_ = new System(); cannam@140: cannam@140: // Initialize the PortAudio system: cannam@140: { cannam@140: PaError err = Pa_Initialize(); cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: cannam@140: // Create and populate device array: cannam@140: { cannam@140: int numDevices = instance().deviceCount(); cannam@140: cannam@140: devices_ = new Device*[numDevices]; cannam@140: cannam@140: for (int i = 0; i < numDevices; ++i) cannam@140: devices_[i] = new Device(i); cannam@140: } cannam@140: cannam@140: // Create and populate host api array: cannam@140: { cannam@140: int numHostApis = instance().hostApiCount(); cannam@140: cannam@140: hostApis_ = new HostApi*[numHostApis]; cannam@140: cannam@140: for (int i = 0; i < numHostApis; ++i) cannam@140: hostApis_[i] = new HostApi(i); cannam@140: } cannam@140: cannam@140: // Create null device: cannam@140: nullDevice_ = new Device(paNoDevice); cannam@140: } cannam@140: } cannam@140: cannam@140: void System::terminate() cannam@140: { cannam@140: PaError err = paNoError; cannam@140: cannam@140: if (initCount_ == 1) cannam@140: { cannam@140: // Destroy null device: cannam@140: delete nullDevice_; cannam@140: cannam@140: // Destroy host api array: cannam@140: { cannam@140: if (hostApis_ != NULL) cannam@140: { cannam@140: int numHostApis = instance().hostApiCount(); cannam@140: cannam@140: for (int i = 0; i < numHostApis; ++i) cannam@140: delete hostApis_[i]; cannam@140: cannam@140: delete[] hostApis_; cannam@140: hostApis_ = NULL; cannam@140: } cannam@140: } cannam@140: cannam@140: // Destroy device array: cannam@140: { cannam@140: if (devices_ != NULL) cannam@140: { cannam@140: int numDevices = instance().deviceCount(); cannam@140: cannam@140: for (int i = 0; i < numDevices; ++i) cannam@140: delete devices_[i]; cannam@140: cannam@140: delete[] devices_; cannam@140: devices_ = NULL; cannam@140: } cannam@140: } cannam@140: cannam@140: // Terminate the PortAudio system: cannam@140: assert(instance_ != NULL); cannam@140: err = Pa_Terminate(); cannam@140: cannam@140: // Destroy singleton: cannam@140: delete instance_; cannam@140: instance_ = NULL; cannam@140: } cannam@140: cannam@140: if (initCount_ > 0) cannam@140: --initCount_; cannam@140: cannam@140: if (err != paNoError) cannam@140: throw PaException(err); cannam@140: } cannam@140: cannam@140: cannam@140: System &System::instance() cannam@140: { cannam@140: assert(exists()); cannam@140: cannam@140: return *instance_; cannam@140: } cannam@140: cannam@140: bool System::exists() cannam@140: { cannam@140: return (instance_ != NULL); cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: System::HostApiIterator System::hostApisBegin() cannam@140: { cannam@140: System::HostApiIterator tmp; cannam@140: tmp.ptr_ = &hostApis_[0]; // begin (first element) cannam@140: return tmp; cannam@140: } cannam@140: cannam@140: System::HostApiIterator System::hostApisEnd() cannam@140: { cannam@140: int count = hostApiCount(); cannam@140: cannam@140: System::HostApiIterator tmp; cannam@140: tmp.ptr_ = &hostApis_[count]; // end (one past last element) cannam@140: return tmp; cannam@140: } cannam@140: cannam@140: HostApi &System::defaultHostApi() cannam@140: { cannam@140: PaHostApiIndex defaultHostApi = Pa_GetDefaultHostApi(); cannam@140: cannam@140: if (defaultHostApi < 0) cannam@140: throw PaException(defaultHostApi); cannam@140: cannam@140: return *hostApis_[defaultHostApi]; cannam@140: } cannam@140: cannam@140: HostApi &System::hostApiByTypeId(PaHostApiTypeId type) cannam@140: { cannam@140: PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(type); cannam@140: cannam@140: if (index < 0) cannam@140: throw PaException(index); cannam@140: cannam@140: return *hostApis_[index]; cannam@140: } cannam@140: cannam@140: HostApi &System::hostApiByIndex(PaHostApiIndex index) cannam@140: { cannam@140: if (index < 0 || index >= hostApiCount()) cannam@140: throw PaException(paInternalError); cannam@140: cannam@140: return *hostApis_[index]; cannam@140: } cannam@140: cannam@140: int System::hostApiCount() cannam@140: { cannam@140: PaHostApiIndex count = Pa_GetHostApiCount(); cannam@140: cannam@140: if (count < 0) cannam@140: throw PaException(count); cannam@140: cannam@140: return count; cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: System::DeviceIterator System::devicesBegin() cannam@140: { cannam@140: DeviceIterator tmp; cannam@140: tmp.ptr_ = &devices_[0]; cannam@140: cannam@140: return tmp; cannam@140: } cannam@140: cannam@140: System::DeviceIterator System::devicesEnd() cannam@140: { cannam@140: int count = deviceCount(); cannam@140: cannam@140: DeviceIterator tmp; cannam@140: tmp.ptr_ = &devices_[count]; cannam@140: cannam@140: return tmp; cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Returns the System's default input Device, or the null Device if none cannam@140: /// was available. cannam@140: ////// cannam@140: Device &System::defaultInputDevice() cannam@140: { cannam@140: PaDeviceIndex index = Pa_GetDefaultInputDevice(); cannam@140: return deviceByIndex(index); cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Returns the System's default output Device, or the null Device if none cannam@140: /// was available. cannam@140: ////// cannam@140: Device &System::defaultOutputDevice() cannam@140: { cannam@140: PaDeviceIndex index = Pa_GetDefaultOutputDevice(); cannam@140: return deviceByIndex(index); cannam@140: } cannam@140: cannam@140: ////// cannam@140: /// Returns the Device for the given index. cannam@140: /// Will throw a paInternalError equivalent PaException if the given index cannam@140: /// is out of range. cannam@140: ////// cannam@140: Device &System::deviceByIndex(PaDeviceIndex index) cannam@140: { cannam@140: if (index < -1 || index >= deviceCount()) cannam@140: { cannam@140: throw PaException(paInternalError); cannam@140: } cannam@140: cannam@140: if (index == -1) cannam@140: return System::instance().nullDevice(); cannam@140: cannam@140: return *devices_[index]; cannam@140: } cannam@140: cannam@140: int System::deviceCount() cannam@140: { cannam@140: PaDeviceIndex count = Pa_GetDeviceCount(); cannam@140: cannam@140: if (count < 0) cannam@140: throw PaException(count); cannam@140: cannam@140: return count; cannam@140: } cannam@140: cannam@140: Device &System::nullDevice() cannam@140: { cannam@140: return *nullDevice_; cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: void System::sleep(long msec) cannam@140: { cannam@140: Pa_Sleep(msec); cannam@140: } cannam@140: cannam@140: int System::sizeOfSample(PaSampleFormat format) cannam@140: { cannam@140: PaError err = Pa_GetSampleSize(format); cannam@140: if (err < 0) cannam@140: { cannam@140: throw PaException(err); cannam@140: return 0; cannam@140: } cannam@140: cannam@140: return err; cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: System::System() cannam@140: { cannam@140: // (left blank intentionally) cannam@140: } cannam@140: cannam@140: System::~System() cannam@140: { cannam@140: // (left blank intentionally) cannam@140: } cannam@140: cannam@140: // ----------------------------------------------------------------------------------- cannam@140: cannam@140: } // namespace portaudio cannam@140: