diff --git a/src/blackmisc/audio/audiodeviceinfo.cpp b/src/blackmisc/audio/audiodeviceinfo.cpp index a370b702c..184478b18 100644 --- a/src/blackmisc/audio/audiodeviceinfo.cpp +++ b/src/blackmisc/audio/audiodeviceinfo.cpp @@ -30,7 +30,7 @@ namespace BlackMisc { switch (m) { - case QAudio::AudioInput: return InputDevice; + case QAudio::AudioInput: return InputDevice; case QAudio::AudioOutput: return OutputDevice; default: break; } diff --git a/src/blackmisc/audio/audiodeviceinfo.h b/src/blackmisc/audio/audiodeviceinfo.h index be820dfb7..2e19abcf0 100644 --- a/src/blackmisc/audio/audiodeviceinfo.h +++ b/src/blackmisc/audio/audiodeviceinfo.h @@ -55,6 +55,12 @@ namespace BlackMisc //! Type DeviceType getType() const { return m_type; } + //! Input device + bool isInputDevice() const { return this->getType() == InputDevice; } + + //! Output device + bool isOutputDevice() const { return this->getType() == OutputDevice; } + //! Valid audio device object? bool isValid() const { return !m_deviceName.isEmpty(); } diff --git a/src/blackmisc/audio/audiodeviceinfolist.cpp b/src/blackmisc/audio/audiodeviceinfolist.cpp index 130a379ae..ce70faa05 100644 --- a/src/blackmisc/audio/audiodeviceinfolist.cpp +++ b/src/blackmisc/audio/audiodeviceinfolist.cpp @@ -59,6 +59,70 @@ namespace BlackMisc return defaultDevice; } + CAudioDeviceInfoList CAudioDeviceInfoList::findByHostName(const QString &hostName) const + { + if (hostName.isEmpty()) { return {}; } + + CAudioDeviceInfoList devices; + for (const CAudioDeviceInfo &d : *this) + { + if (stringCompare(hostName, d.getHostName(), Qt::CaseInsensitive)) + { + devices.push_back(d); + } + } + return devices; + } + + CAudioDeviceInfo CAudioDeviceInfoList::findRegisteredDevice(const CAudioDeviceInfo &device) const + { + CAudioDeviceInfoList devices = device.isInputDevice() ? this->getInputDevices() : this->getOutputDevices(); + if (devices.isEmpty()) { return {}; } + + devices = devices.findByHostName(device.getHostName()); + if (devices.isEmpty()) { return {}; } + + return devices.findByName(device.getName()); + } + + void CAudioDeviceInfoList::registerDevice(const CAudioDeviceInfo &device) + { + if (!device.isValid()) { return; } + if (this->isRegisteredDevice(device)) { return; } + this->push_back(device); + } + + void CAudioDeviceInfoList::registerDevices(const CAudioDeviceInfoList &devices) + { + for (const CAudioDeviceInfo &device : devices) + { + this->registerDevice(device); + } + } + + void CAudioDeviceInfoList::unRegisterDevice(const CAudioDeviceInfo &device) + { + if (!device.isValid()) { return; } + const CAudioDeviceInfo registeredDevice = this->findRegisteredDevice(device); + if (registeredDevice.isValid()) + { + this->remove(registeredDevice); + } + } + + void CAudioDeviceInfoList::unRegisterDevices(const CAudioDeviceInfoList &devices) + { + for (const CAudioDeviceInfo &device : devices) + { + this->unRegisterDevice(device); + } + } + + bool CAudioDeviceInfoList::isRegisteredDevice(const CAudioDeviceInfo &device) const + { + return this->findRegisteredDevice(device).isValid(); + } + int CAudioDeviceInfoList::count(CAudioDeviceInfo::DeviceType type) const { return static_cast(std::count_if(this->begin(), this->end(), [type](const CAudioDeviceInfo & device) diff --git a/src/blackmisc/audio/audiodeviceinfolist.h b/src/blackmisc/audio/audiodeviceinfolist.h index b55934f7d..cc940f6db 100644 --- a/src/blackmisc/audio/audiodeviceinfolist.h +++ b/src/blackmisc/audio/audiodeviceinfolist.h @@ -51,6 +51,27 @@ namespace BlackMisc //! Find by name CAudioDeviceInfo findByNameOrDefault(const QString &name, const CAudioDeviceInfo defaultDevice, bool strict = false) const; + //! Find by host name + CAudioDeviceInfoList findByHostName(const QString &hostName) const; + + //! Find registered device + CAudioDeviceInfo findRegisteredDevice(const CAudioDeviceInfo &device) const; + + //! Register device + void registerDevice(const CAudioDeviceInfo &device); + + //! Register devices + void registerDevices(const CAudioDeviceInfoList &devices); + + //! Un-register device + void unRegisterDevice(const CAudioDeviceInfo &device); + + //! Un-register devices + void unRegisterDevices(const CAudioDeviceInfoList &devices); + + //! Is that a registered device? + bool isRegisteredDevice(const CAudioDeviceInfo &device) const; + //! Count (as of type) int count(CAudioDeviceInfo::DeviceType type) const;