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