mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-07-22 22:54:09 +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 {
|
ColumnLayout {
|
||||||
id: micControlsSwitchGroup
|
id: micControlsSwitchGroup
|
||||||
|
Layout.preferredWidth: parent.width
|
||||||
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
|
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
|
||||||
|
|
||||||
SimplifiedControls.Switch {
|
SimplifiedControls.Switch {
|
||||||
|
@ -205,6 +206,49 @@ Flickable {
|
||||||
AudioScriptingInterface.pushToTalkDesktop = !AudioScriptingInterface.pushToTalkDesktop;
|
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 {
|
ColumnLayout {
|
||||||
id: micControlsSwitchGroup
|
id: micControlsSwitchGroup
|
||||||
|
Layout.preferredWidth: parent.width
|
||||||
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
|
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
|
||||||
|
|
||||||
SimplifiedControls.Switch {
|
SimplifiedControls.Switch {
|
||||||
|
|
|
@ -72,10 +72,14 @@ QtObject {
|
||||||
readonly property color border: "#00B4EF"
|
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 simplifiedSwitch: QtObject {
|
||||||
readonly property QtObject background: QtObject {
|
readonly property QtObject background: QtObject {
|
||||||
readonly property color disabled: "#616161"
|
readonly property color disabled: "#2B2B2B"
|
||||||
readonly property color off: "#616161"
|
readonly property color off: "#616161"
|
||||||
readonly property color hover: "#616161"
|
readonly property color hover: "#616161"
|
||||||
readonly property color pressed: "#616161"
|
readonly property color pressed: "#616161"
|
||||||
|
|
|
@ -44,7 +44,7 @@ Item {
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
horizontalAlignment: Text.AlignRight
|
horizontalAlignment: Text.AlignRight
|
||||||
visible: sliderText.text != ""
|
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
|
size: simplifiedUI.sizes.controls.slider.labelTextSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,7 @@ Item {
|
||||||
innerSwitchHandle.color = simplifiedUI.colors.controls.simplifiedSwitch.handle.disabled;
|
innerSwitchHandle.color = simplifiedUI.colors.controls.simplifiedSwitch.handle.disabled;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (originalSwitch.checked) {
|
if (originalSwitch.checked) {
|
||||||
if (originalSwitch.hovered) {
|
if (originalSwitch.hovered) {
|
||||||
innerSwitchHandle.color = simplifiedUI.colors.controls.simplifiedSwitch.handle.hover;
|
innerSwitchHandle.color = simplifiedUI.colors.controls.simplifiedSwitch.handle.hover;
|
||||||
|
@ -69,6 +70,10 @@ Item {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
onEnabledChanged: {
|
||||||
|
originalSwitch.changeColor();
|
||||||
|
}
|
||||||
|
|
||||||
onCheckedChanged: {
|
onCheckedChanged: {
|
||||||
originalSwitch.changeColor();
|
originalSwitch.changeColor();
|
||||||
}
|
}
|
||||||
|
@ -88,7 +93,8 @@ Item {
|
||||||
background: Rectangle {
|
background: Rectangle {
|
||||||
id: switchBackground
|
id: switchBackground
|
||||||
anchors.verticalCenter: parent.verticalCenter
|
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
|
width: originalSwitch.width
|
||||||
height: simplifiedUI.sizes.controls.simplifiedSwitch.switchBackgroundHeight
|
height: simplifiedUI.sizes.controls.simplifiedSwitch.switchBackgroundHeight
|
||||||
radius: height/2
|
radius: height/2
|
||||||
|
@ -113,7 +119,7 @@ Item {
|
||||||
height: width
|
height: width
|
||||||
radius: width/2
|
radius: width/2
|
||||||
color: "transparent"
|
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
|
border.color: simplifiedUI.colors.controls.simplifiedSwitch.handle.activeBorder
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,7 +130,7 @@ Item {
|
||||||
height: width
|
height: width
|
||||||
radius: width/2
|
radius: width/2
|
||||||
color: simplifiedUI.colors.controls.simplifiedSwitch.handle.off
|
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
|
border.color: originalSwitch.pressed ? simplifiedUI.colors.controls.simplifiedSwitch.handle.activeBorder : simplifiedUI.colors.controls.simplifiedSwitch.handle.checkedBorder
|
||||||
|
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
|
@ -145,7 +151,7 @@ Item {
|
||||||
id: labelOff
|
id: labelOff
|
||||||
text: ""
|
text: ""
|
||||||
size: simplifiedUI.sizes.controls.simplifiedSwitch.labelTextSize
|
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.top: parent.top
|
||||||
anchors.topMargin: -2 // Necessary for text alignment
|
anchors.topMargin: -2 // Necessary for text alignment
|
||||||
anchors.bottom: parent.bottom
|
anchors.bottom: parent.bottom
|
||||||
|
@ -193,7 +199,7 @@ Item {
|
||||||
id: labelOn
|
id: labelOn
|
||||||
text: ""
|
text: ""
|
||||||
size: simplifiedUI.sizes.controls.simplifiedSwitch.labelTextSize
|
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.top: parent.top
|
||||||
anchors.topMargin: -2 // Necessary for text alignment
|
anchors.topMargin: -2 // Necessary for text alignment
|
||||||
anchors.left: parent.left
|
anchors.left: parent.left
|
||||||
|
|
|
@ -366,7 +366,14 @@ void Audio::onContextChanged() {
|
||||||
void Audio::handlePushedToTalk(bool enabled) {
|
void Audio::handlePushedToTalk(bool enabled) {
|
||||||
if (getPTT()) {
|
if (getPTT()) {
|
||||||
if (enabled) {
|
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);
|
setMuted(false);
|
||||||
} else {
|
} else {
|
||||||
DependencyManager::get<AudioClient>()->setOutputGain(1.0f);
|
DependencyManager::get<AudioClient>()->setOutputGain(1.0f);
|
||||||
|
@ -499,3 +506,29 @@ float Audio::getSystemInjectorGain() {
|
||||||
return _systemInjectorGain;
|
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 pushToTalkDesktop READ getPTTDesktop WRITE setPTTDesktop NOTIFY pushToTalkDesktopChanged)
|
||||||
Q_PROPERTY(bool pushToTalkHMD READ getPTTHMD WRITE setPTTHMD NOTIFY pushToTalkHMDChanged)
|
Q_PROPERTY(bool pushToTalkHMD READ getPTTHMD WRITE setPTTHMD NOTIFY pushToTalkHMDChanged)
|
||||||
Q_PROPERTY(bool pushingToTalk READ getPushingToTalk WRITE setPushingToTalk NOTIFY pushingToTalkChanged)
|
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 avatarGain READ getAvatarGain WRITE setAvatarGain NOTIFY avatarGainChanged)
|
||||||
Q_PROPERTY(float localInjectorGain READ getLocalInjectorGain WRITE setLocalInjectorGain NOTIFY localInjectorGainChanged)
|
Q_PROPERTY(float localInjectorGain READ getLocalInjectorGain WRITE setLocalInjectorGain NOTIFY localInjectorGainChanged)
|
||||||
Q_PROPERTY(float serverInjectorGain READ getInjectorGain WRITE setInjectorGain NOTIFY serverInjectorGainChanged)
|
Q_PROPERTY(float serverInjectorGain READ getInjectorGain WRITE setInjectorGain NOTIFY serverInjectorGainChanged)
|
||||||
|
@ -290,6 +292,22 @@ public:
|
||||||
*/
|
*/
|
||||||
Q_INVOKABLE bool getRecording();
|
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:
|
signals:
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
|
@ -452,6 +470,14 @@ signals:
|
||||||
*/
|
*/
|
||||||
void systemInjectorGainChanged(float gain);
|
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:
|
public slots:
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
|
@ -480,6 +506,7 @@ private:
|
||||||
float _inputLevel { 0.0f };
|
float _inputLevel { 0.0f };
|
||||||
float _localInjectorGain { 0.0f }; // in dB
|
float _localInjectorGain { 0.0f }; // in dB
|
||||||
float _systemInjectorGain { 0.0f }; // in dB
|
float _systemInjectorGain { 0.0f }; // in dB
|
||||||
|
float _pttOutputGainDesktop { -20.0f }; // in dB
|
||||||
bool _isClipping { false };
|
bool _isClipping { false };
|
||||||
bool _enableNoiseReduction { true }; // Match default value of AudioClient::_isNoiseGateEnabled.
|
bool _enableNoiseReduction { true }; // Match default value of AudioClient::_isNoiseGateEnabled.
|
||||||
bool _enableWarnWhenMuted { true };
|
bool _enableWarnWhenMuted { true };
|
||||||
|
|
Loading…
Reference in a new issue