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