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