BUGZ-858: Implement 'Reduce Other Volume While Pushing-to-Talk' option

This commit is contained in:
Zach Fox 2019-06-27 15:40:18 -07:00
parent 45ffa2bb1f
commit 8af469992e
7 changed files with 125 additions and 10 deletions

View file

@ -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);
}
}
}
}
}

View file

@ -171,6 +171,7 @@ Flickable {
ColumnLayout {
id: micControlsSwitchGroup
Layout.preferredWidth: parent.width
Layout.topMargin: simplifiedUI.margins.settings.settingsGroupTopMargin
SimplifiedControls.Switch {

View file

@ -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"

View file

@ -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
}

View file

@ -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

View file

@ -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; });
}

View file

@ -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 };