diff options
author | Maurice Kalinowski <maurice.kalinowski@nokia.com> | 2012-06-19 12:32:32 +0200 |
---|---|---|
committer | Qt by Nokia <qt-info@nokia.com> | 2012-06-20 00:30:57 +0200 |
commit | 6d2883e7ed0a5f9ec09bca1468cce6f4f8c22aea (patch) | |
tree | d158ddf39632171ea4dd2b1133aeff5b7aeac887 /src | |
parent | 4bbbffeebc18ed5633729b44e9dda50b288e4024 (diff) |
fix volume handling on Windows
volume handling for QAudioOutput is broken currently as it fallbacks to
the default implementation.
Need to cache the volume, as hWaveOut is invalid while the output is not
in active state.
Task-number: QTBUG-25454
Change-Id: I2adb28a5e6719a5d3c360553abd70af46b646080
Reviewed-by: Michael Goddard <michael.goddard@nokia.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/multimedia/audio/qaudiooutput_win32_p.cpp | 22 | ||||
-rw-r--r-- | src/multimedia/audio/qaudiooutput_win32_p.h | 3 |
2 files changed, 25 insertions, 0 deletions
diff --git a/src/multimedia/audio/qaudiooutput_win32_p.cpp b/src/multimedia/audio/qaudiooutput_win32_p.cpp index 72e772482..7592643f4 100644 --- a/src/multimedia/audio/qaudiooutput_win32_p.cpp +++ b/src/multimedia/audio/qaudiooutput_win32_p.cpp @@ -117,6 +117,7 @@ QAudioOutputPrivate::QAudioOutputPrivate(const QByteArray &device) audioSource = 0; pullMode = true; finished = false; + volumeCache = (qreal)1.; } QAudioOutputPrivate::~QAudioOutputPrivate() @@ -380,6 +381,8 @@ bool QAudioOutputPrivate::open() timeStampOpened.restart(); elapsedTimeOffset = 0; + setVolume(volumeCache); + errorState = QAudio::NoError; if(pullMode) { deviceState = QAudio::ActiveState; @@ -667,6 +670,25 @@ QAudio::State QAudioOutputPrivate::state() const return deviceState; } +void QAudioOutputPrivate::setVolume(qreal v) +{ + const qreal normalizedVolume = qBound(qreal(0.0), v, qreal(1.0)); + if (deviceState != QAudio::ActiveState) { + volumeCache = normalizedVolume; + return; + } + const qint16 scaled = normalizedVolume * 0xFFFF; + DWORD vol = MAKELONG(scaled, scaled); + MMRESULT res = waveOutSetVolume(hWaveOut, vol); + if (res == MMSYSERR_NOERROR) + volumeCache = normalizedVolume; +} + +qreal QAudioOutputPrivate::volume() const +{ + return volumeCache; +} + void QAudioOutputPrivate::reset() { close(); diff --git a/src/multimedia/audio/qaudiooutput_win32_p.h b/src/multimedia/audio/qaudiooutput_win32_p.h index a5a4852de..064ca89c0 100644 --- a/src/multimedia/audio/qaudiooutput_win32_p.h +++ b/src/multimedia/audio/qaudiooutput_win32_p.h @@ -112,6 +112,8 @@ public: qint64 elapsedUSecs() const; QAudio::Error error() const; QAudio::State state() const; + void setVolume(qreal); + qreal volume() const; QIODevice* audioSource; QAudioFormat settings; @@ -134,6 +136,7 @@ private: qint64 totalTimeValue; bool pullMode; int intervalTime; + qreal volumeCache; static void QT_WIN_CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2 ); |