Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qgstreameraudiooutput.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 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 <qaudiooutput.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(qLcMediaAudioOutput, "qt.multimedia.audiooutput")
20
22
24{
25 QGstElement audioconvert("audioconvert", "audioConvert");
26 if (!audioconvert)
27 return errorMessageCannotFindElement("audioconvert");
28
29 QGstElement audioresample("audioresample", "audioResample");
30 if (!audioresample)
31 return errorMessageCannotFindElement("audioresample");
32
33 QGstElement volume("volume", "volume");
34 if (!volume)
35 return errorMessageCannotFindElement("volume");
36
37 QGstElement autoaudiosink("autoaudiosink", "autoAudioSink");
38 if (!autoaudiosink)
39 return errorMessageCannotFindElement("autoaudiosink");
40
41 return new QGstreamerAudioOutput(audioconvert, audioresample, volume, autoaudiosink, parent);
42}
43
44QGstreamerAudioOutput::QGstreamerAudioOutput(QGstElement audioconvert, QGstElement audioresample,
45 QGstElement volume, QGstElement autoaudiosink,
47 : QObject(parent),
49 gstAudioOutput("audioOutput"),
50 audioConvert(std::move(audioconvert)),
51 audioResample(std::move(audioresample)),
52 audioVolume(std::move(volume)),
53 audioSink(std::move(autoaudiosink))
54{
55 audioQueue = QGstElement("queue", "audioQueue");
56 gstAudioOutput.add(audioQueue, audioConvert, audioResample, audioVolume, audioSink);
57 audioQueue.link(audioConvert, audioResample, audioVolume, audioSink);
58
59 gstAudioOutput.addGhostPad(audioQueue, "sink");
60}
61
63{
64 gstAudioOutput.setStateSync(GST_STATE_NULL);
65}
66
68{
69 audioVolume.set("volume", vol);
70}
71
73{
74 audioVolume.set("mute", muted);
75}
76
78{
79 gstPipeline = pipeline;
80}
81
83{
84 if (info == m_audioOutput)
85 return;
86 qCDebug(qLcMediaAudioOutput) << "setAudioOutput" << info.description() << info.isNull();
87 m_audioOutput = info;
88
89 QGstElement newSink;
90#if QT_CONFIG(pulseaudio)
91 auto id = m_audioOutput.id();
92 newSink = QGstElement("pulsesink", "audiosink");
93 if (!newSink.isNull())
94 newSink.set("device", id.constData());
95 else
96 qCWarning(qLcMediaAudioOutput) << "Invalid audio device";
97#else
98 auto *deviceInfo = static_cast<const QGStreamerAudioDeviceInfo *>(m_audioOutput.handle());
99 if (deviceInfo && deviceInfo->gstDevice)
100 newSink = gst_device_create_element(deviceInfo->gstDevice , "audiosink");
101 else
102 qCWarning(qLcMediaAudioOutput) << "Invalid audio device";
103#endif
104
105 if (newSink.isNull()) {
106 qCWarning(qLcMediaAudioOutput) << "Failed to create a gst element for the audio device, using a default audio sink";
107 newSink = QGstElement("autoaudiosink", "audiosink");
108 }
109
110 audioVolume.staticPad("src").doInIdleProbe([&](){
111 audioVolume.unlink(audioSink);
112 gstAudioOutput.remove(audioSink);
113 gstAudioOutput.add(newSink);
114 newSink.syncStateWithParent();
115 audioVolume.link(newSink);
116 });
117
118 audioSink.setStateSync(GST_STATE_NULL);
119 audioSink = newSink;
120}
121
123
124#include "moc_qgstreameraudiooutput_p.cpp"
The QAudioDevice class provides an information about audio devices and their functionality.
QByteArray id
\qmlproperty string QtMultimedia::audioDevice::id
const QAudioDevicePrivate * handle() const
\qmltype AudioOutput \instantiates QAudioOutput
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
void setPipeline(const QGstPipeline &pipeline)
void setAudioDevice(const QAudioDevice &) override
void setMuted(bool muted) override
void setVolume(float volume) override
\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,...)
QFileInfo info(fileName)
[8]
view create()
IUIAutomationTreeWalker __RPC__deref_out_opt IUIAutomationElement ** parent