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