summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArtem Dyomin <artem.dyomin@qt.io>2023-04-27 12:31:11 +0200
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2023-05-16 10:46:11 +0000
commit7e091c29d7c863306d3d49b7630437f52d6e934f (patch)
treeab273365e0239b42a1358b55c64decd1eebf5723
parentfaf93aa16e7223b604637a62eaf82dfe867a52ee (diff)
downloadqtmultimedia-7e091c29d7c863306d3d49b7630437f52d6e934f.tar.gz
Fix QAudioSink on Windows and make the auto tests pass
Windows tests became working, but on CI they are still not available since there're no audio devices on Win CI. - use QPointer for IO device (a corner case for close() in the destructor) - fix the method reset(), it should close the sink and change the state - There's a bunch of futher improvements to be done, namely, stop() should be improved for having more accurate behavior. Change-Id: I575a1d97d6d07564164c8b2de91166315d8f28d7 Reviewed-by: Lars Knoll <lars@knoll.priv.no> (cherry picked from commit 44067974d2ba15c323f8146d619f67390d3042b8) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/multimedia/windows/qwindowsaudiosink.cpp17
-rw-r--r--src/multimedia/windows/qwindowsaudiosink_p.h5
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;