summaryrefslogtreecommitdiffstats
path: root/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp')
-rw-r--r--src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp39
1 files changed, 26 insertions, 13 deletions
diff --git a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
index 1bf4c2021..f793a4537 100644
--- a/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
+++ b/src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp
@@ -36,24 +36,29 @@ typedef enum {
} GstPlayFlags;
-
-QGstreamerAudioDecoder::QGstreamerAudioDecoder(QAudioDecoder *parent)
- : QPlatformAudioDecoder(parent),
- m_playbin(GST_PIPELINE_CAST(QGstElement("playbin", "playbin").element()))
+QMaybe<QPlatformAudioDecoder *> QGstreamerAudioDecoder::create(QAudioDecoder *parent)
{
- if (m_playbin.isNull()) {
- // ### set error
- return;
- }
+ QGstElement audioconvert("audioconvert", "audioconvert");
+ if (!audioconvert)
+ return errorMessageCannotFindElement("audioconvert");
+
+ QGstPipeline playbin = GST_PIPELINE_CAST(QGstElement("playbin", "playbin").element());
+ if (!playbin)
+ return errorMessageCannotFindElement("playbin");
+ return new QGstreamerAudioDecoder(playbin, audioconvert, parent);
+}
+
+QGstreamerAudioDecoder::QGstreamerAudioDecoder(QGstPipeline playbin, QGstElement audioconvert,
+ QAudioDecoder *parent)
+ : QPlatformAudioDecoder(parent), m_playbin(playbin), m_audioConvert(audioconvert)
+{
// Sort out messages
m_playbin.installMessageFilter(this);
// Set the rest of the pipeline up
setAudioFlags(true);
- m_audioConvert = QGstElement("audioconvert", "audioconvert");
-
m_outputBin = QGstBin("audio-output-bin");
m_outputBin.add(m_audioConvert);
@@ -61,7 +66,8 @@ QGstreamerAudioDecoder::QGstreamerAudioDecoder(QAudioDecoder *parent)
m_outputBin.addGhostPad(m_audioConvert, "sink");
g_object_set(m_playbin.object(), "audio-sink", m_outputBin.element(), NULL);
- g_signal_connect(m_playbin.object(), "deep-notify::source", (GCallback) &QGstreamerAudioDecoder::configureAppSrcElement, (gpointer)this);
+ g_signal_connect(m_playbin.object(), "deep-notify::source",
+ (GCallback)&QGstreamerAudioDecoder::configureAppSrcElement, (gpointer)this);
// Set volume to 100%
gdouble volume = 1.0;
@@ -285,8 +291,15 @@ void QGstreamerAudioDecoder::start()
return;
}
- if (!m_appSrc)
- m_appSrc = new QGstAppSrc(this);
+ if (!m_appSrc) {
+ auto maybeAppSrc = QGstAppSrc::create(this);
+ if (maybeAppSrc) {
+ m_appSrc = maybeAppSrc.value();
+ } else {
+ processInvalidMedia(QAudioDecoder::ResourceError, maybeAppSrc.error());
+ return;
+ }
+ }
m_playbin.set("uri", "appsrc://");
} else {