diff options
Diffstat (limited to 'src/plugins')
-rw-r--r-- | src/plugins/alsa/qalsaaudiooutput.cpp | 2 | ||||
-rw-r--r-- | src/plugins/common/evr/evrd3dpresentengine.h | 7 | ||||
-rw-r--r-- | src/plugins/coreaudio/coreaudiooutput.h | 1 | ||||
-rw-r--r-- | src/plugins/coreaudio/coreaudiooutput.mm | 5 | ||||
-rw-r--r-- | src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp | 8 | ||||
-rw-r--r-- | src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp | 19 | ||||
-rw-r--r-- | src/plugins/opensles/qopenslesaudiooutput.cpp | 2 | ||||
-rw-r--r-- | src/plugins/pulseaudio/qaudiooutput_pulse.cpp | 2 | ||||
-rw-r--r-- | src/plugins/windowsaudio/qwindowsaudioinput.cpp | 2 | ||||
-rw-r--r-- | src/plugins/windowsaudio/qwindowsaudiooutput.cpp | 4 | ||||
-rw-r--r-- | src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp | 8 | ||||
-rw-r--r-- | src/plugins/winrt/qwinrtmediaplayercontrol.cpp | 9 |
12 files changed, 46 insertions, 23 deletions
diff --git a/src/plugins/alsa/qalsaaudiooutput.cpp b/src/plugins/alsa/qalsaaudiooutput.cpp index ae4761e24..9fee690b5 100644 --- a/src/plugins/alsa/qalsaaudiooutput.cpp +++ b/src/plugins/alsa/qalsaaudiooutput.cpp @@ -657,7 +657,7 @@ void QAlsaAudioOutput::resume() } resuming = true; - deviceState = QAudio::ActiveState; + deviceState = pullMode ? QAudio::ActiveState : QAudio::IdleState; errorState = QAudio::NoError; timer->start(period_time/1000); diff --git a/src/plugins/common/evr/evrd3dpresentengine.h b/src/plugins/common/evr/evrd3dpresentengine.h index e05cf0d21..d181689ec 100644 --- a/src/plugins/common/evr/evrd3dpresentengine.h +++ b/src/plugins/common/evr/evrd3dpresentengine.h @@ -40,13 +40,14 @@ #ifndef EVRD3DPRESENTENGINE_H #define EVRD3DPRESENTENGINE_H -#include <EGL/egl.h> #include <QMutex> -#include <d3d9types.h> #include <QVideoSurfaceFormat> +#include <d3d9.h> + #if defined(QT_OPENGL_ES_2) || defined(QT_OPENGL_DYNAMIC) -#define MAYBE_ANGLE +# include <EGL/egl.h> +# define MAYBE_ANGLE #endif QT_BEGIN_NAMESPACE diff --git a/src/plugins/coreaudio/coreaudiooutput.h b/src/plugins/coreaudio/coreaudiooutput.h index 5db102ad2..9f62cd77d 100644 --- a/src/plugins/coreaudio/coreaudiooutput.h +++ b/src/plugins/coreaudio/coreaudiooutput.h @@ -193,6 +193,7 @@ private: QTimer *m_intervalTimer; CoreAudioDeviceInfo *m_audioDeviceInfo; qreal m_cachedVolume; + bool m_pullMode; QAudio::Error m_errorCode; QAudio::State m_stateCode; diff --git a/src/plugins/coreaudio/coreaudiooutput.mm b/src/plugins/coreaudio/coreaudiooutput.mm index 80e006433..dfac44c2d 100644 --- a/src/plugins/coreaudio/coreaudiooutput.mm +++ b/src/plugins/coreaudio/coreaudiooutput.mm @@ -228,6 +228,7 @@ CoreAudioOutput::CoreAudioOutput(const QByteArray &device) , m_startTime(0) , m_audioBuffer(0) , m_cachedVolume(1.0) + , m_pullMode(false) , m_errorCode(QAudio::NoError) , m_stateCode(QAudio::StoppedState) { @@ -277,6 +278,7 @@ void CoreAudioOutput::start(QIODevice *device) m_stateCode = QAudio::ActiveState; // Start + m_pullMode = true; m_errorCode = QAudio::NoError; m_totalFrames = 0; m_startTime = CoreAudioUtils::currentTime(); @@ -302,6 +304,7 @@ QIODevice *CoreAudioOutput::start() m_stateCode = QAudio::IdleState; // Start + m_pullMode = false; m_errorCode = QAudio::NoError; m_totalFrames = 0; m_startTime = CoreAudioUtils::currentTime(); @@ -353,7 +356,7 @@ void CoreAudioOutput::resume() if (m_stateCode == QAudio::SuspendedState) { audioThreadStart(); - m_stateCode = QAudio::ActiveState; + m_stateCode = m_pullMode ? QAudio::ActiveState : QAudio::IdleState; m_errorCode = QAudio::NoError; emit stateChanged(m_stateCode); } diff --git a/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp b/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp index 9784ac13a..5e00dab6f 100644 --- a/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp +++ b/src/plugins/gstreamer/audiodecoder/qgstreameraudiodecodersession.cpp @@ -148,9 +148,6 @@ void QGstreamerAudioDecoderSession::configureAppSrcElement(GObject* object, GObj if (!self->appsrc()) return; - if (self->appsrc()->isReady()) - return; - GstElement *appsrc; g_object_get(orig, "source", &appsrc, NULL); @@ -356,9 +353,8 @@ void QGstreamerAudioDecoderSession::start() return; } - if (m_appSrc) - m_appSrc->deleteLater(); - m_appSrc = new QGstAppSrc(this); + if (!m_appSrc) + m_appSrc = new QGstAppSrc(this); m_appSrc->setStream(mDevice); g_object_set(G_OBJECT(m_playbin), "uri", "appsrc://", NULL); diff --git a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp index c11de8d07..ed07e4054 100644 --- a/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp +++ b/src/plugins/gstreamer/mediaplayer/qgstreamerplayersession.cpp @@ -247,6 +247,10 @@ QGstreamerPlayerSession::QGstreamerPlayerSession(QObject *parent) g_signal_connect(G_OBJECT(m_playbin), "video-changed", G_CALLBACK(handleStreamsChange), this); g_signal_connect(G_OBJECT(m_playbin), "audio-changed", G_CALLBACK(handleStreamsChange), this); g_signal_connect(G_OBJECT(m_playbin), "text-changed", G_CALLBACK(handleStreamsChange), this); + +#if defined(HAVE_GST_APPSRC) + g_signal_connect(G_OBJECT(m_playbin), "deep-notify::source", G_CALLBACK(configureAppSrcElement), this); +#endif } } @@ -280,7 +284,7 @@ void QGstreamerPlayerSession::configureAppSrcElement(GObject* object, GObject *o Q_UNUSED(object); Q_UNUSED(pspec); - if (self->appsrc()->isReady()) + if (!self->appsrc()) return; GstElement *appsrc; @@ -304,16 +308,14 @@ void QGstreamerPlayerSession::loadFromStream(const QNetworkRequest &request, QIO m_lastPosition = 0; m_isPlaylist = false; - if (m_appSrc) - m_appSrc->deleteLater(); - m_appSrc = new QGstAppSrc(this); + if (!m_appSrc) + m_appSrc = new QGstAppSrc(this); m_appSrc->setStream(appSrcStream); if (m_playbin) { m_tags.clear(); emit tagsChanged(); - g_signal_connect(G_OBJECT(m_playbin), "deep-notify::source", (GCallback) &QGstreamerPlayerSession::configureAppSrcElement, (gpointer)this); g_object_set(G_OBJECT(m_playbin), "uri", "appsrc://", NULL); if (!m_streamTypes.isEmpty()) { @@ -336,6 +338,13 @@ void QGstreamerPlayerSession::loadFromUri(const QNetworkRequest &request) m_lastPosition = 0; m_isPlaylist = false; +#if defined(HAVE_GST_APPSRC) + if (m_appSrc) { + m_appSrc->deleteLater(); + m_appSrc = 0; + } +#endif + if (m_playbin) { m_tags.clear(); emit tagsChanged(); diff --git a/src/plugins/opensles/qopenslesaudiooutput.cpp b/src/plugins/opensles/qopenslesaudiooutput.cpp index 361ed6fc7..8bf0b5602 100644 --- a/src/plugins/opensles/qopenslesaudiooutput.cpp +++ b/src/plugins/opensles/qopenslesaudiooutput.cpp @@ -254,7 +254,7 @@ void QOpenSLESAudioOutput::resume() return; } - setState(QAudio::ActiveState); + setState(m_pullMode ? QAudio::ActiveState : QAudio::IdleState); setError(QAudio::NoError); } diff --git a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp index d0e8969ae..6cc9329dd 100644 --- a/src/plugins/pulseaudio/qaudiooutput_pulse.cpp +++ b/src/plugins/pulseaudio/qaudiooutput_pulse.cpp @@ -561,7 +561,7 @@ void QPulseAudioOutput::resume() m_tickTimer->start(m_periodTime); - setState(QAudio::ActiveState); + setState(m_pullMode ? QAudio::ActiveState : QAudio::IdleState); setError(QAudio::NoError); } } diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.cpp b/src/plugins/windowsaudio/qwindowsaudioinput.cpp index a447e6416..8d0fc8c24 100644 --- a/src/plugins/windowsaudio/qwindowsaudioinput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudioinput.cpp @@ -96,7 +96,7 @@ void QT_WIN_CALLBACK QWindowsAudioInput::waveInProc( HWAVEIN hWaveIn, UINT uMsg, if(!qAudio) return; - QMutexLocker(&qAudio->mutex); + QMutexLocker locker(&qAudio->mutex); switch(uMsg) { case WIM_OPEN: diff --git a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp index 7bbccccb3..c4bbbe85d 100644 --- a/src/plugins/windowsaudio/qwindowsaudiooutput.cpp +++ b/src/plugins/windowsaudio/qwindowsaudiooutput.cpp @@ -96,7 +96,7 @@ void CALLBACK QWindowsAudioOutput::waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, if(!qAudio) return; - QMutexLocker(&qAudio->mutex); + QMutexLocker locker(&qAudio->mutex); switch(uMsg) { case WOM_OPEN: @@ -440,7 +440,7 @@ qint64 QWindowsAudioOutput::write( const char *data, qint64 len ) void QWindowsAudioOutput::resume() { if(deviceState == QAudio::SuspendedState) { - deviceState = QAudio::ActiveState; + deviceState = pullMode ? QAudio::ActiveState : QAudio::IdleState; errorState = QAudio::NoError; waveOutRestart(hWaveOut); QTimer::singleShot(10, this, SLOT(feedback())); diff --git a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp index cf62843f7..7dd2e6557 100644 --- a/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp +++ b/src/plugins/winrt/qwinrtabstractvideorenderercontrol.cpp @@ -86,6 +86,14 @@ struct QWinRTVideoRendererControlGlobal hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, flags, featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, &device, &featureLevel, &context); +#ifdef _DEBUG + if (FAILED(hr)) { + qErrnoWarning(hr, "Failed to create D3D device with device debug flag"); + hr = D3D11CreateDevice(NULL, D3D_DRIVER_TYPE_HARDWARE, NULL, D3D11_CREATE_DEVICE_VIDEO_SUPPORT, + featureLevels, ARRAYSIZE(featureLevels), D3D11_SDK_VERSION, + &device, &featureLevel, &context); + } +#endif if (FAILED(hr)) qErrnoWarning(hr, "Failed to create D3D device"); diff --git a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp index 7bdb586c3..a07a6b622 100644 --- a/src/plugins/winrt/qwinrtmediaplayercontrol.cpp +++ b/src/plugins/winrt/qwinrtmediaplayercontrol.cpp @@ -388,8 +388,13 @@ public: HRESULT __stdcall SetCurrentPosition(QWORD position) { qint64 pos(position); - if (pos >= d->stream->size()) - return E_INVALIDARG; + if (pos >= d->stream->size()) { + // MSDN states we should return E_INVALIDARG, but that immediately + // stops playback and does not play remaining buffers in the queue. + // For some formats this can cause losing up to 5 seconds of the + // end of the stream. + return S_FALSE; + } const bool ok = d->stream->seek(pos); return ok ? S_OK : S_FALSE; |