diff --git a/bin/win64/res/qml/AudioPage.qml b/bin/win64/res/qml/AudioPage.qml index b12fccc..484e7ea 100644 --- a/bin/win64/res/qml/AudioPage.qml +++ b/bin/win64/res/qml/AudioPage.qml @@ -79,18 +79,18 @@ MyStackViewPage { } content: ColumnLayout { - spacing: 68 + spacing: 24 RowLayout { MyText { text: "Playback Device: " - Layout.preferredWidth: 210 + Layout.preferredWidth: 260 } MyComboBox { id: audioPlaybackNameCombo - Layout.maximumWidth: 900 - Layout.minimumWidth: 900 - Layout.preferredWidth: 900 + Layout.maximumWidth: 850 + Layout.minimumWidth: 850 + Layout.preferredWidth: 850 onCurrentIndexChanged: { if (componentCompleted) { AudioTabController.setPlaybackDeviceIndex(currentIndex) @@ -104,13 +104,13 @@ MyStackViewPage { RowLayout { MyText { text: "Mirror Device: " - Layout.preferredWidth: 210 + Layout.preferredWidth: 260 } MyComboBox { id: audioMirrorNameCombo - Layout.maximumWidth: 900 - Layout.minimumWidth: 900 - Layout.preferredWidth: 900 + Layout.maximumWidth: 850 + Layout.minimumWidth: 850 + Layout.preferredWidth: 850 onCurrentIndexChanged: { if (componentCompleted) { AudioTabController.setMirrorDeviceIndex(currentIndex - 1) @@ -120,8 +120,8 @@ MyStackViewPage { } RowLayout { MyText { - text: "Volume:" - Layout.preferredWidth: 120 + text: "Mirror Volume:" + Layout.preferredWidth: 260 } MyPushButton2 { @@ -187,13 +187,13 @@ MyStackViewPage { RowLayout { MyText { text: "Microphone: " - Layout.preferredWidth: 210 + Layout.preferredWidth: 260 } MyComboBox { id: audioMicNameCombo - Layout.maximumWidth: 900 - Layout.minimumWidth: 900 - Layout.preferredWidth: 900 + Layout.maximumWidth: 850 + Layout.minimumWidth: 850 + Layout.preferredWidth: 850 onCurrentIndexChanged: { if (componentCompleted) { AudioTabController.setMicDeviceIndex(currentIndex) @@ -203,8 +203,8 @@ MyStackViewPage { } RowLayout { MyText { - text: "Volume:" - Layout.preferredWidth: 120 + text: "Microphone Volume:" + Layout.preferredWidth: 260 } MyPushButton2 { @@ -263,6 +263,14 @@ MyStackViewPage { } } } + MyToggleButton { + id: audioMuteProximitySensorToggle + Layout.preferredWidth: 600 + text: "Proximity Sensor Mutes/Unmutes Microphone" + onClicked: { + AudioTabController.setMicProximitySensorCanMute(checked, false) + } + } RowLayout { MyToggleButton { id: audioPttEnabledToggle @@ -413,13 +421,16 @@ MyStackViewPage { audioMicVolumeSlider.enabled = false audioMicVolumePlusButton.enabled = false audioMicMuteToggle.enabled = false + audioMuteProximitySensorToggle.enabled = false } else { audioMicVolumeMinusButton.enabled = true audioMicVolumeSlider.enabled = true audioMicVolumePlusButton.enabled = true audioMicMuteToggle.enabled = true + audioMuteProximitySensorToggle.enabled = true audioMicVolumeSlider.value = AudioTabController.micVolume audioMicMuteToggle.checked = AudioTabController.micMuted + audioMuteProximitySensorToggle.checked = AudioTabController.micProximitySensorCanMute audioMicNameCombo.currentIndex = AudioTabController.micDeviceIndex } reloadPttProfiles() @@ -477,6 +488,9 @@ MyStackViewPage { onMicMutedChanged: { audioMicMuteToggle.checked = AudioTabController.micMuted } + onMicProximitySensorCanMuteChanged: { + audioMuteProximitySensorToggle.checked = AudioTabController.micProximitySensorCanMute + } onPttEnabledChanged: { audioPttEnabledToggle.checked = AudioTabController.pttEnabled } diff --git a/src/tabcontrollers/AudioTabController.cpp b/src/tabcontrollers/AudioTabController.cpp index 18c8c93..f63bfce 100644 --- a/src/tabcontrollers/AudioTabController.cpp +++ b/src/tabcontrollers/AudioTabController.cpp @@ -30,6 +30,7 @@ namespace advsettings { m_micMuted = audioManager->getMicMuted(); reloadPttProfiles(); reloadPttConfig(); + reloadAudioSettings(); eventLoopTick(); } @@ -59,6 +60,22 @@ namespace advsettings { } } + void AudioTabController::reloadAudioSettings() { + std::lock_guard lock(eventLoopMutex); + auto settings = OverlayController::appSettings(); + settings->beginGroup(getSettingsName()); + setMicProximitySensorCanMute(settings->value("micProximitySensorCanMute", false).toBool(), false); + settings->endGroup(); + } + + void AudioTabController::saveAudioSettings() { + auto settings = OverlayController::appSettings(); + settings->beginGroup(getSettingsName()); + settings->setValue("micProximitySensorCanMute", micProximitySensorCanMute()); + settings->endGroup(); + settings->sync(); + } + float AudioTabController::mirrorVolume() const { return m_mirrorVolume; @@ -79,11 +96,33 @@ namespace advsettings { return m_micMuted; } + bool AudioTabController::micProximitySensorCanMute() const { + return m_micProximitySensorCanMute; + } + void AudioTabController::eventLoopTick() { if (!eventLoopMutex.try_lock()) { return; } if (settingsUpdateCounter >= 50) { + if (m_micProximitySensorCanMute) { + vr::VRControllerState_t controllerState; + if (vr::VRSystem()->GetControllerState(vr::k_unTrackedDeviceIndex_Hmd, &controllerState, sizeof(vr::VRControllerState_t))) { + if ((controllerState.ulButtonPressed & vr::ButtonMaskFromId(vr::k_EButton_ProximitySensor)) == 0) { + if (!m_micMuted) { + setMicMuted(true); + } + } else { + if (m_micMuted) { + setMicMuted(false); + } + } + } else { + if (!parent->isDashboardVisible()) { + LOG(ERROR) << "Could not read proximity sensor!"; + } + } + } vr::EVRSettingsError vrSettingsError; char mirrorDeviceId[1024]; vr::VRSettings()->GetString(vr::k_pch_audio_Section, vr::k_pch_audio_OnPlaybackMirrorDevice_String, mirrorDeviceId, 1024, &vrSettingsError); @@ -183,6 +222,17 @@ namespace advsettings { } } + void AudioTabController::setMicProximitySensorCanMute(bool value, bool notify) { + std::lock_guard lock(eventLoopMutex); + if (value != m_micProximitySensorCanMute) { + m_micProximitySensorCanMute = value; + saveAudioSettings(); + if (notify) { + emit micProximitySensorCanMuteChanged(value); + } + } + } + void AudioTabController::onNewRecordingDevice() { findMicDeviceIndex(audioManager->getMicDevId()); } diff --git a/src/tabcontrollers/AudioTabController.h b/src/tabcontrollers/AudioTabController.h index 73d26b8..5280991 100644 --- a/src/tabcontrollers/AudioTabController.h +++ b/src/tabcontrollers/AudioTabController.h @@ -26,6 +26,7 @@ namespace advsettings { //Q_PROPERTY(QString micDevName READ micDevName NOTIFY micDevNameChanged) Q_PROPERTY(float micVolume READ micVolume WRITE setMicVolume NOTIFY micVolumeChanged) Q_PROPERTY(bool micMuted READ micMuted WRITE setMicMuted NOTIFY micMutedChanged) + Q_PROPERTY(bool micProximitySensorCanMute READ micProximitySensorCanMute WRITE setMicProximitySensorCanMute NOTIFY micProximitySensorCanMuteChanged) private: OverlayController* parent; @@ -42,6 +43,7 @@ namespace advsettings { int m_recordingDeviceIndex = -1; float m_micVolume = 1.0; bool m_micMuted = false; + bool m_micProximitySensorCanMute = false; unsigned settingsUpdateCounter = 0; @@ -66,6 +68,9 @@ namespace advsettings { void initStage1(); void initStage2(OverlayController* parent, QQuickWindow* widget); + void reloadAudioSettings(); + void saveAudioSettings(); + void eventLoopTick(); int playbackDeviceIndex() const; @@ -77,6 +82,7 @@ namespace advsettings { int micDeviceIndex() const; float micVolume() const; bool micMuted() const; + bool micProximitySensorCanMute() const; Q_INVOKABLE int getPlaybackDeviceCount(); Q_INVOKABLE QString getPlaybackDeviceName(int index); @@ -95,6 +101,7 @@ namespace advsettings { void setMicVolume(float value, bool notify = true); void setMicMuted(bool value, bool notify = true); + void setMicProximitySensorCanMute(bool value, bool notify = true); void setPlaybackDeviceIndex(int value, bool notify = true); void setMirrorDeviceIndex(int value, bool notify = true); @@ -110,6 +117,7 @@ namespace advsettings { void micDeviceIndexChanged(int index); void micVolumeChanged(float value); void micMutedChanged(bool value); + void micProximitySensorCanMuteChanged(bool value); void playbackDeviceListChanged(); void recordingDeviceListChanged();