swift
audiodeviceinfolist.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2013 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <algorithm>
7 
8 #include <QMediaDevices>
9 #include <QString>
10 
11 #include "misc/stringutils.h"
12 
13 SWIFT_DEFINE_SEQUENCE_MIXINS(swift::misc::audio, CAudioDeviceInfo, CAudioDeviceInfoList)
14 
15 namespace swift::misc::audio
16 {
18 
20  {
21  return this->findBy(&CAudioDeviceInfo::getType, CAudioDeviceInfo::OutputDevice);
22  }
23 
25  {
26  return this->findBy(&CAudioDeviceInfo::getType, CAudioDeviceInfo::InputDevice);
27  }
28 
29  CAudioDeviceInfo CAudioDeviceInfoList::findByName(const QString &name, bool strict) const
30  {
31  return this->findByNameOrDefault(name, CAudioDeviceInfo(), strict);
32  }
33 
35  const CAudioDeviceInfo &defaultDevice, bool strict) const
36  {
37  if (name.isEmpty()) { return defaultDevice; }
38  for (const CAudioDeviceInfo &d : *this)
39  {
40  if (strict)
41  {
42  if (d.getName() == name) { return d; }
43  }
44  else
45  {
46  if (d.getName().startsWith(name, Qt::CaseInsensitive)) { return d; }
47  if (name.startsWith(d.getName(), Qt::CaseInsensitive)) { return d; }
48  }
49  }
50  return defaultDevice;
51  }
52 
54  {
55  if (hostName.isEmpty()) { return {}; }
56 
57  CAudioDeviceInfoList devices;
58  for (const CAudioDeviceInfo &d : *this)
59  {
60  if (stringCompare(hostName, d.getMachineName(), Qt::CaseInsensitive)) { devices.push_back(d); }
61  }
62  return devices;
63  }
64 
66  {
67  for (const CAudioDeviceInfo &d : *this)
68  {
69  if (device.matchesNameTypeMachineProcess(d)) { return d; }
70  }
71  return {};
72  }
73 
75  {
76  if (!device.isValid()) { return; }
77  if (this->isRegisteredDevice(device)) { return; }
78  this->push_back(device);
79  }
80 
82  {
83  for (const CAudioDeviceInfo &device : devices) { this->registerDevice(device); }
84  }
85 
87  {
88  if (!device.isValid()) { return; }
89  const CAudioDeviceInfo registeredDevice = this->findRegisteredDeviceOrDefault(device);
90  if (registeredDevice.isValid()) { this->remove(registeredDevice); }
91  }
92 
94  {
95  for (const CAudioDeviceInfo &device : devices) { this->unRegisterDevice(device); }
96  }
97 
99  {
100  this->removeIf(&CAudioDeviceInfo::getIdentifier, identifier);
101  }
102 
104  {
105  return this->findRegisteredDeviceOrDefault(device).isValid();
106  }
107 
109  {
110  return static_cast<int>(std::count_if(
111  this->begin(), this->end(), [type](const CAudioDeviceInfo &device) { return device.getType() == type; }));
112  }
113 
115  {
116  QStringList names;
117  for (const CAudioDeviceInfo &d : *this) { names << d.getName(); }
118  return names;
119  }
120 
122  {
123  if (compareDevices.size() != this->size()) { return false; }
124  for (const CAudioDeviceInfo &d : *this)
125  {
126  if (!compareDevices.findRegisteredDeviceOrDefault(d).isValid()) { return false; }
127  }
128  return true;
129  }
130 
132  {
133  CAudioDeviceInfoList devices;
134  for (const QAudioDevice &inputDevice : allQtInputDevices())
135  {
136  const CAudioDeviceInfo d(CAudioDeviceInfo::InputDevice, inputDevice.description());
137  if (!devices.contains(d)) { devices.push_back(d); }
138  }
139  return devices;
140  }
141 
143  {
144  CAudioDeviceInfoList devices;
145  for (const QAudioDevice &outputDevice : allQtOutputDevices())
146  {
147  const CAudioDeviceInfo d(CAudioDeviceInfo::OutputDevice, outputDevice.description());
148  if (!devices.contains(d)) { devices.push_back(d); }
149  }
150  return devices;
151  }
152 
154  {
157  return i;
158  }
159 
161  {
162  const QList<QAudioDevice> devices = QMediaDevices::audioInputs();
163  return devices;
164  }
165 
167  {
168  const QList<QAudioDevice> devices = QMediaDevices::audioOutputs();
169  return devices;
170  }
171 
172  QAudioDevice CAudioDeviceInfoList::defaultQtInputDevice() { return QMediaDevices::defaultAudioInput(); }
173 
174  QAudioDevice CAudioDeviceInfoList::defaultQtOutputDevice() { return QMediaDevices::defaultAudioOutput(); }
175 
177  {
178  return CAudioDeviceInfo(CAudioDeviceInfo::InputDevice, defaultQtInputDevice().description());
179  }
180 
182  {
183  return CAudioDeviceInfo(CAudioDeviceInfo::OutputDevice, defaultQtOutputDevice().description());
184  }
185 
186 } // namespace swift::misc::audio
Value object encapsulating information identifying a component of a modular distributed swift process...
Definition: identifier.h:29
bool contains(const T &object) const
Return true if there is an element equal to given object. Uses the most efficient implementation avai...
Definition: range.h:109
Generic sequential container with value semantics.
Definition: sequence.h:86
size_type size() const
Returns number of elements in the sequence.
Definition: sequence.h:273
iterator begin()
Returns iterator at the beginning of the sequence.
Definition: sequence.h:163
CSequence findBy(Predicate p) const
Return a copy containing only those elements for which a given predicate returns true.
Definition: sequence.h:398
int removeIf(Predicate p)
Remove elements for which a given predicate returns true.
Definition: sequence.h:446
void push_back(const T &value)
Appends an element at the end of the sequence.
Definition: sequence.h:305
int remove(const CAudioDeviceInfo &object)
Remove all elements equal to the given object, if it is contained.
Definition: sequence.h:435
iterator end()
Returns iterator one past the end of the sequence.
Definition: sequence.h:172
Value object encapsulating information of a audio device.
bool matchesNameTypeMachineProcess(const CAudioDeviceInfo &device) const
Matching name, type and machine and process.
const QString & getMachineName() const
Machine name.
const CIdentifier & getIdentifier() const
Identifier.
bool isValid() const
Valid audio device object?
const QString & getName() const
Get the device name.
Value object encapsulating a list of audio devices.
CAudioDeviceInfoList findByHostName(const QString &hostName) const
Find by host name.
static QList< QAudioDevice > allQtOutputDevices()
Lists of all available devices.
static QList< QAudioDevice > allQtInputDevices()
Lists of all available devices.
static CAudioDeviceInfoList allInputDevices()
Lists of all available devices.
CAudioDeviceInfoList getOutputDevices() const
Get output devices in that list.
QStringList getDeviceNames() const
All names.
void registerDevice(const CAudioDeviceInfo &device)
Register device.
CAudioDeviceInfo findByNameOrDefault(const QString &name, const CAudioDeviceInfo &defaultDevice, bool strict=false) const
Find by name.
static CAudioDeviceInfoList allOutputDevices()
Lists of all available devices.
void unRegisterDevice(const CAudioDeviceInfo &device)
Un-register device.
static CAudioDeviceInfoList allDevices()
Lists of all available devices.
CAudioDeviceInfoList()=default
Default constructor.
int count(CAudioDeviceInfo::DeviceType type) const
Count (as of type)
static CAudioDeviceInfo defaultOutputDevice()
Lists of all available devices.
static CAudioDeviceInfo defaultInputDevice()
Lists of all available devices.
CAudioDeviceInfoList getInputDevices() const
Get output devices in that list.
bool hasSameDevices(const CAudioDeviceInfoList &compareDevices) const
Has same devices.
static QAudioDevice defaultQtOutputDevice()
Lists of all available devices.
void unRegisterDevices(const CAudioDeviceInfoList &devices)
Un-register devices.
CAudioDeviceInfo findRegisteredDeviceOrDefault(const CAudioDeviceInfo &device) const
Find registered device.
bool isRegisteredDevice(const CAudioDeviceInfo &device) const
Is that a registered device?
static QAudioDevice defaultQtInputDevice()
Lists of all available devices.
CAudioDeviceInfo findByName(const QString &name, bool strict=false) const
Find by name.
void registerDevices(const CAudioDeviceInfoList &devices)
Register devices.
SWIFT_MISC_EXPORT bool stringCompare(const QString &c1, const QString &c2, Qt::CaseSensitivity cs)
String compare.
#define SWIFT_DEFINE_SEQUENCE_MIXINS(Namespace, T, List)
Explicit template definition of mixins for a CSequence subclass.
Definition: sequence.h:63