9#include <QMediaDevices>
10#include <QStringBuilder>
15using namespace swift::config;
16using namespace swift::misc::audio;
20 QVector<float> convertBytesTo32BitFloatPCM(
const QByteArray &input)
22 int inputSamples = input.
size() / 2;
23 QVector<float> output;
24 output.
fill(0, inputSamples);
26 for (
int n = 0; n < inputSamples; n++)
28 output[n] = *
reinterpret_cast<const qint16 *
>(input.
data() + n * 2);
29 output[n] /= 32767.0f;
34 QVector<qint16> convertBytesTo16BitPCM(
const QByteArray &input)
36 const int inputSamples = input.
size() / 2;
37 QVector<qint16> output;
38 output.
fill(0, inputSamples);
39 for (
int n = 0; n < inputSamples; n++)
41 output[n] = *
reinterpret_cast<const qint16 *
>(input.
data() + n * 2);
46 QVector<float> convertFromMonoToStereo(
const QVector<float> &mono)
48 QVector<float> stereo;
50 for (
float sample : mono)
58 QVector<qint16> convertFromStereoToMono(
const QVector<qint16> &stereo)
62 for (
int i = 0; i < stereo.
size(); i = i + 2)
69 QVector<float> convertFromShortToFloat(
const QVector<qint16> &input)
71 QVector<float> output;
72 for (
auto sample : input)
79 QAudioDevice getLowestLatencyDevice(
const CAudioDeviceInfo &device, QAudioFormat &format)
81 Q_ASSERT_X(device.
getType() != CAudioDeviceInfo::Unknown, Q_FUNC_INFO,
"Device type must not be unknown");
84 const QAudioDevice defDevice =
85 device.
isInputDevice() ? QMediaDevices::defaultAudioInput() : QMediaDevices::defaultAudioOutput();
87 if (defDevice.isNull())
93 if (!defDevice.isFormatSupported(format))
102 CAudioDeviceInfoList::allQtOutputDevices();
105 QList<QAudioDevice> supportedDevices;
106 for (
const QAudioDevice &d : allQtDevices)
108 if (d.description() == device.
getName() && d.isFormatSupported(format))
114 if (supportedDevices.
isEmpty())
119 QAudioDevice deviceWithLowestLatency = supportedDevices.
at(0);
121 if (supportedDevices.
size() > 1)
123 int lowestBufferSize = std::numeric_limits<int>::max();
124 for (const QAudioDevice &d : supportedDevices)
126 if (!d.isFormatSupported(format)) continue;
128 if (device.getType() == CAudioDeviceInfo::InputDevice)
130 QAudioSource input(d, format);
133 bufferSize = input.bufferSize();
137 QAudioSink output(d, format);
140 bufferSize = output.bufferSize();
143 if (bufferSize < lowestBufferSize)
145 deviceWithLowestLatency = d;
146 lowestBufferSize = bufferSize;
150 return deviceWithLowestLatency;
153 QAudioDevice getHighestCompatibleOutputDevice(
const CAudioDeviceInfo &device, QAudioFormat &format)
162 for (
const QAudioDevice &d : allQtDevices)
164 if (d.description() == device.
getName())
167 if (d.isFormatSupported(format))
176 if (supportedDevices.
isEmpty())
178 format = QAudioFormat();
183 QAudioDevice usedDevice = supportedDevices.
front();
184 Q_ASSERT_X(usedDevice.isFormatSupported(format), Q_FUNC_INFO,
"Device does not support format");
188 QString toQString(
const QAudioFormat &format)
190 return QStringLiteral(
"Sample rate: %1 channels: %2 sample format: %3 bytes/frame: %4")
191 .
arg(format.sampleRate())
192 .
arg(format.channelCount())
193 .
arg(format.sampleFormat())
194 .
arg(format.bytesPerFrame());
199 static const QString l(
"little");
211 const QString &toQString(QAudioFormat::SampleFormat e)
213 static const QString s(
"signed int 16");
214 static const QString u(
"unsigned int 8");
215 static const QString f(
"float");
218 case QAudioFormat::Int16:
return s;
219 case QAudioFormat::UInt8:
return u;
220 case QAudioFormat::Float:
return f;
221 case QAudioFormat::Unknown:
224 static const QString unknown(
"unknown");
228 double normalize0to100(
double in)
234 return (in >= 1.0) ? 1.0 : in;
237 qreal normalize0to100qr(
double in) {
return static_cast<qreal
>(normalize0to100(in)); }
239 void occupyAudioInputDevice() {
static const QAudioInput input(QMediaDevices::defaultAudioInput()); }
Value object encapsulating information of a audio device.
bool isInputDevice() const
Input device.
bool isDefault() const
Is this a default device?
const QString & getName() const
Get the device name.
DeviceType getType() const
Type.
bool isValid() const
Valid audio device object?
static QList< QAudioDevice > allQtOutputDevices()
Lists of all available devices.
static QList< QAudioDevice > allQtInputDevices()
Lists of all available devices.
static QAudioDevice defaultQtOutputDevice()
Lists of all available devices.
qsizetype size() const const
void append(QList< T > &&value)
QList< T >::const_reference at(qsizetype i) const const
QList< T > & fill(QList< T >::parameter_type value, qsizetype size)
QList< T >::reference front()
bool isEmpty() const const
void push_back(QList< T >::parameter_type value)
void reserve(qsizetype size)
qsizetype size() const const
QString arg(Args &&... args) const const