From 8815920e7f2351ddb989f2f6ee1616f418e638c0 Mon Sep 17 00:00:00 2001 From: Yoann Lopes Date: Tue, 7 Jun 2016 16:29:35 +0200 Subject: DirectShow: fix media player volume. The Qt volume was interpreted as a logarithmic factor but it should actually be linear. Change-Id: I0f3e742e934261742bd96f5e3ca3fb42f310864c Reviewed-by: Christian Stromme --- .../directshow/player/directshowplayercontrol.cpp | 29 ++++++++++------------ 1 file changed, 13 insertions(+), 16 deletions(-) (limited to 'src/plugins/directshow/player/directshowplayercontrol.cpp') diff --git a/src/plugins/directshow/player/directshowplayercontrol.cpp b/src/plugins/directshow/player/directshowplayercontrol.cpp index d4fd0c8be..fce488af2 100644 --- a/src/plugins/directshow/player/directshowplayercontrol.cpp +++ b/src/plugins/directshow/player/directshowplayercontrol.cpp @@ -45,21 +45,7 @@ #include #include - -static int volumeToDecibels(int volume) -{ - if (volume == 0) { - return -10000; - } else if (volume == 100) { - return 0; -#ifdef QT_USE_MATH_H_FLOATS - } else if (sizeof(qreal) == sizeof(float)) { - return qRound(::log10f(float(volume) / 100) * 5000); -#endif - } else { - return qRound(::log10(qreal(volume) / 100) * 5000); - } -} +#include DirectShowPlayerControl::DirectShowPlayerControl(DirectShowPlayerService *service, QObject *parent) : QMediaPlayerControl(parent) @@ -168,7 +154,18 @@ void DirectShowPlayerControl::setVolumeHelper(int volume) if (!m_audio) return; - m_audio->put_Volume(volumeToDecibels(volume)); + long adjustedVolume; + if (volume == 0) { + adjustedVolume = -10000; // -100 dB (lower limit for put_Volume()) + } else if (volume == 100) { + adjustedVolume = 0; + } else { + adjustedVolume = QAudio::convertVolume(volume / qreal(100), + QAudio::LinearVolumeScale, + QAudio::DecibelVolumeScale) * 100; + } + + m_audio->put_Volume(adjustedVolume); } int DirectShowPlayerControl::bufferStatus() const -- cgit v1.2.3