Qt 6.x
The Qt SDK
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
6#include <qaudiodevice.h>
7#include <qaudioinput.h>
8
9#include <QtCore/qloggingcategory.h>
10#include <QtNetwork/qnetworkaccessmanager.h>
11#include <QtNetwork/qnetworkreply.h>
12
13#include <sys/types.h>
14#include <sys/stat.h>
15#include <fcntl.h>
16
17#include <utility>
18
19static Q_LOGGING_CATEGORY(qLcMediaAudioInput, "qt.multimedia.audioInput")
20
22
24{
25 QGstElement autoaudiosrc("autoaudiosrc", "autoaudiosrc");
26 if (!autoaudiosrc)
27 return errorMessageCannotFindElement("autoaudiosrc");
28
29 QGstElement volume("volume", "volume");
30 if (!volume)
31 return errorMessageCannotFindElement("volume");
32
33 return new QGstreamerAudioInput(autoaudiosrc, volume, parent);
34}
35
36QGstreamerAudioInput::QGstreamerAudioInput(QGstElement autoaudiosrc, QGstElement volume,
38 : QObject(parent),
40 gstAudioInput("audioInput"),
41 audioSrc(std::move(autoaudiosrc)),
42 audioVolume(std::move(volume))
43{
44 gstAudioInput.add(audioSrc, audioVolume);
45 audioSrc.link(audioVolume);
46
47 gstAudioInput.addGhostPad(audioVolume, "src");
48}
49
51{
52 gstAudioInput.setStateSync(GST_STATE_NULL);
53}
54
56{
57 return m_volume;
58}
59
61{
62 return m_muted;
63}
64
66{
67 if (vol == m_volume)
68 return;
69 m_volume = vol;
70 audioVolume.set("volume", vol);
71 emit volumeChanged(m_volume);
72}
73
75{
76 if (muted == m_muted)
77 return;
78 m_muted = muted;
79 audioVolume.set("mute", muted);
81}
82
84{
85 if (device == m_audioDevice)
86 return;
87 qCDebug(qLcMediaAudioInput) << "setAudioInput" << device.description() << device.isNull();
88 m_audioDevice = device;
89
90 QGstElement newSrc;
91#if QT_CONFIG(pulseaudio)
92 auto id = m_audioDevice.id();
93 newSrc = QGstElement("pulsesrc", "audiosrc");
94 if (!newSrc.isNull())
95 newSrc.set("device", id.constData());
96 else
97 qCWarning(qLcMediaAudioInput) << "Invalid audio device";
98#else
99 auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioDevice.handle());
100 if (deviceInfo && deviceInfo->gstDevice)
101 newSrc = gst_device_create_element(deviceInfo->gstDevice, "audiosrc");
102 else
103 qCWarning(qLcMediaAudioInput) << "Invalid audio device";
104#endif
105
106 if (newSrc.isNull()) {
107 qCWarning(qLcMediaAudioInput) << "Failed to create a gst element for the audio device, using a default audio source";
108 newSrc = QGstElement("autoaudiosrc", "audiosrc");
109 }
110
111 // FIXME: most probably source can be disconnected outside of idle probe
112 audioSrc.staticPad("src").doInIdleProbe([&](){
113 audioSrc.unlink(audioVolume);
114 });
115 audioSrc.setStateSync(GST_STATE_NULL);
116 gstAudioInput.remove(audioSrc);
117 audioSrc = newSrc;
118 gstAudioInput.add(audioSrc);
119 audioSrc.link(audioVolume);
120 audioSrc.syncStateWithParent();
121}
122
124{
125 return m_audioDevice;
126}
127
129
130#include "moc_qgstreameraudioinput_p.cpp"
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
void remove(const QGstElement &element)
Definition qgst_p.h:561
void add(const QGstElement &element)
Definition qgst_p.h:549
bool setStateSync(GstState state)
Definition qgst_p.h:463
bool syncStateWithParent()
Definition qgst_p.h:475
void unlink(const QGstElement &next)
Definition qgst_p.h:440
QGstPad staticPad(const char *name) const
Definition qgst_p.h:443
bool link(const QGstElement &next)
Definition qgst_p.h:429
bool isNull() const
Definition qgst_p.h:288
void set(const char *property, const char *str)
Definition qgst_p.h:290
void doInIdleProbe(std::function< void()> work)
Definition qgst_p.h:360
QAudioDevice audioInput() const
void setMuted(bool muted) override
void setAudioDevice(const QAudioDevice &) override
void setVolume(float volume) override
void mutedChanged(bool)
\inmodule QtCore
Definition qobject.h:90
Combined button and popup list for selecting options.
QString errorMessageCannotFindElement(std::string_view element)
Definition qgst_p.h:590
#define Q_LOGGING_CATEGORY(name,...)
#define qCWarning(category,...)
#define qCDebug(category,...)
#define emit
view create()
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent