Skip to content

Commit

Permalink
VideoConference add new behavior option startup action
Browse files Browse the repository at this point in the history
  • Loading branch information
quyenvsp committed Oct 4, 2023
1 parent 644c158 commit f238fce
Show file tree
Hide file tree
Showing 9 changed files with 138 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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)
{
Expand Down Expand Up @@ -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)
Expand All @@ -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)
{
Expand Down Expand Up @@ -338,6 +342,7 @@ void VideoConferenceModule::onMicrophoneConfigurationChanged()
toolbar.setMicrophoneMute(muted);
});
}
setMuteChangedCallback();
}

VideoConferenceModule::VideoConferenceModule()
Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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;
Expand Down Expand Up @@ -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()
Expand Down Expand Up @@ -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;
}
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ struct VideoConferenceSettings
std::wstring imageOverlayPath;
std::wstring selectedMicrophone;

std::wstring startupAction;

bool pushToReverseEnabled = false;
};

Expand Down Expand Up @@ -71,6 +73,7 @@ class VideoConferenceModule : public PowertoyModuleIface

private:

void setMuteChangedCallback();
void init_settings();
void updateControlledMicrophones(const std::wstring_view new_mic);
MicrophoneDevice* controlledDefaultMic();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,6 @@ class MicrophoneDevice
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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,9 @@ public VideoConferenceConfigProperties()
[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()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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" }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,16 @@
</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>

Expand Down
15 changes: 15 additions & 0 deletions src/settings-ui/Settings.UI/Strings/en-us/Resources.resw
Original file line number Diff line number Diff line change
Expand Up @@ -579,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>
Expand Down
44 changes: 44 additions & 0 deletions src/settings-ui/Settings.UI/ViewModels/VideoConferenceViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,19 @@ public class VideoConferenceViewModel : Observable
break;
}

switch (Settings.Properties.StartupAction.Value)
{
case "Nothing":
_startupActionIndex = 0;
break;
case "Unmute":
_startupActionIndex = 1;
break;
case "Mute":
_startupActionIndex = 2;
break;
}

if (shouldSaveSettings)
{
_settingsUtils.SaveSettings(Settings.ToJsonString(), ModuleName);
Expand Down Expand Up @@ -179,6 +192,7 @@ private void InitializeEnabledValue()
private int _toolbarPositionIndex;
private int _toolbarMonitorIndex;
private int _toolbarHideIndex;
private int _startupActionIndex;
private HotkeySettings _cameraAndMicrophoneMuteHotkey;
private HotkeySettings _microphoneMuteHotkey;
private HotkeySettings _microphonePushToTalkHotkey;
Expand Down Expand Up @@ -510,6 +524,36 @@ public int ToolbarHideIndex
}
}

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;
Expand Down

0 comments on commit f238fce

Please sign in to comment.