diff options
-rw-r--r-- | src/multimedia/windows/qwindowsaudiosink.cpp | 17 | ||||
-rw-r--r-- | src/multimedia/windows/qwindowsaudiosink_p.h | 5 |
2 files changed, 16 insertions, 6 deletions
diff --git a/src/multimedia/windows/qwindowsaudiosink.cpp b/src/multimedia/windows/qwindowsaudiosink.cpp index 30bf054f1..f585b83e2 100644 --- a/src/multimedia/windows/qwindowsaudiosink.cpp +++ b/src/multimedia/windows/qwindowsaudiosink.cpp @@ -203,6 +203,9 @@ QIODevice* QWindowsAudioSink::start() bool QWindowsAudioSink::open() { + if (m_audioClient) + return true; + HRESULT hr = m_device->Activate(__uuidof(IAudioClient), CLSCTX_INPROC_SERVER, nullptr, (void**)m_audioClient.address()); if (FAILED(hr)) { @@ -210,6 +213,8 @@ bool QWindowsAudioSink::open() return false; } + auto resetClient = qScopeGuard([this](){ m_audioClient.reset(); }); + WAVEFORMATEX *pwfx = nullptr; hr = m_audioClient->GetMixFormat(&pwfx); if (FAILED(hr)) { @@ -259,6 +264,8 @@ bool QWindowsAudioSink::open() return false; } + resetClient.dismiss(); + return true; } @@ -373,12 +380,14 @@ void QWindowsAudioSink::setVolume(qreal v) m_volume = qBound(qreal(0), v, qreal(1)); } +void QWindowsAudioSink::stop() { + // TODO: investigate and find a way to drain and stop instead of closing + close(); +} + void QWindowsAudioSink::reset() { - if (m_audioClient) { - m_audioClient->Stop(); - m_audioClient->Reset(); - } + close(); } QT_END_NAMESPACE diff --git a/src/multimedia/windows/qwindowsaudiosink_p.h b/src/multimedia/windows/qwindowsaudiosink_p.h index 95bc05e11..1178d8ad0 100644 --- a/src/multimedia/windows/qwindowsaudiosink_p.h +++ b/src/multimedia/windows/qwindowsaudiosink_p.h @@ -23,6 +23,7 @@ #include <QtCore/qdatetime.h> #include <QtCore/qmutex.h> #include <QtCore/qtimer.h> +#include <QtCore/qpointer.h> #include <QtMultimedia/qaudio.h> #include <QtMultimedia/qaudiodevice.h> @@ -48,7 +49,7 @@ public: QAudioFormat format() const override; QIODevice* start() override; void start(QIODevice* device) override; - void stop() override { close(); } + void stop() override; void reset() override; void suspend() override; void resume() override; @@ -83,7 +84,7 @@ private: qreal m_volume = 1.0; QTimer *m_timer = nullptr; QScopedPointer<QIODevice> m_pushSource; - QIODevice *m_pullSource = nullptr; + QPointer<QIODevice> m_pullSource; QComPtr<IMMDevice> m_device; QComPtr<IAudioClient> m_audioClient; QComPtr<IAudioRenderClient> m_renderClient; |