Chris@4: #include "portaudiocpp/HostApi.hxx" Chris@4: Chris@4: #include "portaudiocpp/System.hxx" Chris@4: #include "portaudiocpp/Device.hxx" Chris@4: #include "portaudiocpp/SystemDeviceIterator.hxx" Chris@4: #include "portaudiocpp/Exception.hxx" Chris@4: Chris@4: namespace portaudio Chris@4: { Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: HostApi::HostApi(PaHostApiIndex index) : devices_(NULL) Chris@4: { Chris@4: try Chris@4: { Chris@4: info_ = Pa_GetHostApiInfo(index); Chris@4: Chris@4: // Create and populate devices array: Chris@4: int numDevices = deviceCount(); Chris@4: Chris@4: devices_ = new Device*[numDevices]; Chris@4: Chris@4: for (int i = 0; i < numDevices; ++i) Chris@4: { Chris@4: PaDeviceIndex deviceIndex = Pa_HostApiDeviceIndexToDeviceIndex(index, i); Chris@4: Chris@4: if (deviceIndex < 0) Chris@4: { Chris@4: throw PaException(deviceIndex); Chris@4: } Chris@4: Chris@4: devices_[i] = &System::instance().deviceByIndex(deviceIndex); Chris@4: } Chris@4: } Chris@4: catch (const std::exception &e) Chris@4: { Chris@4: // Delete any (partially) constructed objects (deconstructor isn't called): Chris@4: delete[] devices_; // devices_ is either NULL or valid Chris@4: Chris@4: // Re-throw exception: Chris@4: throw e; Chris@4: } Chris@4: } Chris@4: Chris@4: HostApi::~HostApi() Chris@4: { Chris@4: // Destroy devices array: Chris@4: delete[] devices_; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: PaHostApiTypeId HostApi::typeId() const Chris@4: { Chris@4: return info_->type; Chris@4: } Chris@4: Chris@4: PaHostApiIndex HostApi::index() const Chris@4: { Chris@4: PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(typeId()); Chris@4: Chris@4: if (index < 0) Chris@4: throw PaException(index); Chris@4: Chris@4: return index; Chris@4: } Chris@4: Chris@4: const char *HostApi::name() const Chris@4: { Chris@4: return info_->name; Chris@4: } Chris@4: Chris@4: int HostApi::deviceCount() const Chris@4: { Chris@4: return info_->deviceCount; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: HostApi::DeviceIterator HostApi::devicesBegin() Chris@4: { Chris@4: DeviceIterator tmp; Chris@4: tmp.ptr_ = &devices_[0]; // begin (first element) Chris@4: return tmp; Chris@4: } Chris@4: Chris@4: HostApi::DeviceIterator HostApi::devicesEnd() Chris@4: { Chris@4: DeviceIterator tmp; Chris@4: tmp.ptr_ = &devices_[deviceCount()]; // end (one past last element) Chris@4: return tmp; Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: Device &HostApi::defaultInputDevice() const Chris@4: { Chris@4: return System::instance().deviceByIndex(info_->defaultInputDevice); Chris@4: } Chris@4: Chris@4: Device &HostApi::defaultOutputDevice() const Chris@4: { Chris@4: return System::instance().deviceByIndex(info_->defaultOutputDevice); Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: bool HostApi::operator==(const HostApi &rhs) const Chris@4: { Chris@4: return (typeId() == rhs.typeId()); Chris@4: } Chris@4: Chris@4: bool HostApi::operator!=(const HostApi &rhs) const Chris@4: { Chris@4: return !(*this == rhs); Chris@4: } Chris@4: Chris@4: // ----------------------------------------------------------------------------------- Chris@4: Chris@4: } // namespace portaudio