mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-18 06:37:12 +02:00
BUGZ-858: Implement 'Reduce Other Volume While Pushing-to-Talk' option
This commit is contained in:
parent
45ffa2bb1f
commit
8af469992e
7 changed files with 125 additions and 10 deletions
|
@ -182,6 +182,7 @@ Flickable {
|
|||
|
||||
ColumnLayout {
|
||||
id: micControlsSwitchGroup
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
|
||||
|
||||
SimplifiedControls.Switch {
|
||||
|
@ -205,6 +206,49 @@ Flickable {
|
|||
AudioScriptingInterface.pushToTalkDesktop = !AudioScriptingInterface.pushToTalkDesktop;
|
||||
}
|
||||
}
|
||||
|
||||
SimplifiedControls.Switch {
|
||||
id: attenuateOutputSwitch
|
||||
enabled: AudioScriptingInterface.pushToTalkDesktop
|
||||
Layout.preferredHeight: 18
|
||||
Layout.preferredWidth: parent.width
|
||||
labelTextOn: "Reduce volume of other sounds while I'm pushing-to-talk"
|
||||
checked: AudioScriptingInterface.pushingToTalkOutputGainDesktop !== 0.0
|
||||
onClicked: {
|
||||
if (AudioScriptingInterface.pushingToTalkOutputGainDesktop === 0.0) {
|
||||
AudioScriptingInterface.pushingToTalkOutputGainDesktop = -20.0;
|
||||
} else {
|
||||
AudioScriptingInterface.pushingToTalkOutputGainDesktop = 0.0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SimplifiedControls.Slider {
|
||||
id: muteOutputSlider
|
||||
enabled: AudioScriptingInterface.pushToTalkDesktop && attenuateOutputSwitch.checked
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.preferredHeight: 18
|
||||
labelText: "Amount to reduce"
|
||||
from: 0.0
|
||||
to: 60.0
|
||||
defaultValue: 20.0
|
||||
stepSize: 5.0
|
||||
value: -1 * AudioScriptingInterface.pushingToTalkOutputGainDesktop
|
||||
live: true
|
||||
function updatePushingToTalkOutputGainDesktop(newValue) {
|
||||
if (AudioScriptingInterface.pushingToTalkOutputGainDesktop !== newValue) {
|
||||
AudioScriptingInterface.pushingToTalkOutputGainDesktop = newValue;
|
||||
}
|
||||
}
|
||||
onValueChanged: {
|
||||
updatePushingToTalkOutputGainDesktop(-1 * value);
|
||||
}
|
||||
onPressedChanged: {
|
||||
if (!pressed) {
|
||||
updatePushingToTalkOutputGainDesktop(-1 * value);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -171,6 +171,7 @@ Flickable {
|
|||
|
||||
ColumnLayout {
|
||||
id: micControlsSwitchGroup
|
||||
Layout.preferredWidth: parent.width
|
||||
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
|
||||
|
||||
SimplifiedControls.Switch {
|
||||
|
|
|
@ -72,10 +72,14 @@ QtObject {
|
|||
readonly property color border: "#00B4EF"
|
||||
}
|
||||
}
|
||||
readonly property QtObject text: QtObject {
|
||||
readonly property color enabled: "#FFFFFF"
|
||||
readonly property color disabled: "#8F8F8F"
|
||||
}
|
||||
}
|
||||
readonly property QtObject simplifiedSwitch: QtObject {
|
||||
readonly property QtObject background: QtObject {
|
||||
readonly property color disabled: "#616161"
|
||||
readonly property color disabled: "#2B2B2B"
|
||||
readonly property color off: "#616161"
|
||||
readonly property color hover: "#616161"
|
||||
readonly property color pressed: "#616161"
|
||||
|
|
|
@ -44,7 +44,7 @@ Item {
|
|||
anchors.bottom: parent.bottom
|
||||
horizontalAlignment: Text.AlignRight
|
||||
visible: sliderText.text != ""
|
||||
color: simplifiedUI.colors.text.white
|
||||
color: root.enabled ? simplifiedUI.colors.controls.slider.text.enabled : simplifiedUI.colors.controls.slider.text.disabled
|
||||
size: simplifiedUI.sizes.controls.slider.labelTextSize
|
||||
}
|
||||
|
||||
|
|
|
@ -54,6 +54,7 @@ Item {
|
|||
innerSwitchHandle.color = simplifiedUI.colors.controls.simplifiedSwitch.handle.disabled;
|
||||
return;
|
||||
}
|
||||
|
||||
if (originalSwitch.checked) {
|
||||
if (originalSwitch.hovered) {
|
||||
innerSwitchHandle.color = simplifiedUI.colors.controls.simplifiedSwitch.handle.hover;
|
||||
|
@ -69,6 +70,10 @@ Item {
|
|||
}
|
||||
}
|
||||
|
||||
onEnabledChanged: {
|
||||
originalSwitch.changeColor();
|
||||
}
|
||||
|
||||
onCheckedChanged: {
|
||||
originalSwitch.changeColor();
|
||||
}
|
||||
|
@ -88,7 +93,8 @@ Item {
|
|||
background: Rectangle {
|
||||
id: switchBackground
|
||||
anchors.verticalCenter: parent.verticalCenter
|
||||
color: originalSwitch.checked ? simplifiedUI.colors.controls.simplifiedSwitch.background.on : simplifiedUI.colors.controls.simplifiedSwitch.background.off
|
||||
color: originalSwitch.enabled ? (originalSwitch.checked ? simplifiedUI.colors.controls.simplifiedSwitch.background.on :
|
||||
simplifiedUI.colors.controls.simplifiedSwitch.background.off) : simplifiedUI.colors.controls.simplifiedSwitch.background.disabled
|
||||
width: originalSwitch.width
|
||||
height: simplifiedUI.sizes.controls.simplifiedSwitch.switchBackgroundHeight
|
||||
radius: height/2
|
||||
|
@ -113,7 +119,7 @@ Item {
|
|||
height: width
|
||||
radius: width/2
|
||||
color: "transparent"
|
||||
border.width: simplifiedUI.sizes.controls.simplifiedSwitch.switchHandleBorderSize
|
||||
border.width: originalSwitch.enabled ? simplifiedUI.sizes.controls.simplifiedSwitch.switchHandleBorderSize : 0
|
||||
border.color: simplifiedUI.colors.controls.simplifiedSwitch.handle.activeBorder
|
||||
}
|
||||
|
||||
|
@ -124,7 +130,7 @@ Item {
|
|||
height: width
|
||||
radius: width/2
|
||||
color: simplifiedUI.colors.controls.simplifiedSwitch.handle.off
|
||||
border.width: originalSwitch.pressed || originalSwitch.checked ? simplifiedUI.sizes.controls.simplifiedSwitch.switchHandleBorderSize : 0
|
||||
border.width: (originalSwitch.pressed || originalSwitch.checked) && originalSwitch.enabled ? simplifiedUI.sizes.controls.simplifiedSwitch.switchHandleBorderSize : 0
|
||||
border.color: originalSwitch.pressed ? simplifiedUI.colors.controls.simplifiedSwitch.handle.activeBorder : simplifiedUI.colors.controls.simplifiedSwitch.handle.checkedBorder
|
||||
|
||||
Component.onCompleted: {
|
||||
|
@ -145,7 +151,7 @@ Item {
|
|||
id: labelOff
|
||||
text: ""
|
||||
size: simplifiedUI.sizes.controls.simplifiedSwitch.labelTextSize
|
||||
color: originalSwitch.checked ? simplifiedUI.colors.controls.simplifiedSwitch.text.off : simplifiedUI.colors.controls.simplifiedSwitch.text.on
|
||||
color: originalSwitch.checked && !originalSwitch.enabled ? simplifiedUI.colors.controls.simplifiedSwitch.text.off : simplifiedUI.colors.controls.simplifiedSwitch.text.on
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: -2 // Necessary for text alignment
|
||||
anchors.bottom: parent.bottom
|
||||
|
@ -193,7 +199,7 @@ Item {
|
|||
id: labelOn
|
||||
text: ""
|
||||
size: simplifiedUI.sizes.controls.simplifiedSwitch.labelTextSize
|
||||
color: originalSwitch.checked ? simplifiedUI.colors.controls.simplifiedSwitch.text.on : simplifiedUI.colors.controls.simplifiedSwitch.text.off
|
||||
color: originalSwitch.checked && originalSwitch.enabled ? simplifiedUI.colors.controls.simplifiedSwitch.text.on : simplifiedUI.colors.controls.simplifiedSwitch.text.off
|
||||
anchors.top: parent.top
|
||||
anchors.topMargin: -2 // Necessary for text alignment
|
||||
anchors.left: parent.left
|
||||
|
|
|
@ -366,7 +366,14 @@ void Audio::onContextChanged() {
|
|||
void Audio::handlePushedToTalk(bool enabled) {
|
||||
if (getPTT()) {
|
||||
if (enabled) {
|
||||
DependencyManager::get<AudioClient>()->setOutputGain(0.1f); // duck the output by 20dB
|
||||
if (!qApp->isHMDMode()) {
|
||||
float gain = resultWithReadLock<float>([&] { return _pttOutputGainDesktop; });
|
||||
// convert dB to amplitude
|
||||
gain = fastExp2f(gain / 6.02059991f);
|
||||
// quantize and limit to match NodeList::setInjectorGain()
|
||||
gain = unpackFloatGainFromByte(packFloatGainToByte(gain));
|
||||
DependencyManager::get<AudioClient>()->setOutputGain(gain); // duck the output by N dB
|
||||
}
|
||||
setMuted(false);
|
||||
} else {
|
||||
DependencyManager::get<AudioClient>()->setOutputGain(1.0f);
|
||||
|
@ -499,3 +506,29 @@ float Audio::getSystemInjectorGain() {
|
|||
return _systemInjectorGain;
|
||||
});
|
||||
}
|
||||
|
||||
void Audio::setPushingToTalkOutputGainDesktop(float gain) {
|
||||
if (gain > 0.0f) {
|
||||
qDebug() << "Denying attempt to set Pushing to Talk Output Gain above 0dB. Attempted value:" << gain;
|
||||
return;
|
||||
}
|
||||
|
||||
bool changed = false;
|
||||
if (getPushingToTalkOutputGainDesktop() != gain) {
|
||||
changed = true;
|
||||
}
|
||||
|
||||
withWriteLock([&] {
|
||||
if (_pttOutputGainDesktop != gain) {
|
||||
_pttOutputGainDesktop = gain;
|
||||
}
|
||||
});
|
||||
|
||||
if (changed) {
|
||||
emit pushingToTalkOutputGainDesktopChanged(gain);
|
||||
}
|
||||
}
|
||||
|
||||
float Audio::getPushingToTalkOutputGainDesktop() {
|
||||
return resultWithReadLock<float>([&] { return _pttOutputGainDesktop; });
|
||||
}
|
||||
|
|
|
@ -94,6 +94,8 @@ class Audio : public AudioScriptingInterface, protected ReadWriteLockable {
|
|||
Q_PROPERTY(bool pushToTalkDesktop READ getPTTDesktop WRITE setPTTDesktop NOTIFY pushToTalkDesktopChanged)
|
||||
Q_PROPERTY(bool pushToTalkHMD READ getPTTHMD WRITE setPTTHMD NOTIFY pushToTalkHMDChanged)
|
||||
Q_PROPERTY(bool pushingToTalk READ getPushingToTalk WRITE setPushingToTalk NOTIFY pushingToTalkChanged)
|
||||
Q_PROPERTY(float pushingToTalkOutputGainDesktop READ getPushingToTalkOutputGainDesktop
|
||||
WRITE setPushingToTalkOutputGainDesktop NOTIFY pushingToTalkOutputGainDesktopChanged)
|
||||
Q_PROPERTY(float avatarGain READ getAvatarGain WRITE setAvatarGain NOTIFY avatarGainChanged)
|
||||
Q_PROPERTY(float localInjectorGain READ getLocalInjectorGain WRITE setLocalInjectorGain NOTIFY localInjectorGainChanged)
|
||||
Q_PROPERTY(float serverInjectorGain READ getInjectorGain WRITE setInjectorGain NOTIFY serverInjectorGainChanged)
|
||||
|
@ -290,6 +292,22 @@ public:
|
|||
*/
|
||||
Q_INVOKABLE bool getRecording();
|
||||
|
||||
/**jsdoc
|
||||
* Sets the output volume gain that will be used when the user is holding the Push to Talk key.
|
||||
* Should be negative.
|
||||
* @function Audio.setPushingToTalkOutputGainDesktop
|
||||
* @param {number} gain - Output volume gain (dB) while using PTT.
|
||||
*/
|
||||
Q_INVOKABLE void setPushingToTalkOutputGainDesktop(float gain);
|
||||
|
||||
/**jsdoc
|
||||
* Gets the output volume gain that is used when the user is holding the Push to Talk key.
|
||||
* Should be negative.
|
||||
* @function Audio.getPushingToTalkOutputGainDesktop
|
||||
* @returns {number} gain - Output volume gain (dB) while using PTT.
|
||||
*/
|
||||
Q_INVOKABLE float getPushingToTalkOutputGainDesktop();
|
||||
|
||||
signals:
|
||||
|
||||
/**jsdoc
|
||||
|
@ -452,6 +470,14 @@ signals:
|
|||
*/
|
||||
void systemInjectorGainChanged(float gain);
|
||||
|
||||
/**jsdoc
|
||||
* Triggered when the push to talk gain changes.
|
||||
* @function Audio.pushingToTalkOutputGainDesktopChanged
|
||||
* @param {float} gain - The new output gain value.
|
||||
* @returns {Signal}
|
||||
*/
|
||||
void pushingToTalkOutputGainDesktopChanged(float gain);
|
||||
|
||||
public slots:
|
||||
|
||||
/**jsdoc
|
||||
|
@ -478,8 +504,9 @@ private:
|
|||
bool _settingsLoaded { false };
|
||||
float _inputVolume { 1.0f };
|
||||
float _inputLevel { 0.0f };
|
||||
float _localInjectorGain { 0.0f }; // in dB
|
||||
float _systemInjectorGain { 0.0f }; // in dB
|
||||
float _localInjectorGain { 0.0f }; // in dB
|
||||
float _systemInjectorGain { 0.0f }; // in dB
|
||||
float _pttOutputGainDesktop { -20.0f }; // in dB
|
||||
bool _isClipping { false };
|
||||
bool _enableNoiseReduction { true }; // Match default value of AudioClient::_isNoiseGateEnabled.
|
||||
bool _enableWarnWhenMuted { true };
|
||||
|
|
Loading…
Reference in a new issue