summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVal Doroshchuk <valentyn.doroshchuk@qt.io>2017-10-10 13:24:27 +0200
committerVaL Doroshchuk <valentyn.doroshchuk@qt.io>2018-05-08 10:17:11 +0000
commita0049de16d9e2a92b8d31b1ee6943c994ffdf7d2 (patch)
tree6a52972230451f4f7d27cd73dcab42afae827216
parent0675d111de8bb1b96bfceeaa13448595b06b9e7c (diff)
downloadqtmultimedia-a0049de16d9e2a92b8d31b1ee6943c994ffdf7d2.tar.gz
Fix adjusting volume for default device
Using WAVE_MAPPER device id (which points to default device) is not possible to get and initialize a mixer object to set volume. Function mixerGetID() does not support WAVE_MAPPER as a device id yet. Since we do not know device number anymore needs to call waveInOpen() first and after that initialize mixer controls using hWaveIn handler. - Fixed default volume from 0.0f -> 1.0f. - Before QWindowsAudioInput::start() is called, use cached volume. - After QWindowsAudioInput::start(), mixer controls are initialized. - QWindowsAudioInput::stop() deinitializes mixer controls. Task-number: QTBUG-61920 Change-Id: I5a94dad282618fb4a2e0f75c34008ca002bd1aeb Reviewed-by: Maurice Kalinowski <maurice.kalinowski@qt.io>
-rw-r--r--src/plugins/windowsaudio/qwindowsaudioinput.cpp25
-rw-r--r--src/plugins/windowsaudio/qwindowsaudioinput.h1
-rw-r--r--tests/auto/integration/qaudioinput/tst_qaudioinput.cpp6
3 files changed, 17 insertions, 15 deletions
diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.cpp b/src/plugins/windowsaudio/qwindowsaudioinput.cpp
index 4771fe1cc..00b36cfe4 100644
--- a/src/plugins/windowsaudio/qwindowsaudioinput.cpp
+++ b/src/plugins/windowsaudio/qwindowsaudioinput.cpp
@@ -74,14 +74,13 @@ QWindowsAudioInput::QWindowsAudioInput(const QByteArray &device)
waveBlockOffset = 0;
mixerID = 0;
+ cachedVolume = 1.0f;
memset(&mixerLineControls, 0, sizeof(mixerLineControls));
- initMixer();
}
QWindowsAudioInput::~QWindowsAudioInput()
{
stop();
- closeMixer();
}
void QT_WIN_CALLBACK QWindowsAudioInput::waveInProc( HWAVEIN hWaveIn, UINT uMsg,
@@ -183,6 +182,7 @@ QAudio::State QWindowsAudioInput::state() const
void QWindowsAudioInput::setVolume(qreal volume)
{
+ cachedVolume = volume;
for (DWORD i = 0; i < mixerLineControls.cControls; i++) {
MIXERCONTROLDETAILS controlDetails;
@@ -204,7 +204,6 @@ void QWindowsAudioInput::setVolume(qreal volume)
qreal QWindowsAudioInput::volume() const
{
- DWORD volume = 0;
for (DWORD i = 0; i < mixerLineControls.cControls; i++) {
if ((mixerLineControls.pamxctrl[i].dwControlType != MIXERCONTROL_CONTROLTYPE_FADER) &&
(mixerLineControls.pamxctrl[i].dwControlType != MIXERCONTROL_CONTROLTYPE_VOLUME)) {
@@ -226,11 +225,10 @@ qreal QWindowsAudioInput::volume() const
continue;
if (controlDetails.cbDetails < sizeof(MIXERCONTROLDETAILS_UNSIGNED))
continue;
- volume = detailsUnsigned.dwValue;
- break;
+ return detailsUnsigned.dwValue / 65535.0;
}
- return volume / 65535.0;
+ return cachedVolume;
}
void QWindowsAudioInput::setFormat(const QAudioFormat& fmt)
@@ -378,6 +376,7 @@ bool QWindowsAudioInput::open()
elapsedTimeOffset = 0;
totalTimeValue = 0;
errorState = QAudio::NoError;
+ initMixer();
return true;
}
@@ -396,6 +395,7 @@ void QWindowsAudioInput::close()
mutex.unlock();
waveInClose(hWaveIn);
+ closeMixer();
int count = 0;
while(!finished && count < 500) {
@@ -406,17 +406,10 @@ void QWindowsAudioInput::close()
void QWindowsAudioInput::initMixer()
{
- QDataStream ds(&m_device, QIODevice::ReadOnly);
- quint32 inputDevice;
- ds >> inputDevice;
-
- if (int(inputDevice) < 0)
- return;
-
// Get the Mixer ID from the Sound Device ID
UINT mixerIntID = 0;
- if (mixerGetID(reinterpret_cast<HMIXEROBJ>(quintptr(inputDevice)),
- &mixerIntID, MIXER_OBJECTF_WAVEIN) != MMSYSERR_NOERROR)
+ if (mixerGetID(reinterpret_cast<HMIXEROBJ>(hWaveIn),
+ &mixerIntID, MIXER_OBJECTF_HWAVEIN) != MMSYSERR_NOERROR)
return;
mixerID = reinterpret_cast<HMIXEROBJ>(quintptr(mixerIntID));
@@ -436,6 +429,8 @@ void QWindowsAudioInput::initMixer()
mixerLineControls.pamxctrl = new MIXERCONTROL[mixerLineControls.cControls];
if (mixerGetLineControls(mixerID, &mixerLineControls, MIXER_GETLINECONTROLSF_ALL) != MMSYSERR_NOERROR)
closeMixer();
+ else
+ setVolume(cachedVolume);
}
}
diff --git a/src/plugins/windowsaudio/qwindowsaudioinput.h b/src/plugins/windowsaudio/qwindowsaudioinput.h
index e61a50a89..a0feae257 100644
--- a/src/plugins/windowsaudio/qwindowsaudioinput.h
+++ b/src/plugins/windowsaudio/qwindowsaudioinput.h
@@ -147,6 +147,7 @@ private:
void closeMixer();
HMIXEROBJ mixerID;
MIXERLINECONTROLS mixerLineControls;
+ qreal cachedVolume;
private slots:
void feedback();
diff --git a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp
index 14023f229..64e872f27 100644
--- a/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp
+++ b/tests/auto/integration/qaudioinput/tst_qaudioinput.cpp
@@ -887,6 +887,12 @@ void tst_QAudioInput::volume()
QTest::qWait(500);
QTRY_VERIFY(qRound(audioInput.volume()*10.0f) == 10);
+ audioInput.setVolume(half);
+ audioInput.start();
+ QTRY_VERIFY(qRound(audioInput.volume()*10.0f) == 5);
+ audioInput.setVolume(one);
+ QTRY_VERIFY(qRound(audioInput.volume()*10.0f) == 10);
+
audioInput.setVolume(volume);
}