summaryrefslogtreecommitdiffstats
path: root/src/multimedia/audio
diff options
context:
space:
mode:
authorLars Knoll <lars.knoll@qt.io>2021-06-04 13:23:00 +0200
committerLars Knoll <lars.knoll@qt.io>2021-06-11 15:12:18 +0200
commit9fd208f11a218d8a8b07fc525258eea3b3596d62 (patch)
tree608971673414cd2ec937bf2cb16cebfeca3ec094 /src/multimedia/audio
parent16175403586bfd5928c46689c2d0b3fe28f8dbc2 (diff)
Add QAudioInput/Output
Add those classes representing physical inputs/outputs to be used together with QMediaPlayer and QMediaCaptureSession. Introduce corresponding backend classes so that the class can directly control what's happening on the backend side. Change-Id: I9b25b2fb30791ef1a38211796917eb63d840db08 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/multimedia/audio')
-rw-r--r--src/multimedia/audio/qaudioinput.cpp150
-rw-r--r--src/multimedia/audio/qaudioinput.h85
-rw-r--r--src/multimedia/audio/qaudiooutput.cpp152
-rw-r--r--src/multimedia/audio/qaudiooutput.h85
4 files changed, 472 insertions, 0 deletions
diff --git a/src/multimedia/audio/qaudioinput.cpp b/src/multimedia/audio/qaudioinput.cpp
new file mode 100644
index 000000000..c3e3c0bf2
--- /dev/null
+++ b/src/multimedia/audio/qaudioinput.cpp
@@ -0,0 +1,150 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qaudioinput.h>
+#include <qaudiodevice.h>
+#include <qmediadevices.h>
+#include <private/qplatformaudioinput_p.h>
+#include <private/qplatformmediaintegration_p.h>
+
+/*!
+ \class QAudioInput
+ \brief The QAudioOutput class represents an input channel for audio.
+ \inmodule QtMultimedia
+ \ingroup multimedia
+ \ingroup multimedia_audio
+
+ QAudioOutput represents an output channel that can be used together QMediaCaptureSession.
+ It allows selecting the physical input device to be used, muting the channel
+ or changing its volume.
+*/
+
+/*!
+ \property QAudioInput::volume
+ \brief the current volume.
+
+ The volume is scaled linearly, ranging from \c 0 (silence) to \c 1 (full volume).
+ Values outside this range will be clamped.
+
+ By default the volume is \c 1.
+
+ UI volume controls should usually be scaled nonlinearly. For example, using a logarithmic scale
+ will produce linear changes in perceived loudness, which is what a user would normally expect
+ from a volume control. See QAudio::convertVolume() for more details.
+*/
+
+/*!
+ \property QAudioInput::muted
+ \brief the muted state of the current media.
+
+ The value will be true if the input is muted; otherwise false.
+*/
+
+/*!
+ \property QAudioInput::device
+ \brief the audio device connected to this input.
+
+ The device property represents the audio device connected to this input. A default constructed
+ QAudioInput object will be connected to the systems default audio input at construction time.
+
+ This property can be used to select any other output device listed by QMediaDevices::audioInputs().
+*/
+
+QAudioInput::QAudioInput(QObject *parent)
+ : QAudioInput(QMediaDevices::defaultAudioInput(), parent)
+{}
+
+QAudioInput::QAudioInput(const QAudioDevice &device, QObject *parent)
+ : QObject(parent),
+ d(QPlatformMediaIntegration::instance()->createAudioInput(this))
+{
+ d->device = device;
+ if (d->device.mode() != QAudio::AudioInput)
+ d->device = QMediaDevices::defaultAudioInput();
+ d->setAudioDevice(d->device);
+}
+
+QAudioInput::~QAudioInput()
+{
+ delete d;
+}
+
+QAudioDevice QAudioInput::device() const
+{
+ return d->device;
+}
+
+void QAudioInput::setDevice(const QAudioDevice &device)
+{
+ if (device.mode() != QAudio::AudioInput)
+ return;
+ d->device = device;
+ d->setAudioDevice(device);
+ emit deviceChanged();
+}
+
+float QAudioInput::volume() const
+{
+ return d->volume;
+}
+
+void QAudioInput::setVolume(float volume)
+{
+ if (d->volume == volume)
+ return;
+ d->volume = volume;
+ d->setVolume(volume);
+ emit volumeChanged(volume);
+}
+
+bool QAudioInput::isMuted() const
+{
+ return d->muted;
+}
+
+void QAudioInput::setMuted(bool muted)
+{
+ if (d->muted == muted)
+ return;
+ d->muted = muted;
+ d->setMuted(muted);
+ emit mutedChanged(muted);
+}
+
+#include "moc_qaudioinput.cpp"
diff --git a/src/multimedia/audio/qaudioinput.h b/src/multimedia/audio/qaudioinput.h
new file mode 100644
index 000000000..bc0bf89ef
--- /dev/null
+++ b/src/multimedia/audio/qaudioinput.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAUDIOINPUTDEVICE_H
+#define QAUDIOINPUTDEVICE_H
+
+#include <QtCore/qobject.h>
+#include <QtMultimedia/qtmultimediaglobal.h>
+#include <QtMultimedia/qaudio.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAudioDevice;
+class QPlatformAudioInput;
+
+class Q_MULTIMEDIA_EXPORT QAudioInput : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QAudioDevice device READ device WRITE setDevice NOTIFY deviceChanged)
+ Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
+
+public:
+ explicit QAudioInput(QObject *parent = nullptr);
+ explicit QAudioInput(const QAudioDevice &deviceInfo, QObject *parent = nullptr);
+ ~QAudioInput();
+
+ QAudioDevice device() const;
+ float volume() const;
+ bool isMuted() const;
+
+public Q_SLOTS:
+ void setDevice(const QAudioDevice &device);
+ void setVolume(float volume);
+ void setMuted(bool muted);
+
+Q_SIGNALS:
+ void deviceChanged();
+ void volumeChanged(float volume);
+ void mutedChanged(bool muted);
+
+private:
+ Q_DISABLE_COPY(QAudioInput)
+ QPlatformAudioInput *d = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QAUDIOINPUTDEVICE_H
diff --git a/src/multimedia/audio/qaudiooutput.cpp b/src/multimedia/audio/qaudiooutput.cpp
new file mode 100644
index 000000000..31065aee6
--- /dev/null
+++ b/src/multimedia/audio/qaudiooutput.cpp
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <qaudiooutput.h>
+#include <qaudiodevice.h>
+#include <qmediadevices.h>
+#include <private/qplatformaudiooutput_p.h>
+#include <private/qplatformmediaintegration_p.h>
+
+/*!
+ \class QAudioOutput
+ \brief The QAudioOutput class represents an output channel for audio.
+ \inmodule QtMultimedia
+ \ingroup multimedia
+ \ingroup multimedia_audio
+
+ QAudioOutput represents an output channel that can be used together with QMediaPlayer or
+ QMediaCaptureSession. It allows selecting the physical output device to be used, muting the channel
+ or changing its volume.
+*/
+
+/*!
+ \property QAudioOutput::volume
+ \brief the current volume.
+
+ The volume is scaled linearly, ranging from \c 0 (silence) to \c 1 (full volume).
+ Values outside this range will be clamped.
+
+ By default the volume is \c 1.
+
+ UI volume controls should usually be scaled nonlinearly. For example, using a logarithmic scale
+ will produce linear changes in perceived loudness, which is what a user would normally expect
+ from a volume control. See QAudio::convertVolume() for more details.
+*/
+
+/*!
+ \property QAudioOutput::muted
+ \brief the muted state of the current media.
+
+ The value will be true if the output is muted; otherwise false.
+*/
+
+/*!
+ \property QAudioOutput::device
+ \brief the audio device connected to this output.
+
+ The device property represents the audio device connected to this output. A default constructed
+ QAudioOutput object will be connected to the systems default audio output at construction time.
+
+ This property can be used to select any other output device listed by QMediaDevices::audioOutputs().
+*/
+
+QAudioOutput::QAudioOutput(QObject *parent)
+ : QAudioOutput(QMediaDevices::defaultAudioOutput(), parent)
+{}
+
+QAudioOutput::QAudioOutput(const QAudioDevice &device, QObject *parent)
+ : QObject(parent),
+ d(QPlatformMediaIntegration::instance()->createAudioOutput(this))
+{
+ d->device = device;
+ if (d->device.mode() != QAudio::AudioOutput)
+ d->device = QMediaDevices::defaultAudioOutput();
+ d->setAudioDevice(d->device);
+}
+
+QAudioOutput::~QAudioOutput()
+{
+ delete d;
+}
+
+QAudioDevice QAudioOutput::device() const
+{
+ return d->device;
+}
+
+void QAudioOutput::setDevice(const QAudioDevice &device)
+{
+ if (device.mode() != QAudio::AudioOutput)
+ return;
+ if (d->device == device)
+ return;
+ d->device = device;
+ d->setAudioDevice(device);
+ emit deviceChanged();
+}
+
+float QAudioOutput::volume() const
+{
+ return d->volume;
+}
+
+void QAudioOutput::setVolume(float volume)
+{
+ if (d->volume == volume)
+ return;
+ d->volume = volume;
+ d->setVolume(volume);
+ emit volumeChanged(volume);
+}
+
+bool QAudioOutput::isMuted() const
+{
+ return d->muted;
+}
+
+void QAudioOutput::setMuted(bool muted)
+{
+ if (d->muted == muted)
+ return;
+ d->muted = muted;
+ d->setMuted(muted);
+ emit mutedChanged(muted);
+}
+
+#include "moc_qaudiooutput.cpp"
diff --git a/src/multimedia/audio/qaudiooutput.h b/src/multimedia/audio/qaudiooutput.h
new file mode 100644
index 000000000..9d76c9ca2
--- /dev/null
+++ b/src/multimedia/audio/qaudiooutput.h
@@ -0,0 +1,85 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU Lesser General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU Lesser
+** General Public License version 3 as published by the Free Software
+** Foundation and appearing in the file LICENSE.LGPL3 included in the
+** packaging of this file. Please review the following information to
+** ensure the GNU Lesser General Public License version 3 requirements
+** will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 2.0 or (at your option) the GNU General
+** Public license version 3 or any later version approved by the KDE Free
+** Qt Foundation. The licenses are as published by the Free Software
+** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-2.0.html and
+** https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QAUDIOOUTPUTDEVICE_H
+#define QAUDIOOUTPUTDEVICE_H
+
+#include <QtCore/qobject.h>
+#include <QtMultimedia/qtmultimediaglobal.h>
+#include <QtMultimedia/qaudio.h>
+
+QT_BEGIN_NAMESPACE
+
+class QAudioDevice;
+class QPlatformAudioOutput;
+
+class Q_MULTIMEDIA_EXPORT QAudioOutput : public QObject
+{
+ Q_OBJECT
+ Q_PROPERTY(QAudioDevice device READ device WRITE setDevice NOTIFY deviceChanged)
+ Q_PROPERTY(float volume READ volume WRITE setVolume NOTIFY volumeChanged)
+ Q_PROPERTY(bool muted READ isMuted WRITE setMuted NOTIFY mutedChanged)
+
+public:
+ explicit QAudioOutput(QObject *parent = nullptr);
+ explicit QAudioOutput(const QAudioDevice &device, QObject *parent = nullptr);
+ ~QAudioOutput();
+
+ QAudioDevice device() const;
+ float volume() const;
+ bool isMuted() const;
+
+public Q_SLOTS:
+ void setDevice(const QAudioDevice &device);
+ void setVolume(float volume);
+ void setMuted(bool muted);
+
+Q_SIGNALS:
+ void deviceChanged();
+ void volumeChanged(float volume);
+ void mutedChanged(bool muted);
+
+private:
+ Q_DISABLE_COPY(QAudioOutput)
+ QPlatformAudioOutput *d = nullptr;
+};
+
+QT_END_NAMESPACE
+
+#endif // QAUDIOOUTPUTDEVICE_H