[VCM]Add options to hide after timeout and startup action (#28658)

* VideoConference add new option ToolbarHide After timeout

* VideoConference add new behavior option startup action
This commit is contained in:
Quyen Le Van 2023-10-06 14:48:36 +07:00 committed by GitHub
parent 03ad83836d
commit 99882508bc
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
9 changed files with 148 additions and 12 deletions

View File

@ -50,12 +50,12 @@ bool VideoConferenceModule::isHotkeyPressed(DWORD code, PowerToysSettings::Hotke
void VideoConferenceModule::reverseMicrophoneMute()
{
bool muted = false;
// All controlled mic should same state with _microphoneTrackedInUI
// Avoid manually change in Control Panel make controlled mic has different state
bool muted = !getMicrophoneMuteState();
for (auto& controlledMic : instance->_controlledMicrophones)
{
const bool was_muted = controlledMic->muted();
controlledMic->toggle_muted();
muted = muted || !was_muted;
controlledMic->set_muted(muted);
}
if (muted)
{
@ -283,6 +283,10 @@ void VideoConferenceModule::onModuleSettingsChanged()
{
toolbar.setToolbarHide(val.value());
}
if (const auto val = values.get_string_value(L"startup_action"))
{
settings.startupAction = val.value();
}
const auto selectedMic = values.get_string_value(L"selected_mic");
if (selectedMic && selectedMic != settings.selectedMicrophone)
@ -308,7 +312,7 @@ void VideoConferenceModule::onMicrophoneConfigurationChanged()
return;
}
const bool mutedStateForNewMics = _microphoneTrackedInUI ? _microphoneTrackedInUI->muted() : _mic_muted_state_during_disconnect;
const bool mutedStateForNewMics = getMicrophoneMuteState();
std::unordered_set<std::wstring_view> currentlyTrackedMicsIds;
for (const auto& controlledMic : _controlledMicrophones)
{
@ -338,6 +342,7 @@ void VideoConferenceModule::onMicrophoneConfigurationChanged()
toolbar.setMicrophoneMute(muted);
});
}
setMuteChangedCallback();
}
VideoConferenceModule::VideoConferenceModule()
@ -401,6 +406,25 @@ void VideoConferenceModule::set_config(const wchar_t* config)
}
}
void VideoConferenceModule::setMuteChangedCallback()
{
// Keep all controlledMic mute state same _microphoneTrackedInUI
// Should not change manually in Control Panel
for (const auto& controlledMic : _controlledMicrophones)
{
if (controlledMic->id() != _microphoneTrackedInUI->id())
{
controlledMic->set_mute_changed_callback([&](const bool muted) {
auto muteState = getMicrophoneMuteState();
if (muted != muteState)
{
controlledMic->set_muted(muteState);
}
});
}
}
}
void VideoConferenceModule::init_settings()
{
try
@ -447,6 +471,10 @@ void VideoConferenceModule::init_settings()
{
toolbar.setToolbarHide(val.value());
}
if (const auto val = powerToysSettings.get_string_value(L"startup_action"))
{
settings.startupAction = val.value();
}
if (const auto val = powerToysSettings.get_string_value(L"selected_mic"); val && *val != settings.selectedMicrophone)
{
settings.selectedMicrophone = *val;
@ -509,6 +537,22 @@ void VideoConferenceModule::updateControlledMicrophones(const std::wstring_view
});
toolbar.setMicrophoneMute(_microphoneTrackedInUI->muted());
}
if (settings.startupAction == L"Unmute")
{
for (auto& controlledMic : _controlledMicrophones)
{
controlledMic->set_muted(false);
}
}
else if (settings.startupAction == L"Mute")
{
for (auto& controlledMic : _controlledMicrophones)
{
controlledMic->set_muted(true);
}
}
setMuteChangedCallback();
}
MicrophoneDevice* VideoConferenceModule::controlledDefaultMic()
@ -669,6 +713,14 @@ void VideoConferenceModule::sendSourceCameraNameUpdate()
auto updatesChannel = reinterpret_cast<CameraSettingsUpdateChannel*>(memory._data);
updatesChannel->sourceCameraName.emplace();
std::copy(begin(settings.selectedCamera), end(settings.selectedCamera), begin(*updatesChannel->sourceCameraName));
if (settings.startupAction == L"Unmute")
{
updatesChannel->useOverlayImage = false;
}
else if (settings.startupAction == L"Mute")
{
updatesChannel->useOverlayImage = true;
}
});
}

View File

@ -30,6 +30,8 @@ struct VideoConferenceSettings
std::wstring imageOverlayPath;
std::wstring selectedMicrophone;
std::wstring startupAction;
bool pushToReverseEnabled = false;
};
@ -71,6 +73,7 @@ public:
private:
void setMuteChangedCallback();
void init_settings();
void updateControlledMicrophones(const std::wstring_view new_mic);
MicrophoneDevice* controlledDefaultMic();

View File

@ -53,11 +53,6 @@ bool MicrophoneDevice::muted() const noexcept
return muted;
}
void MicrophoneDevice::toggle_muted() noexcept
{
set_muted(!muted());
}
std::wstring_view MicrophoneDevice::id() const noexcept
{
return _id ? _id.get() : FALLBACK_ID;
@ -70,6 +65,10 @@ std::wstring_view MicrophoneDevice::name() const noexcept
void MicrophoneDevice::set_mute_changed_callback(mute_changed_cb_t callback) noexcept
{
if (_notifier)
{
_endpoint->UnregisterControlChangeNotify(_notifier.get());
}
_mute_changed_callback = std::move(callback);
_notifier = winrt::make<VolumeNotifier>(this);

View File

@ -54,7 +54,6 @@ public:
bool active() const noexcept;
void set_muted(const bool muted) noexcept;
bool muted() const noexcept;
void toggle_muted() noexcept;
std::wstring_view id() const noexcept;
std::wstring_view name() const noexcept;

View File

@ -95,6 +95,9 @@ namespace Microsoft.PowerToys.Settings.UI.Library
[JsonPropertyName("toolbar_hide")]
public StringProperty ToolbarHide { get; set; } = "When both camera and microphone are unmuted";
[JsonPropertyName("startup_action")]
public StringProperty StartupAction { get; set; } = "Nothing";
// converts the current to a json string.
public string ToJsonString()
{

View File

@ -37,6 +37,7 @@
"selected_camera": { "value": "USB Video Device" },
"theme": { "value": "light" },
"toolbar_monitor": { "value": "All monitors" },
"toolbar_position": { "value": "Bottom center" }
"toolbar_position": { "value": "Bottom center" },
"startup_action": { "value": "Nothing" }
}
}

View File

@ -146,11 +146,22 @@
<ComboBoxItem x:Uid="VideoConference_ToolbarHideNever" />
<ComboBoxItem x:Uid="VideoConference_ToolbarHideUnmuted" />
<ComboBoxItem x:Uid="VideoConference_ToolbarHideMuted" />
<ComboBoxItem x:Uid="VideoConference_ToolbarHideTimeout" />
</ComboBox>
</controls:SettingsCard>
</controls:SettingsExpander.Items>
</controls:SettingsExpander>
</custom:SettingsGroup>
<custom:SettingsGroup x:Uid="VideoConference_Behavior" IsEnabled="{Binding Mode=OneWay, Path=IsEnabled}">
<controls:SettingsCard x:Uid="VideoConference_StartupAction">
<ComboBox MinWidth="{StaticResource SettingActionControlMinWidth}" SelectedIndex="{Binding Mode=TwoWay, Path=StartupActionIndex}">
<ComboBoxItem x:Uid="VideoConference_StartupActionNothing" />
<ComboBoxItem x:Uid="VideoConference_StartupActionUnmute" />
<ComboBoxItem x:Uid="VideoConference_StartupActionMute" />
</ComboBox>
</controls:SettingsCard>
</custom:SettingsGroup>
</StackPanel>
</custom:SettingsPageControl.ModuleContent>

View File

@ -561,6 +561,9 @@
<data name="VideoConference_ToolbarHideUnmuted.Content" xml:space="preserve">
<value>When both camera and microphone are unmuted</value>
</data>
<data name="VideoConference_ToolbarHideTimeout.Content" xml:space="preserve">
<value>After timeout</value>
</data>
<data name="VideoConference.ModuleTitle" xml:space="preserve">
<value>Video Conference Mute</value>
</data>
@ -576,6 +579,21 @@
<data name="VideoConference_Toolbar.Header" xml:space="preserve">
<value>Toolbar</value>
</data>
<data name="VideoConference_Behavior.Header" xml:space="preserve">
<value>Behavior</value>
</data>
<data name="VideoConference_StartupAction.Header" xml:space="preserve">
<value>Startup action</value>
</data>
<data name="VideoConference_StartupActionNothing.Content" xml:space="preserve">
<value>Nothing</value>
</data>
<data name="VideoConference_StartupActionUnmute.Content" xml:space="preserve">
<value>Unmute</value>
</data>
<data name="VideoConference_StartupActionMute.Content" xml:space="preserve">
<value>Mute</value>
</data>
<data name="VideoConference_Shortcuts.Header" xml:space="preserve">
<value>Shortcuts</value>
</data>

View File

@ -147,6 +147,22 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
case "When both camera and microphone are muted":
_toolbarHideIndex = 2;
break;
case "After timeout":
_toolbarHideIndex = 3;
break;
}
switch (Settings.Properties.StartupAction.Value)
{
case "Nothing":
_startupActionIndex = 0;
break;
case "Unmute":
_startupActionIndex = 1;
break;
case "Mute":
_startupActionIndex = 2;
break;
}
if (shouldSaveSettings)
@ -176,6 +192,7 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
private int _toolbarPositionIndex;
private int _toolbarMonitorIndex;
private int _toolbarHideIndex;
private int _startupActionIndex;
private HotkeySettings _cameraAndMicrophoneMuteHotkey;
private HotkeySettings _microphoneMuteHotkey;
private HotkeySettings _microphonePushToTalkHotkey;
@ -497,6 +514,9 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
case 2:
Settings.Properties.ToolbarHide.Value = "When both camera and microphone are muted";
break;
case 3:
Settings.Properties.ToolbarHide.Value = "After timeout";
break;
}
RaisePropertyChanged(nameof(ToolbarHideIndex));
@ -504,6 +524,36 @@ namespace Microsoft.PowerToys.Settings.UI.ViewModels
}
}
public int StartupActionIndex
{
get
{
return _startupActionIndex;
}
set
{
if (value != _startupActionIndex)
{
_startupActionIndex = value;
switch (_startupActionIndex)
{
case 0:
Settings.Properties.StartupAction.Value = "Nothing";
break;
case 1:
Settings.Properties.StartupAction.Value = "Unmute";
break;
case 2:
Settings.Properties.StartupAction.Value = "Mute";
break;
}
RaisePropertyChanged(nameof(_startupActionIndex));
}
}
}
public string GetSettingsSubPath()
{
return _settingsConfigFileFolder + (string.IsNullOrEmpty(_settingsConfigFileFolder) ? string.Empty : "\\") + ModuleName;