diff options
Diffstat (limited to 'src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp')
-rw-r--r-- | src/plugins/multimedia/gstreamer/audio/qgstreameraudiodecoder.cpp | 39 |
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 { |