Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qgstreameraudioinput.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#include <QtMultimedia/qaudiodevice.h>
5#include <QtMultimedia/qaudioinput.h>
6
7#include <QtCore/qloggingcategory.h>
8
11
12#include <sys/types.h>
13#include <sys/stat.h>
14#include <fcntl.h>
15
16#include <utility>
17
18static Q_LOGGING_CATEGORY(qLcMediaAudioInput, "qt.multimedia.audioInput")
19
21
23{
24 QGstElement autoaudiosrc = QGstElement::createFromFactory("autoaudiosrc", "autoaudiosrc");
25 if (!autoaudiosrc)
26 return errorMessageCannotFindElement("autoaudiosrc");
27
28 QGstElement volume = QGstElement::createFromFactory("volume", "volume");
29 if (!volume)
30 return errorMessageCannotFindElement("volume");
31
32 return new QGstreamerAudioInput(autoaudiosrc, volume, parent);
33}
34
35QGstreamerAudioInput::QGstreamerAudioInput(QGstElement autoaudiosrc, QGstElement volume,
36 QAudioInput *parent)
37 : QObject(parent),
38 QPlatformAudioInput(parent),
39 gstAudioInput(QGstBin::create("audioInput")),
40 audioSrc(std::move(autoaudiosrc)),
41 audioVolume(std::move(volume))
42{
43 gstAudioInput.add(audioSrc, audioVolume);
44 qLinkGstElements(audioSrc, audioVolume);
45
46 gstAudioInput.addGhostPad(audioVolume, "src");
47}
48
49QGstElement QGstreamerAudioInput::createGstElement()
50{
51 const auto *customDeviceInfo =
52 dynamic_cast<const QGStreamerCustomAudioDeviceInfo *>(m_audioDevice.handle());
53
54 if (customDeviceInfo) {
55 qCDebug(qLcMediaAudioInput)
56 << "requesting custom audio src element: " << customDeviceInfo->id;
57
58 QGstElement element = QGstBin::createFromPipelineDescription(customDeviceInfo->id,
59 /*name=*/nullptr,
60 /*ghostUnlinkedPads=*/true);
61 if (element)
62 return element;
63
64 qCWarning(qLcMediaAudioInput)
65 << "Cannot create audio source element:" << customDeviceInfo->id;
66 }
67
68 const QByteArray &id = m_audioDevice.id();
69 if constexpr (QT_CONFIG(pulseaudio)) {
70 QGstElement newSrc = QGstElement::createFromFactory("pulsesrc", "audiosrc");
71 if (newSrc) {
72 newSrc.set("device", id.constData());
73 return newSrc;
74 } else {
75 qWarning() << "Cannot create pulsesrc";
76 }
77 } else if constexpr (QT_CONFIG(alsa)) {
78 QGstElement newSrc = QGstElement::createFromFactory("alsasrc", "audiosrc");
79 if (newSrc) {
80 newSrc.set("device", id.constData());
81 return newSrc;
82 } else {
83 qWarning() << "Cannot create alsasrc";
84 }
85 } else {
86 auto *deviceInfo = dynamic_cast<const QGStreamerAudioDeviceInfo *>(m_audioDevice.handle());
87 if (deviceInfo && deviceInfo->gstDevice) {
88 QGstElement element = QGstElement::createFromDevice(deviceInfo->gstDevice, "audiosrc");
89 if (element)
90 return element;
91 }
92 }
93 qCWarning(qLcMediaAudioInput) << "Invalid audio device";
94 qCWarning(qLcMediaAudioInput)
95 << "Failed to create a gst element for the audio device, using a default audio source";
96 return QGstElement::createFromFactory("autoaudiosrc", "audiosrc");
97}
98
100{
101 gstAudioInput.setStateSync(GST_STATE_NULL);
102}
103
105{
106 audioVolume.set("volume", volume);
107}
108
110{
111 audioVolume.set("mute", muted);
112}
113
115{
116 if (device == m_audioDevice)
117 return;
118 qCDebug(qLcMediaAudioInput) << "setAudioInput" << device.description() << device.isNull();
119 m_audioDevice = device;
120
121 QGstElement newSrc = createGstElement();
122
124 qUnlinkGstElements(audioSrc, audioVolume);
125 gstAudioInput.stopAndRemoveElements(audioSrc);
126 audioSrc = std::move(newSrc);
127 gstAudioInput.add(audioSrc);
128 qLinkGstElements(audioSrc, audioVolume);
129 audioSrc.syncStateWithParent();
130 });
131}
132
134{
135 return m_audioDevice;
136}
137
IOBluetoothDevice * device
The QAudioDevice class provides an information about audio devices and their functionality.
QString description
\qmlproperty string QtMultimedia::audioDevice::description
QByteArray id
\qmlproperty string QtMultimedia::audioDevice::id
const QAudioDevicePrivate * handle() const
bool isNull() const
Returns whether this QAudioDevice object holds a valid device definition.
\qmltype AudioInput \instantiates QAudioInput
Definition qaudioinput.h:19
\inmodule QtCore
Definition qbytearray.h:57
static QGstBin createFromPipelineDescription(const QByteArray &pipelineDescription, const char *name=nullptr, bool ghostUnlinkedPads=false)
Definition qgst.cpp:1073
static QGstElement createFromDevice(const QGstDeviceHandle &, const char *name=nullptr)
Definition qgst.cpp:866
bool setStateSync(GstState state, std::chrono::nanoseconds timeout=std::chrono::seconds(1))
Definition qgst.cpp:947
static QGstElement createFromFactory(const char *factory, const char *name=nullptr)
Definition qgst.cpp:835
QGstPipeline getPipeline() const
Definition qgst.cpp:1039
void set(const char *property, const char *str)
Definition qgst.cpp:538
void modifyPipelineWhileNotRunning(Functor &&fn)
QAudioDevice audioInput() const
void setMuted(bool) override
void setAudioDevice(const QAudioDevice &) override
void setVolume(float) override
\inmodule QtCore
Definition qobject.h:103
Combined button and popup list for selecting options.
std::enable_if_t<(std::is_base_of_v< QGstElement, Ts > &&...), void qLinkGstElements)(const Ts &...ts)
Definition qgst_p.h:643
QString errorMessageCannotFindElement(std::string_view element)
Definition qgst_p.h:804
#define qWarning
Definition qlogging.h:166
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
#define QT_CONFIG(feature)
view create()