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