From 736b7f0d35d3dba2154dabd4f5d153e58a536c6c Mon Sep 17 00:00:00 2001 From: pkviet Date: Sat, 10 Nov 2018 00:29:28 +0100 Subject: [PATCH] UI: Fix display of mono source with surround output A mono input with surround output is upmixed by swresampler by routing it to FC (front center) by default which corresponds to third channel for 3.0, 4.0, 4.1, 5.0, 5.1, 7.1. (The other channels are muted.) But the volume meters are set to show the first channel for mono sources. Therefore although audio is processed, it would not show on the meter. This fixes this display issue. Closes obsproject/obs-studio#1540 --- UI/volume-control.cpp | 24 ++++++++++++++++-------- UI/volume-control.hpp | 1 + 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/UI/volume-control.cpp b/UI/volume-control.cpp index 80fbe1f6e..525802a19 100644 --- a/UI/volume-control.cpp +++ b/UI/volume-control.cpp @@ -528,6 +528,8 @@ VolumeMeter::VolumeMeter(QWidget *parent, obs_volmeter_t *obs_volmeter, peakHoldDuration = 20.0; // 20 seconds inputPeakHoldDuration = 1.0; // 1 second + channels = (int)audio_output_get_channels(obs_get_audio()); + handleChannelCofigurationChange(); updateTimerRef = updateTimer.toStrongRef(); if (!updateTimerRef) { @@ -1007,16 +1009,22 @@ void VolumeMeter::paintEvent(QPaintEvent *event) for (int channelNr = 0; channelNr < displayNrAudioChannels; channelNr++) { + + int channelNrFixed = (displayNrAudioChannels == 1 && + channels > 2) + ? 2 + : channelNr; + if (vertical) paintVMeter(painter, channelNr * 4, 8, 3, height - 10, - displayMagnitude[channelNr], - displayPeak[channelNr], - displayPeakHold[channelNr]); + displayMagnitude[channelNrFixed], + displayPeak[channelNrFixed], + displayPeakHold[channelNrFixed]); else paintHMeter(painter, 5, channelNr * 4, width - 5, 3, - displayMagnitude[channelNr], - displayPeak[channelNr], - displayPeakHold[channelNr]); + displayMagnitude[channelNrFixed], + displayPeak[channelNrFixed], + displayPeakHold[channelNrFixed]); if (idle) continue; @@ -1026,10 +1034,10 @@ void VolumeMeter::paintEvent(QPaintEvent *event) // having too much visual impact. if (vertical) paintInputMeter(painter, channelNr * 4, 3, 3, 3, - displayInputPeakHold[channelNr]); + displayInputPeakHold[channelNrFixed]); else paintInputMeter(painter, 0, channelNr * 4, 3, 3, - displayInputPeakHold[channelNr]); + displayInputPeakHold[channelNrFixed]); } lastRedrawTime = ts; diff --git a/UI/volume-control.hpp b/UI/volume-control.hpp index fde0d12f4..220cafcdf 100644 --- a/UI/volume-control.hpp +++ b/UI/volume-control.hpp @@ -144,6 +144,7 @@ private: qreal inputPeakHoldDuration; uint64_t lastRedrawTime = 0; + int channels = 0; bool clipping = false; bool vertical;