From 12bb5c21317474255c5399849de65637b593ba0e Mon Sep 17 00:00:00 2001 From: Jaime Bernardo Date: Thu, 16 Jan 2025 15:17:34 +0000 Subject: [PATCH] [VCM]Deprecate the Video Conference Mute utility (#36772) * Remove all VideoConferenceMute related code and files * Clean up vcm driver registry keys * Also remove the Webcam report tool * Also clean out video conference on the installer * Fix spellcheck * Remove comment about video conf * Update gpo files revision * Revert removing the VCM policies * Deprecate VCM GPO policy * Change deprecation message to show first supported version * Tweak supported strings in the adml --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/ISSUE_TEMPLATE/translation_issue.yml | 1 - .github/actions/spell-check/allow/names.txt | 1 - .github/actions/spell-check/expect.txt | 4 +- .pipelines/ESRPSigning_core.json | 6 - .pipelines/ESRPSigning_vcm.json | 50 - .pipelines/v2/templates/job-build-project.yml | 34 +- DATA_AND_PRIVACY.md | 20 - PowerToys.sln | 49 - README.md | 3 +- doc/devdocs/akaLinks.md | 3 - doc/devdocs/readme.md | 7 - doc/devdocs/tools/build-tools.md | 4 - doc/devdocs/tools/readme.md | 1 - doc/devdocs/tools/webcam-report-tool.md | 6 - .../overview/Original/VideoConference.png | Bin 98862 -> 0 bytes doc/images/overview/VideoConference_large.png | Bin 55499 -> 0 bytes doc/images/overview/VideoConference_small.png | Bin 22289 -> 0 bytes installer/PowerToysSetup/Common.wxi | 1 - .../PowerToysSetup/PowerToysInstaller.wixproj | 2 - installer/PowerToysSetup/Product.wxs | 12 +- installer/PowerToysSetup/Tools.wxs | 7 - installer/PowerToysSetup/VideoConference.wxs | 56 -- .../CustomAction.cpp | 172 +--- .../CustomAction.def | 4 +- .../PowerToysSetupCustomActions.vcxproj | 1 - src/common/Common.UI/SettingsDeepLink.cs | 3 - src/common/GPOWrapper/GPOWrapper.cpp | 4 - src/common/GPOWrapper/GPOWrapper.h | 1 - src/common/GPOWrapper/GPOWrapper.idl | 1 - src/common/interop/CommonManaged.cpp | 27 - src/common/interop/CommonManaged.h | 2 - src/common/interop/CommonManaged.idl | 2 - src/common/interop/PowerToys.Interop.vcxproj | 4 - .../interop/PowerToys.Interop.vcxproj.filters | 12 - src/common/utils/clean_video_conference.h | 18 + src/common/utils/gpo.h | 6 - src/common/version/version.vcxproj | 2 +- .../examples/disableAllModules.dsc.yaml | 2 - .../examples/enableAllModules.dsc.yaml | 2 - src/gpo/assets/PowerToys.admx | 12 +- src/gpo/assets/en-US/PowerToys.adml | 4 +- .../Assets/VCM/Off-NotInUse Dark.png | Bin 13104 -> 0 bytes .../Assets/VCM/Off-NotInUse Dark.svg | 19 - .../Assets/VCM/Off-NotInUse Light.png | Bin 12931 -> 0 bytes .../Assets/VCM/Off-NotInUse Light.svg | 19 - .../Assets/VCM/Off-Off Dark.png | Bin 11546 -> 0 bytes .../Assets/VCM/Off-Off Dark.svg | 19 - .../Assets/VCM/Off-Off Light.png | Bin 11488 -> 0 bytes .../Assets/VCM/Off-Off Light.svg | 19 - .../Assets/VCM/Off-On Dark.png | Bin 5664 -> 0 bytes .../Assets/VCM/Off-On Dark.svg | 19 - .../Assets/VCM/Off-On Light.png | Bin 5678 -> 0 bytes .../Assets/VCM/Off-On Light.svg | 19 - .../Assets/VCM/On-NotInUse Dark.png | Bin 6016 -> 0 bytes .../Assets/VCM/On-NotInUse Dark.svg | 19 - .../Assets/VCM/On-NotInUse Light.png | Bin 6321 -> 0 bytes .../Assets/VCM/On-NotInUse Light.svg | 19 - .../Assets/VCM/On-Off Dark.png | Bin 5808 -> 0 bytes .../Assets/VCM/On-Off Dark.svg | 19 - .../Assets/VCM/On-Off Light.png | Bin 10232 -> 0 bytes .../Assets/VCM/On-Off Light.svg | 19 - .../Assets/VCM/On-On Dark.png | Bin 4975 -> 0 bytes .../Assets/VCM/On-On Dark.svg | 19 - .../Assets/VCM/On-On Light.png | Bin 4976 -> 0 bytes .../Assets/VCM/On-On Light.svg | 19 - .../Assets/VCM/black.bmp | Bin 822 -> 0 bytes .../AudioDeviceNotificationClient.cpp | 78 -- .../AudioDeviceNotificationClient.h | 30 - .../VideoConferenceModule/README.md | 14 - .../VideoConferenceModule/Toolbar.cpp | 390 -------- .../VideoConferenceModule/Toolbar.h | 64 -- .../VideoConference.filters | 55 - .../VideoConference.vcxproj | 189 ---- .../VideoConference.vcxproj.filters | 78 -- .../VideoConferenceModule.cpp | 733 -------------- .../VideoConferenceModule.h | 102 -- .../VideoConferenceModule.rc | 40 - .../VideoConferenceModule/dllmain.cpp | 35 - .../VideoConferenceModule/framework.h | 5 - .../VideoConferenceModule/packages.config | 5 - .../VideoConferenceModule/pch.cpp | 5 - .../VideoConferenceModule/pch.h | 23 - .../VideoConferenceModule/resource.h | 13 - .../VideoConferenceModule/trace.cpp | 60 -- .../VideoConferenceModule/trace.h | 13 - .../DirectShowUtils.cpp | 113 --- .../DirectShowUtils.h | 87 -- .../ImageLoading.cpp | 424 -------- .../VideoConferenceProxyFilter/Resources.resx | 124 --- .../VideoCaptureDevice.cpp | 636 ------------ .../VideoCaptureDevice.h | 62 -- .../VideoCaptureProxyFilter.cpp | 937 ------------------ .../VideoCaptureProxyFilter.h | 120 --- .../VideoConferenceProxyFilter.rc | 47 - .../VideoConferenceProxyFilter.vcxproj | 157 --- .../VideoConferenceProxyFilterx86.sln | 51 - .../build_vcm_x86.cmd | 3 - .../VideoConferenceProxyFilter/dllmain.cpp | 242 ----- .../VideoConferenceProxyFilter/module.def | 7 - .../packages.config | 4 - .../VideoConferenceProxyFilter/resource.h | 11 - .../VideoConferenceProxyFilter/resource.x86.h | 11 - .../CameraStateUpdateChannels.cpp | 15 - .../CameraStateUpdateChannels.h | 23 - .../DLLProviderHelpers.h | 33 - .../VideoConferenceShared/Logging.cpp | 202 ---- .../VideoConferenceShared/Logging.h | 62 -- .../MediaFoundationAPIProvider.h | 14 - .../MicrophoneDevice.cpp | 154 --- .../VideoConferenceShared/MicrophoneDevice.h | 64 -- .../SerializedSharedMemory.cpp | 190 ---- .../SerializedSharedMemory.h | 54 - .../VideoCaptureDeviceList.cpp | 107 -- .../VideoCaptureDeviceList.h | 33 - .../VideoConferenceShared.vcxproj | 149 --- .../VideoConferenceShared/naming.cpp | 19 - .../VideoConferenceShared/naming.h | 5 - .../VideoConferenceShared/packages.config | 5 - .../VideoConferenceShared/pch.h | 2 - .../VideoConferenceShared/username.cpp | 20 - .../VideoConferenceShared/username.h | 9 - src/modules/videoconference/make_cab.ddf | 20 - src/runner/main.cpp | 16 +- src/runner/settings_window.cpp | 6 - src/runner/settings_window.h | 1 - .../Settings.UI.Library/EnabledModules.cs | 16 - .../SndVideoConferenceSettings.cs | 25 - .../VideoConferenceConfigProperties.cs | 113 --- .../VideoConferenceSettings.cs | 35 - .../VideoConferenceSettingsIPCMessage.cs | 29 - .../Settings/Icons/VideoConferenceMute.png | Bin 1155 -> 0 bytes .../Modules/OOBE/VideoConferenceMute.png | Bin 56878 -> 0 bytes .../Settings/Modules/VideoConference.png | Bin 55499 -> 0 bytes .../OOBE/Enums/PowerToysModules.cs | 1 - .../Settings.UI/SettingsXAML/App.xaml.cs | 1 - .../OOBE/Views/OobeShellPage.xaml | 4 - .../OOBE/Views/OobeShellPage.xaml.cs | 7 - .../OOBE/Views/OobeVideoConference.xaml | 35 - .../OOBE/Views/OobeVideoConference.xaml.cs | 52 - .../SettingsXAML/Views/ShellPage.xaml | 6 - .../SettingsXAML/Views/VideoConference.xaml | 171 ---- .../Views/VideoConference.xaml.cs | 65 -- .../Settings.UI/Strings/en-us/Resources.resw | 162 --- .../Settings.UI/ViewModels/ShellViewModel.cs | 15 - .../ViewModels/VideoConferenceViewModel.cs | 586 ----------- tools/BugReportTool/BugReportTool/Main.cpp | 9 - .../BugReportTool/ReportGPOValues.cpp | 1 - tools/WebcamReportTool/DirectShowUtils.cpp | 26 - tools/WebcamReportTool/DirectShowUtils.h | 31 - tools/WebcamReportTool/WebcamReportTool.rc | 40 - tools/WebcamReportTool/WebcamReportTool.sln | 31 - .../WebcamReportTool/WebcamReportTool.vcxproj | 75 -- tools/WebcamReportTool/main.cpp | 240 ----- tools/WebcamReportTool/packages.config | 5 - tools/WebcamReportTool/resource.h | 13 - tools/build/video_conference_make_cab.ps1 | 13 - 157 files changed, 69 insertions(+), 8684 deletions(-) delete mode 100644 .pipelines/ESRPSigning_vcm.json delete mode 100644 doc/devdocs/tools/webcam-report-tool.md delete mode 100644 doc/images/overview/Original/VideoConference.png delete mode 100644 doc/images/overview/VideoConference_large.png delete mode 100644 doc/images/overview/VideoConference_small.png delete mode 100644 installer/PowerToysSetup/VideoConference.wxs create mode 100644 src/common/utils/clean_video_conference.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Dark.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Dark.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Dark.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Dark.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Dark.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Dark.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Light.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Light.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.png delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.svg delete mode 100644 src/modules/videoconference/VideoConferenceModule/Assets/VCM/black.bmp delete mode 100644 src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.cpp delete mode 100644 src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/README.md delete mode 100644 src/modules/videoconference/VideoConferenceModule/Toolbar.cpp delete mode 100644 src/modules/videoconference/VideoConferenceModule/Toolbar.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/VideoConference.filters delete mode 100644 src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj delete mode 100644 src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj.filters delete mode 100644 src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.cpp delete mode 100644 src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.rc delete mode 100644 src/modules/videoconference/VideoConferenceModule/dllmain.cpp delete mode 100644 src/modules/videoconference/VideoConferenceModule/framework.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/packages.config delete mode 100644 src/modules/videoconference/VideoConferenceModule/pch.cpp delete mode 100644 src/modules/videoconference/VideoConferenceModule/pch.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/resource.h delete mode 100644 src/modules/videoconference/VideoConferenceModule/trace.cpp delete mode 100644 src/modules/videoconference/VideoConferenceModule/trace.h delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.cpp delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.h delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/ImageLoading.cpp delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/Resources.resx delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.cpp delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.h delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.cpp delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.h delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.rc delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilterx86.sln delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/build_vcm_x86.cmd delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/dllmain.cpp delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/module.def delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/packages.config delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/resource.h delete mode 100644 src/modules/videoconference/VideoConferenceProxyFilter/resource.x86.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/DLLProviderHelpers.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/Logging.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/Logging.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/MediaFoundationAPIProvider.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj delete mode 100644 src/modules/videoconference/VideoConferenceShared/naming.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/naming.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/packages.config delete mode 100644 src/modules/videoconference/VideoConferenceShared/pch.h delete mode 100644 src/modules/videoconference/VideoConferenceShared/username.cpp delete mode 100644 src/modules/videoconference/VideoConferenceShared/username.h delete mode 100644 src/modules/videoconference/make_cab.ddf delete mode 100644 src/settings-ui/Settings.UI.Library/SndVideoConferenceSettings.cs delete mode 100644 src/settings-ui/Settings.UI.Library/VideoConferenceConfigProperties.cs delete mode 100644 src/settings-ui/Settings.UI.Library/VideoConferenceSettings.cs delete mode 100644 src/settings-ui/Settings.UI.Library/VideoConferenceSettingsIPCMessage.cs delete mode 100644 src/settings-ui/Settings.UI/Assets/Settings/Icons/VideoConferenceMute.png delete mode 100644 src/settings-ui/Settings.UI/Assets/Settings/Modules/OOBE/VideoConferenceMute.png delete mode 100644 src/settings-ui/Settings.UI/Assets/Settings/Modules/VideoConference.png delete mode 100644 src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeVideoConference.xaml delete mode 100644 src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeVideoConference.xaml.cs delete mode 100644 src/settings-ui/Settings.UI/SettingsXAML/Views/VideoConference.xaml delete mode 100644 src/settings-ui/Settings.UI/SettingsXAML/Views/VideoConference.xaml.cs delete mode 100644 src/settings-ui/Settings.UI/ViewModels/VideoConferenceViewModel.cs delete mode 100644 tools/WebcamReportTool/DirectShowUtils.cpp delete mode 100644 tools/WebcamReportTool/DirectShowUtils.h delete mode 100644 tools/WebcamReportTool/WebcamReportTool.rc delete mode 100644 tools/WebcamReportTool/WebcamReportTool.sln delete mode 100644 tools/WebcamReportTool/WebcamReportTool.vcxproj delete mode 100644 tools/WebcamReportTool/main.cpp delete mode 100644 tools/WebcamReportTool/packages.config delete mode 100644 tools/WebcamReportTool/resource.h delete mode 100644 tools/build/video_conference_make_cab.ps1 diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index f2eb897a4d..1f09762623 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -77,7 +77,6 @@ body: - Shortcut Guide - System tray interaction - TextExtractor - - Video Conference Mute - Workspaces - Welcome / PowerToys Tour window validations: diff --git a/.github/ISSUE_TEMPLATE/translation_issue.yml b/.github/ISSUE_TEMPLATE/translation_issue.yml index 69787a3ed6..63efb7c928 100644 --- a/.github/ISSUE_TEMPLATE/translation_issue.yml +++ b/.github/ISSUE_TEMPLATE/translation_issue.yml @@ -51,7 +51,6 @@ body: - Shortcut Guide - System tray interaction - TextExtractor - - Video Conference Mute - Workspaces - Welcome / PowerToys Tour window validations: diff --git a/.github/actions/spell-check/allow/names.txt b/.github/actions/spell-check/allow/names.txt index fb7ff648b2..d82eb28c11 100644 --- a/.github/actions/spell-check/allow/names.txt +++ b/.github/actions/spell-check/allow/names.txt @@ -23,7 +23,6 @@ registrypreview rooler scoobe shortcutguide -videoconference # USERS diff --git a/.github/actions/spell-check/expect.txt b/.github/actions/spell-check/expect.txt index ba07b47d3a..f0d15e6ba2 100644 --- a/.github/actions/spell-check/expect.txt +++ b/.github/actions/spell-check/expect.txt @@ -1185,7 +1185,7 @@ psrm psrree pstatstg pstm -pstr +PStr pstream pstrm PSYSTEM @@ -1648,7 +1648,6 @@ vcamp vcdl vcgtq VCINSTALLDIR -vcm Vcpkg VCRT vcruntime @@ -1667,7 +1666,6 @@ vget vgetq vid VIDCAP -videoconferencevirtualdriver VIDEOINFOHEADER viewmodel vih diff --git a/.pipelines/ESRPSigning_core.json b/.pipelines/ESRPSigning_core.json index 1f84b4d415..76b55d0597 100644 --- a/.pipelines/ESRPSigning_core.json +++ b/.pipelines/ESRPSigning_core.json @@ -17,7 +17,6 @@ "PowerToys.FilePreviewCommon.dll", "PowerToys.Interop.dll", "Tools\\PowerToys.BugReportTool.exe", - "WebcamReportTool\\PowerToys.WebcamReportTool.exe", "StylesReportTool\\PowerToys.StylesReportTool.exe", "Telemetry.dll", "PowerToys.ManagedTelemetry.dll", @@ -212,11 +211,6 @@ "PowerToys.ShortcutGuide.exe", "PowerToys.ShortcutGuideModuleInterface.dll", - "PowerToys.VideoConferenceModule.dll", - "PowerToys.VideoConferenceProxyFilter_x86.dll", - "PowerToys.VideoConferenceProxyFilter_x64.dll", - "PowerToys.VideoConferenceProxyFilter_arm64.dll", - "WinUI3Apps\\PowerToys.Settings.dll", "WinUI3Apps\\PowerToys.Settings.exe" ], diff --git a/.pipelines/ESRPSigning_vcm.json b/.pipelines/ESRPSigning_vcm.json deleted file mode 100644 index e9f2309cc4..0000000000 --- a/.pipelines/ESRPSigning_vcm.json +++ /dev/null @@ -1,50 +0,0 @@ -{ - "Version": "1.0.0", - "UseMinimatch": false, - "SignBatches": [ - { - "MatchedPath": [ - "PowerToys.VideoConferenceProxyFilter_x86.dll" - ], - "SigningInfo": { - "Operations": [ - { - "KeyCode": "CP-230012", - "OperationSetCode": "SigntoolSign", - "Parameters": [ - { - "parameterName": "OpusName", - "parameterValue": "Microsoft" - }, - { - "parameterName": "OpusInfo", - "parameterValue": "http://www.microsoft.com" - }, - { - "parameterName": "FileDigest", - "parameterValue": "/fd \"SHA256\"" - }, - { - "parameterName": "PageHash", - "parameterValue": "/NPH" - }, - { - "parameterName": "TimeStamp", - "parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256" - } - ], - "ToolName": "sign", - "ToolVersion": "1.0" - }, - { - "KeyCode": "CP-230012", - "OperationSetCode": "SigntoolVerify", - "Parameters": [], - "ToolName": "sign", - "ToolVersion": "1.0" - } - ] - } - } - ] -} diff --git a/.pipelines/v2/templates/job-build-project.yml b/.pipelines/v2/templates/job-build-project.yml index 653e8cc9fd..5a3b787ede 100644 --- a/.pipelines/v2/templates/job-build-project.yml +++ b/.pipelines/v2/templates/job-build-project.yml @@ -172,7 +172,6 @@ jobs: - pwsh: |- & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\PowerToys.sln' & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\BugReportTool\BugReportTool.sln' - & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\WebcamReportTool\WebcamReportTool.sln' & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\tools\StylesReportTool\StylesReportTool.sln' & '.pipelines/verifyArm64Configuration.ps1' -solution '$(build.sourcesdirectory)\installer\PowerToysSetup.sln' displayName: Verify ARM64 configurations @@ -361,27 +360,6 @@ jobs: env: SYSTEM_ACCESSTOKEN: $(System.AccessToken) - - task: VSBuild@1 - displayName: Build WebcamReportTool - inputs: - solution: '**/tools/WebcamReportTool/WebcamReportTool.sln' - vsVersion: 17.0 - msbuildArgs: >- - -restore -graph - /p:RestorePackagesConfig=true - /p:CIBuild=true - /bl:$(LogOutputDirectory)\build-webcam-report.binlog - ${{ parameters.additionalBuildOptions }} - $(MSBuildCacheParameters) - $(RestoreAdditionalProjectSourcesArg) - platform: $(BuildPlatform) - configuration: $(BuildConfiguration) - msbuildArchitecture: x64 - maximumCpuCount: true - ${{ if eq(parameters.enableMsBuildCaching, true) }}: - env: - SYSTEM_ACCESSTOKEN: $(System.AccessToken) - - task: VSBuild@1 displayName: Build StylesReportTool inputs: @@ -484,7 +462,7 @@ jobs: displayName: Sign Core PowerToys signingIdentity: ${{ parameters.signingIdentity }} inputs: - FolderPath: '$(BuildPlatform)/$(BuildConfiguration)' # Video conf uses x86 and x64. + FolderPath: '$(BuildPlatform)/$(BuildConfiguration)' signType: batchSigning batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_core.json' ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml' @@ -499,16 +477,6 @@ jobs: batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_DSC.json' ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml' - - template: steps-esrp-signing.yml - parameters: - displayName: Sign x86 DirectShow VCM - signingIdentity: ${{ parameters.signingIdentity }} - inputs: - FolderPath: 'x86/$(BuildConfiguration)' # Video conf uses x86 and x64. - signType: batchSigning - batchSignPolicyFile: '$(build.sourcesdirectory)\.pipelines\ESRPSigning_vcm.json' - ciPolicyFile: '$(build.sourcesdirectory)\.pipelines\CIPolicy.xml' - - template: steps-build-installer.yml parameters: codeSign: ${{ parameters.codeSign }} diff --git a/DATA_AND_PRIVACY.md b/DATA_AND_PRIVACY.md index 5570729c20..a8714fa903 100644 --- a/DATA_AND_PRIVACY.md +++ b/DATA_AND_PRIVACY.md @@ -941,26 +941,6 @@ _If you want to find diagnostic data events in the source code, these two links -### Video Conference Mute - - - - - - - - - - - - - - - - - -
Event NameDescription
Microsoft.PowerToys.VideoConference_CameraMutedTriggered when the camera is turned off by Video Conference Mute.
Microsoft.PowerToys.VideoConference_EnableVideoConferenceOccurs when Video Conference Mute is enabled.
Microsoft.PowerToys.VideoConference_MicrophoneMutedOccurs when the microphone is muted by Video Conference Mute.
- ### Workspaces diff --git a/PowerToys.sln b/PowerToys.sln index ca7fa06db7..f28a7c8013 100644 --- a/PowerToys.sln +++ b/PowerToys.sln @@ -349,17 +349,6 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PowerToys.Update", "src\Upd EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.PowerToys.Run.Plugin.WindowsSettings", "src\modules\launcher\Plugins\Microsoft.PowerToys.Run.Plugin.WindowsSettings\Microsoft.PowerToys.Run.Plugin.WindowsSettings.csproj", "{5043CECE-E6A7-4867-9CBE-02D27D83747A}" EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoConferenceShared", "src\modules\videoconference\VideoConferenceShared\VideoConferenceShared.vcxproj", "{459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoConferenceModule", "src\modules\videoconference\VideoConferenceModule\VideoConference.vcxproj", "{5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoConferenceProxyFilter", "src\modules\videoconference\VideoConferenceProxyFilter\VideoConferenceProxyFilter.vcxproj", "{AC2857B4-103D-4D6D-9740-926EBF785042}" - ProjectSection(ProjectDependencies) = postProject - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A} = {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A} - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "VideoConference", "VideoConference", "{470FBAF9-E1F8-4F3E-8786-198A1C81C8A8}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "PdfThumbnailProvider", "src\modules\previewpane\PdfThumbnailProvider\PdfThumbnailProvider.csproj", "{11491FD8-F921-48BF-880C-7FEA185B80A1}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UnitTests-PdfThumbnailProvider", "src\modules\previewpane\UnitTests-PdfThumbnailProvider\UnitTests-PdfThumbnailProvider.csproj", "{F40C3397-1834-4530-B2D9-8F8B8456BCDF}" @@ -1509,40 +1498,6 @@ Global {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x64.ActiveCfg = Release|x64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x64.Build.0 = Release|x64 {5043CECE-E6A7-4867-9CBE-02D27D83747A}.Release|x86.ActiveCfg = Release|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|ARM64.Build.0 = Debug|ARM64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|x64.ActiveCfg = Debug|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|x64.Build.0 = Debug|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|x86.ActiveCfg = Debug|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|x86.Build.0 = Debug|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|ARM64.ActiveCfg = Release|ARM64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|ARM64.Build.0 = Release|ARM64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|x64.ActiveCfg = Release|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|x64.Build.0 = Release|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|x86.ActiveCfg = Release|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|x86.Build.0 = Release|Win32 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Debug|ARM64.Build.0 = Debug|ARM64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Debug|x64.ActiveCfg = Debug|x64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Debug|x64.Build.0 = Debug|x64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Debug|x86.ActiveCfg = Debug|x64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Release|ARM64.ActiveCfg = Release|ARM64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Release|ARM64.Build.0 = Release|ARM64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Release|x64.ActiveCfg = Release|x64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Release|x64.Build.0 = Release|x64 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB}.Release|x86.ActiveCfg = Release|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|ARM64.ActiveCfg = Debug|ARM64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|ARM64.Build.0 = Debug|ARM64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|x64.ActiveCfg = Debug|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|x64.Build.0 = Debug|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|x86.ActiveCfg = Debug|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|x86.Build.0 = Debug|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|ARM64.ActiveCfg = Release|ARM64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|ARM64.Build.0 = Release|ARM64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|x64.ActiveCfg = Release|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|x64.Build.0 = Release|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|x86.ActiveCfg = Release|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|x86.Build.0 = Release|Win32 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|ARM64.ActiveCfg = Debug|ARM64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|ARM64.Build.0 = Debug|ARM64 {11491FD8-F921-48BF-880C-7FEA185B80A1}.Debug|x64.ActiveCfg = Debug|x64 @@ -2938,10 +2893,6 @@ Global {48804216-2A0E-4168-A6D8-9CD068D14227} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {FF1D7936-842A-4BBB-8BEA-E9FE796DE700} = {D1D6BC88-09AE-4FB4-AD24-5DED46A791DD} {5043CECE-E6A7-4867-9CBE-02D27D83747A} = {4AFC9975-2456-4C70-94A4-84073C1CED93} - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A} = {470FBAF9-E1F8-4F3E-8786-198A1C81C8A8} - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB} = {470FBAF9-E1F8-4F3E-8786-198A1C81C8A8} - {AC2857B4-103D-4D6D-9740-926EBF785042} = {470FBAF9-E1F8-4F3E-8786-198A1C81C8A8} - {470FBAF9-E1F8-4F3E-8786-198A1C81C8A8} = {4574FDD0-F61D-4376-98BF-E5A1262C11EC} {11491FD8-F921-48BF-880C-7FEA185B80A1} = {2F305555-C296-497E-AC20-5FA1B237996A} {F40C3397-1834-4530-B2D9-8F8B8456BCDF} = {2F305555-C296-497E-AC20-5FA1B237996A} {A2D583F0-B70C-4462-B1F0-8E81AFB7BA85} = {4AFC9975-2456-4C70-94A4-84073C1CED93} diff --git a/README.md b/README.md index 6e68190911..6b2cc35f66 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ Microsoft PowerToys is a set of utilities for power users to tune and streamline | [New+](https://aka.ms/PowerToysOverview_NewPlus) | [Peek](https://aka.ms/PowerToysOverview_Peek) | [Paste as Plain Text](https://aka.ms/PowerToysOverview_PastePlain) | | [PowerRename](https://aka.ms/PowerToysOverview_PowerRename) | [PowerToys Run](https://aka.ms/PowerToysOverview_PowerToysRun) | [Quick Accent](https://aka.ms/PowerToysOverview_QuickAccent) | | [Registry Preview](https://aka.ms/PowerToysOverview_RegistryPreview) | [Screen Ruler](https://aka.ms/PowerToysOverview_ScreenRuler) | [Shortcut Guide](https://aka.ms/PowerToysOverview_ShortcutGuide) | -| [Text Extractor](https://aka.ms/PowerToysOverview_TextExtractor) | [Video Conference Mute](https://aka.ms/PowerToysOverview_VideoConference) | [Workspaces](https://aka.ms/PowerToysOverview_Workspaces) | +| [Text Extractor](https://aka.ms/PowerToysOverview_TextExtractor) | [Workspaces](https://aka.ms/PowerToysOverview_Workspaces) | ## Installing and running Microsoft PowerToys @@ -226,6 +226,5 @@ The application logs basic diagnostic data (telemetry). For more information on [winget-link]: https://github.com/microsoft/winget-cli#installing-the-client [roadmap]: https://github.com/microsoft/PowerToys/wiki/Roadmap [privacy-link]: http://go.microsoft.com/fwlink/?LinkId=521839 -[vidConfOverview]: https://aka.ms/PowerToysOverview_VideoConference [loc-bug]: https://github.com/microsoft/PowerToys/issues/new?assignees=&labels=&template=translation_issue.md&title= [usingPowerToys-docs-link]: https://aka.ms/powertoys-docs diff --git a/doc/devdocs/akaLinks.md b/doc/devdocs/akaLinks.md index 6b0dcac1d8..eae60c1161 100644 --- a/doc/devdocs/akaLinks.md +++ b/doc/devdocs/akaLinks.md @@ -29,7 +29,6 @@ | PowerToysOverview_PowerRename | https://learn.microsoft.com/windows/powertoys/powerrename | | PowerToysOverview_PowerToysRun | https://learn.microsoft.com/windows/powertoys/run | | PowerToysOverview_ShortcutGuide | https://learn.microsoft.com/windows/powertoys/shortcut-guide | -| PowerToysOverview_VideoConference | https://learn.microsoft.com/windows/powertoys/video-conference-mute | | powerToysPowerLauncherImageSmall | https://github.com/microsoft/PowerToys/wiki/images/overview/PowerLauncher_small.png | | powerToysPowerLauncherSettingImage | https://raw.githubusercontent.com/microsoft/PowerToys/main/doc/images/overview/PowerLauncher_large.png | | powerToysPowerPreviewImageSmall | https://github.com/microsoft/PowerToys/wiki/images/overview/PowerPreview_small.png | @@ -42,6 +41,4 @@ | powerToysRequestFeature | https://github.com/microsoft/PowerToys/issues/new?assignees=&labels=&template=feature_request.md&title= | | powerToysShortcutGuideImageSmall | https://github.com/microsoft/PowerToys/wiki/images/overview/ShortcutGuide_small.png | | powerToysShortcutGuideSettingImage | https://raw.githubusercontent.com/microsoft/PowerToys/main/doc/images/overview/ShortcutGuide_large.png | -| powerToysVideoConferenceImageSmall | https://github.com/microsoft/PowerToys/wiki/images/overview/VideoConference_small.png | -| powerToysVideoConferenceSettingImage | https://github.com/microsoft/PowerToys/wiki/images/overview/VideoConference_large.png | | powertoyswiki | https://github.com/microsoft/PowerToys/wiki | diff --git a/doc/devdocs/readme.md b/doc/devdocs/readme.md index 558cb5aa49..50912c5b3f 100644 --- a/doc/devdocs/readme.md +++ b/doc/devdocs/readme.md @@ -73,7 +73,6 @@ The installer can only be compiled in `Release` mode; steps 1 and 2 must be perf 1. Compile `PowerToys.sln`. Instructions are listed above. 1. Compile `BugReportTool.sln` tool. Path from root: `tools\BugReportTool\BugReportTool.sln` (details listed below) -1. Compile `WebcamReportTool.sln` tool. Path from root: `tools\WebcamReportTool\WebcamReportTool.sln` (details listed below) 1. Compile `StylesReportTool.sln` tool. Path from root: `tools\StylesReportTool\StylesReportTool.sln` (details listed below) 1. Compile `PowerToysSetup.sln` Path from root: `installer\PowerToysSetup.sln` (details listed below) @@ -95,9 +94,6 @@ The installer can only be compiled in `Release` mode; steps 1 and 2 must be perf nuget restore .\tools\BugReportTool\BugReportTool.sln msbuild -p:Platform=x64 -p:Configuration=Release .\tools\BugReportTool\BugReportTool.sln -nuget restore .\tools\WebcamReportTool\WebcamReportTool.sln -msbuild -p:Platform=x64 -p:Configuration=Release .\tools\WebcamReportTool\WebcamReportTool.sln - nuget restore .\tools\StylesReportTool\StylesReportTool.sln msbuild -p:Platform=x64 -p:Configuration=Release .\tools\StylesReportTool\StylesReportTool.sln ``` @@ -109,9 +105,6 @@ If you prefer, you can alternatively build prerequisite projects for the install 1. Open `tools\BugReportTool\BugReportTool.sln` 1. In Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` 1. From the `Build` menu, choose `Build Solution`. -1. Open `tools\WebcamReportTool\WebcamReportTool.sln` -1. In Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` -1. From the `Build` menu, choose `Build Solution`. 1. Open `tools\StylesReportTool\StylesReportTool.sln` 1. In Visual Studio, in the `Solutions Configuration` drop-down menu select `Release` 1. From the `Build` menu, choose `Build Solution`. diff --git a/doc/devdocs/tools/build-tools.md b/doc/devdocs/tools/build-tools.md index dfa4e251b2..b8acaa3273 100644 --- a/doc/devdocs/tools/build-tools.md +++ b/doc/devdocs/tools/build-tools.md @@ -25,7 +25,3 @@ This script is used by the pipeline to move the .resw files to the correct locat ## [versionSetting.ps1](/tools/build/versionSetting.ps1) Sets `version.props` file with the version number. - -## [video_conference_make_cab.ps1](/tools/build/video_conference_make_cab.ps1) - -This script creates a cab file for the Video Conference Mute driver. diff --git a/doc/devdocs/tools/readme.md b/doc/devdocs/tools/readme.md index 1bf19d610b..a2640bda7a 100644 --- a/doc/devdocs/tools/readme.md +++ b/doc/devdocs/tools/readme.md @@ -18,4 +18,3 @@ Following tools are currently available: * [project template](/tools/project_template/README.md) - A Visual Studio project template for a new PowerToys project. * [StylesReportTool](styles-report-tool.md) - A tool to collect information about an open window. * [Verification scripts](verification-scripts.md) - A set of scripts that help verifying the PowerToys installation. -* [WebcamReportTool](webcam-report-tool.md) - A tool to collect information about the connected webcams. diff --git a/doc/devdocs/tools/webcam-report-tool.md b/doc/devdocs/tools/webcam-report-tool.md deleted file mode 100644 index efa6d47da3..0000000000 --- a/doc/devdocs/tools/webcam-report-tool.md +++ /dev/null @@ -1,6 +0,0 @@ -# [WebcamReportTool](/tools/WebcamReportTool/) - -This command line application generates a report about the connected webcams on the desktop called "WebcamReport.txt". The report contains the following information about every webcam: - -* Name -* Supported formats diff --git a/doc/images/overview/Original/VideoConference.png b/doc/images/overview/Original/VideoConference.png deleted file mode 100644 index 3a71531361c37a66ab9ab3eb5a3a7ba5a383381e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 98862 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 diff --git a/doc/images/overview/VideoConference_small.png b/doc/images/overview/VideoConference_small.png deleted file mode 100644 index 8e2030e92d63b161ff5799730bbfe82740ba16d1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22289 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 - diff --git a/installer/PowerToysSetup/PowerToysInstaller.wixproj b/installer/PowerToysSetup/PowerToysInstaller.wixproj index 8771920c3c..7ce39b82cf 100644 --- a/installer/PowerToysSetup/PowerToysInstaller.wixproj +++ b/installer/PowerToysSetup/PowerToysInstaller.wixproj @@ -51,7 +51,6 @@ call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuil call move /Y ..\..\..\Settings.wxs.bk ..\..\..\Settings.wxs call move /Y ..\..\..\ShortcutGuide.wxs.bk ..\..\..\ShortcutGuide.wxs call move /Y ..\..\..\Tools.wxs.bk ..\..\..\Tools.wxs - call move /Y ..\..\..\VideoConference.wxs.bk ..\..\..\VideoConference.wxs call move /Y ..\..\..\WinAppSDK.wxs.bk ..\..\..\WinAppSDK.wxs call move /Y ..\..\..\WinUI3Applications.wxs.bk ..\..\..\WinUI3Applications.wxs call move /Y ..\..\..\Workspaces.wxs.bk ..\..\..\Workspaces.wxs @@ -119,7 +118,6 @@ call powershell.exe -NonInteractive -executionpolicy Unrestricted -File $(MSBuil - diff --git a/installer/PowerToysSetup/Product.wxs b/installer/PowerToysSetup/Product.wxs index 7a3a6ee697..33dc8d0e55 100644 --- a/installer/PowerToysSetup/Product.wxs +++ b/installer/PowerToysSetup/Product.wxs @@ -69,7 +69,6 @@ - @@ -196,6 +195,9 @@ NOT Installed + + NOT Installed + + + - - - - - - @@ -34,7 +28,6 @@ - diff --git a/installer/PowerToysSetup/VideoConference.wxs b/installer/PowerToysSetup/VideoConference.wxs deleted file mode 100644 index 04bdb1e506..0000000000 --- a/installer/PowerToysSetup/VideoConference.wxs +++ /dev/null @@ -1,56 +0,0 @@ - - - - - - - - - - WINDOWSBUILDNUMBER >= 19041 - - - - - - - - - - - - - WINDOWSBUILDNUMBER >= 19041 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/installer/PowerToysSetupCustomActions/CustomAction.cpp b/installer/PowerToysSetupCustomActions/CustomAction.cpp index 8995d2f9b6..d757221acd 100644 --- a/installer/PowerToysSetupCustomActions/CustomAction.cpp +++ b/installer/PowerToysSetupCustomActions/CustomAction.cpp @@ -11,6 +11,7 @@ #include "../../src/common/updating/installer.h" #include "../../src/common/version/version.h" #include "../../src/common/Telemetry/EtwTrace/EtwTrace.h" +#include "../../src/common/utils/clean_video_conference.h" #include #include @@ -328,6 +329,19 @@ LExit: return WcaFinalize(er); } +// We've deprecated Video Conference Mute. This Custom Action cleans up any stray registry entry for the driver dll. +UINT __stdcall CleanVideoConferenceRegistryCA(MSIHANDLE hInstall) +{ + HRESULT hr = S_OK; + UINT er = ERROR_SUCCESS; + hr = WcaInitialize(hInstall, "CleanVideoConferenceRegistry"); + ExitOnFailure(hr, "Failed to initialize"); + clean_video_conference(); +LExit: + er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; + return WcaFinalize(er); +} + UINT __stdcall ApplyModulesRegistryChangeSetsCA(MSIHANDLE hInstall) { HRESULT hr = S_OK; @@ -1026,164 +1040,6 @@ UINT __stdcall DetectPrevInstallPathCA(MSIHANDLE hInstall) return WcaFinalize(er); } -UINT __stdcall CertifyVirtualCameraDriverCA(MSIHANDLE hInstall) -{ -#ifdef CIBuild // On pipeline we are using microsoft certification - WcaInitialize(hInstall, "CertifyVirtualCameraDriverCA"); - return WcaFinalize(ERROR_SUCCESS); -#else - HRESULT hr = S_OK; - UINT er = ERROR_SUCCESS; - LPWSTR certificatePath = nullptr; - HCERTSTORE hCertStore = nullptr; - HANDLE hfile = nullptr; - DWORD size = INVALID_FILE_SIZE; - char* pFileContent = nullptr; - - hr = WcaInitialize(hInstall, "CertifyVirtualCameraDriverCA"); - ExitOnFailure(hr, "Failed to initialize", hr); - - hr = WcaGetProperty(L"CustomActionData", &certificatePath); - ExitOnFailure(hr, "Failed to get install property", hr); - - hCertStore = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, CERT_SYSTEM_STORE_LOCAL_MACHINE, L"AuthRoot"); - if (!hCertStore) - { - hr = GetLastError(); - ExitOnFailure(hr, "Cannot put principal run level: %x", hr); - } - - hfile = CreateFile(certificatePath, GENERIC_READ, FILE_SHARE_READ, nullptr, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, nullptr); - if (hfile == INVALID_HANDLE_VALUE) - { - hr = GetLastError(); - ExitOnFailure(hr, "Certificate file open failed", hr); - } - - size = GetFileSize(hfile, nullptr); - if (size == INVALID_FILE_SIZE) - { - hr = GetLastError(); - ExitOnFailure(hr, "Certificate file size not valid", hr); - } - - pFileContent = static_cast(malloc(size)); - - DWORD sizeread; - if (!ReadFile(hfile, pFileContent, size, &sizeread, nullptr)) - { - hr = GetLastError(); - ExitOnFailure(hr, "Certificate file read failed", hr); - } - - if (!CertAddEncodedCertificateToStore(hCertStore, - X509_ASN_ENCODING, - reinterpret_cast(pFileContent), - size, - CERT_STORE_ADD_ALWAYS, - nullptr)) - { - hr = GetLastError(); - ExitOnFailure(hr, "Adding certificate failed", hr); - } - - free(pFileContent); - -LExit: - ReleaseStr(certificatePath); - if (hCertStore) - { - CertCloseStore(hCertStore, 0); - } - if (hfile) - { - CloseHandle(hfile); - } - - if (!SUCCEEDED(hr)) - { - PMSIHANDLE hRecord = MsiCreateRecord(0); - MsiRecordSetString(hRecord, 0, TEXT("Failed to add certificate to store")); - MsiProcessMessage(hInstall, static_cast(INSTALLMESSAGE_WARNING + MB_OK), hRecord); - } - - er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; - return WcaFinalize(er); -#endif -} - -UINT __stdcall InstallVirtualCameraDriverCA(MSIHANDLE hInstall) -{ - HRESULT hr = S_OK; - UINT er = ERROR_SUCCESS; - LPWSTR driverPath = nullptr; - - hr = WcaInitialize(hInstall, "InstallVirtualCameraDriverCA"); - ExitOnFailure(hr, "Failed to initialize"); - - hr = WcaGetProperty(L"CustomActionData", &driverPath); - ExitOnFailure(hr, "Failed to get install property"); - - BOOL requiresReboot; - DiInstallDriverW(GetConsoleWindow(), driverPath, DIIRFLAG_FORCE_INF, &requiresReboot); - - hr = GetLastError(); - ExitOnFailure(hr, "Failed to install driver"); - -LExit: - - if (!SUCCEEDED(hr)) - { - PMSIHANDLE hRecord = MsiCreateRecord(0); - MsiRecordSetString(hRecord, 0, TEXT("Failed to install virtual camera driver")); - MsiProcessMessage(hInstall, static_cast(INSTALLMESSAGE_WARNING + MB_OK), hRecord); - } - - er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; - return WcaFinalize(er); -} - -UINT __stdcall UninstallVirtualCameraDriverCA(MSIHANDLE hInstall) -{ - HRESULT hr = S_OK; - UINT er = ERROR_SUCCESS; - LPWSTR driverPath = nullptr; - - hr = WcaInitialize(hInstall, "UninstallVirtualCameraDriverCA"); - ExitOnFailure(hr, "Failed to initialize"); - - hr = WcaGetProperty(L"CustomActionData", &driverPath); - ExitOnFailure(hr, "Failed to get uninstall property"); - - BOOL requiresReboot; - DiUninstallDriverW(GetConsoleWindow(), driverPath, 0, &requiresReboot); - - switch (GetLastError()) - { - case ERROR_ACCESS_DENIED: - case ERROR_FILE_NOT_FOUND: - case ERROR_INVALID_FLAGS: - case ERROR_IN_WOW64: - { - hr = GetLastError(); - ExitOnFailure(hr, "Failed to uninstall driver"); - break; - } - } - -LExit: - - if (!SUCCEEDED(hr)) - { - PMSIHANDLE hRecord = MsiCreateRecord(0); - MsiRecordSetString(hRecord, 0, TEXT("Failed to uninstall virtual camera driver")); - MsiProcessMessage(hInstall, static_cast(INSTALLMESSAGE_WARNING + MB_OK), hRecord); - } - - er = SUCCEEDED(hr) ? ERROR_SUCCESS : ERROR_INSTALL_FAILURE; - return WcaFinalize(er); -} - UINT __stdcall UnRegisterContextMenuPackagesCA(MSIHANDLE hInstall) { using namespace winrt::Windows::Foundation; diff --git a/installer/PowerToysSetupCustomActions/CustomAction.def b/installer/PowerToysSetupCustomActions/CustomAction.def index f685a0be1d..d9ed0d0f04 100644 --- a/installer/PowerToysSetupCustomActions/CustomAction.def +++ b/installer/PowerToysSetupCustomActions/CustomAction.def @@ -3,6 +3,7 @@ LIBRARY "PowerToysSetupCustomActions" EXPORTS LaunchPowerToysCA CheckGPOCA + CleanVideoConferenceRegistryCA ApplyModulesRegistryChangeSetsCA DetectPrevInstallPathCA RemoveScheduledTasksCA @@ -15,12 +16,9 @@ EXPORTS TelemetryLogRepairCancelCA TelemetryLogRepairFailCA TerminateProcessesCA - CertifyVirtualCameraDriverCA - InstallVirtualCameraDriverCA InstallEmbeddedMSIXCA InstallDSCModuleCA UnApplyModulesRegistryChangeSetsCA - UninstallVirtualCameraDriverCA UnRegisterContextMenuPackagesCA UninstallEmbeddedMSIXCA UninstallDSCModuleCA diff --git a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj index dee9f63e2b..e2de4a4065 100644 --- a/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj +++ b/installer/PowerToysSetupCustomActions/PowerToysSetupCustomActions.vcxproj @@ -73,7 +73,6 @@ call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\Settings.wxs"" ""$(ProjectDir)..\PowerToysSetup\Settings.wxs.bk"""" call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\ShortcutGuide.wxs"" ""$(ProjectDir)..\PowerToysSetup\ShortcutGuide.wxs.bk"""" call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\Tools.wxs"" ""$(ProjectDir)..\PowerToysSetup\Tools.wxs.bk"""" - call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\VideoConference.wxs"" ""$(ProjectDir)..\PowerToysSetup\VideoConference.wxs.bk"""" call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\WinAppSDK.wxs"" ""$(ProjectDir)..\PowerToysSetup\WinAppSDK.wxs.bk"""" call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\WinUI3Applications.wxs"" ""$(ProjectDir)..\PowerToysSetup\WinUI3Applications.wxs.bk"""" call cmd /C "copy ""$(ProjectDir)..\PowerToysSetup\Workspaces.wxs"" ""$(ProjectDir)..\PowerToysSetup\Workspaces.wxs.bk"""" diff --git a/src/common/Common.UI/SettingsDeepLink.cs b/src/common/Common.UI/SettingsDeepLink.cs index 41bd2c012e..9a9d4c1070 100644 --- a/src/common/Common.UI/SettingsDeepLink.cs +++ b/src/common/Common.UI/SettingsDeepLink.cs @@ -22,7 +22,6 @@ namespace Common.UI PowerRename, FileExplorer, ShortcutGuide, - VideoConference, Hosts, MeasureTool, PowerOCR, @@ -60,8 +59,6 @@ namespace Common.UI return "FileExplorer"; case SettingsWindow.ShortcutGuide: return "ShortcutGuide"; - case SettingsWindow.VideoConference: - return "VideoConference"; case SettingsWindow.Hosts: return "Hosts"; case SettingsWindow.MeasureTool: diff --git a/src/common/GPOWrapper/GPOWrapper.cpp b/src/common/GPOWrapper/GPOWrapper.cpp index a9ecb43818..ae051648ab 100644 --- a/src/common/GPOWrapper/GPOWrapper.cpp +++ b/src/common/GPOWrapper/GPOWrapper.cpp @@ -128,10 +128,6 @@ namespace winrt::PowerToys::GPOWrapper::implementation { return static_cast(powertoys_gpo::getConfiguredAdvancedPasteEnabledValue()); } - GpoRuleConfigured GPOWrapper::GetConfiguredVideoConferenceMuteEnabledValue() - { - return static_cast(powertoys_gpo::getConfiguredVideoConferenceMuteEnabledValue()); - } GpoRuleConfigured GPOWrapper::GetConfiguredMouseWithoutBordersEnabledValue() { return static_cast(powertoys_gpo::getConfiguredMouseWithoutBordersEnabledValue()); diff --git a/src/common/GPOWrapper/GPOWrapper.h b/src/common/GPOWrapper/GPOWrapper.h index 34c1e3646b..0b9a15942d 100644 --- a/src/common/GPOWrapper/GPOWrapper.h +++ b/src/common/GPOWrapper/GPOWrapper.h @@ -39,7 +39,6 @@ namespace winrt::PowerToys::GPOWrapper::implementation static GpoRuleConfigured GetConfiguredShortcutGuideEnabledValue(); static GpoRuleConfigured GetConfiguredTextExtractorEnabledValue(); static GpoRuleConfigured GetConfiguredAdvancedPasteEnabledValue(); - static GpoRuleConfigured GetConfiguredVideoConferenceMuteEnabledValue(); static GpoRuleConfigured GetConfiguredPeekEnabledValue(); static GpoRuleConfigured GetDisableNewUpdateToastValue(); static GpoRuleConfigured GetDisableAutomaticUpdateDownloadValue(); diff --git a/src/common/GPOWrapper/GPOWrapper.idl b/src/common/GPOWrapper/GPOWrapper.idl index af58834a0c..c404741e5d 100644 --- a/src/common/GPOWrapper/GPOWrapper.idl +++ b/src/common/GPOWrapper/GPOWrapper.idl @@ -43,7 +43,6 @@ namespace PowerToys static GpoRuleConfigured GetConfiguredShortcutGuideEnabledValue(); static GpoRuleConfigured GetConfiguredTextExtractorEnabledValue(); static GpoRuleConfigured GetConfiguredAdvancedPasteEnabledValue(); - static GpoRuleConfigured GetConfiguredVideoConferenceMuteEnabledValue(); static GpoRuleConfigured GetConfiguredPeekEnabledValue(); static GpoRuleConfigured GetDisableNewUpdateToastValue(); static GpoRuleConfigured GetDisableAutomaticUpdateDownloadValue(); diff --git a/src/common/interop/CommonManaged.cpp b/src/common/interop/CommonManaged.cpp index 39ae2967b4..d59741fef6 100644 --- a/src/common/interop/CommonManaged.cpp +++ b/src/common/interop/CommonManaged.cpp @@ -2,8 +2,6 @@ #include "CommonManaged.h" #include "CommonManaged.g.cpp" #include -#include "../../modules/videoconference/VideoConferenceShared/MicrophoneDevice.h" -#include "../../modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.h" namespace winrt::PowerToys::Interop::implementation { @@ -11,29 +9,4 @@ namespace winrt::PowerToys::Interop::implementation { return hstring{ get_product_version() }; } - winrt::Windows::Foundation::Collections::IVector CommonManaged::GetAllActiveMicrophoneDeviceNames() - { - auto names = std::vector(); - for (const auto& device : MicrophoneDevice::getAllActive()) - { - names.push_back(device->name().data()); - } - return winrt::multi_threaded_vector(std::move(names)); - } - winrt::Windows::Foundation::Collections::IVector CommonManaged::GetAllVideoCaptureDeviceNames() - { - auto names = std::vector(); - VideoCaptureDeviceList vcdl; - vcdl.EnumerateDevices(); - - for (UINT32 i = 0; i < vcdl.Count(); ++i) - { - auto name = vcdl.GetDeviceName(i).data(); - if (name != L"PowerToys VideoConference Mute") - { - names.push_back(name); - } - } - return winrt::multi_threaded_vector(std::move(names)); - } } diff --git a/src/common/interop/CommonManaged.h b/src/common/interop/CommonManaged.h index 96d6f5d8a5..7196699ae9 100644 --- a/src/common/interop/CommonManaged.h +++ b/src/common/interop/CommonManaged.h @@ -8,8 +8,6 @@ namespace winrt::PowerToys::Interop::implementation CommonManaged() = default; static hstring GetProductVersion(); - static winrt::Windows::Foundation::Collections::IVector GetAllActiveMicrophoneDeviceNames(); - static winrt::Windows::Foundation::Collections::IVector GetAllVideoCaptureDeviceNames(); }; } namespace winrt::PowerToys::Interop::factory_implementation diff --git a/src/common/interop/CommonManaged.idl b/src/common/interop/CommonManaged.idl index 0a523e790a..38e9225bb5 100644 --- a/src/common/interop/CommonManaged.idl +++ b/src/common/interop/CommonManaged.idl @@ -4,8 +4,6 @@ namespace PowerToys { [default_interface] static runtimeclass CommonManaged { static String GetProductVersion(); - static Windows.Foundation.Collections.IVector GetAllActiveMicrophoneDeviceNames(); - static Windows.Foundation.Collections.IVector GetAllVideoCaptureDeviceNames(); } } } \ No newline at end of file diff --git a/src/common/interop/PowerToys.Interop.vcxproj b/src/common/interop/PowerToys.Interop.vcxproj index 88115f9eab..aadd8b2ebb 100644 --- a/src/common/interop/PowerToys.Interop.vcxproj +++ b/src/common/interop/PowerToys.Interop.vcxproj @@ -93,8 +93,6 @@ - - CommonManaged.idl @@ -123,8 +121,6 @@ - - CommonManaged.idl diff --git a/src/common/interop/PowerToys.Interop.vcxproj.filters b/src/common/interop/PowerToys.Interop.vcxproj.filters index 5df4afc368..6fa51a3275 100644 --- a/src/common/interop/PowerToys.Interop.vcxproj.filters +++ b/src/common/interop/PowerToys.Interop.vcxproj.filters @@ -21,12 +21,6 @@ Header Files - - Header Files - - - Header Files - Header Files @@ -65,12 +59,6 @@ Source Files - - Source Files - - - Source Files - Source Files diff --git a/src/common/utils/clean_video_conference.h b/src/common/utils/clean_video_conference.h new file mode 100644 index 0000000000..f90a3ad1ee --- /dev/null +++ b/src/common/utils/clean_video_conference.h @@ -0,0 +1,18 @@ +#pragma once + +// Video Conference Mute was a utility we deprecated. However, this required a manual user disable of the module to remove the camera registration, so we include the disable code here to be able to clean up. +void clean_video_conference() +{ + // 31AD75E9-8C3A-49C8-B9ED-5880D6B4A764 is the CLSID GUID for the 64 video conference mute driver. + // 31AD75E9-8C3A-49C8-B9ED-5880D6B4A732 is the CLSID GUID for the 32 video conference mute driver. + // 860BB310-5D01-11D0-BD3B-00A0C911CE86 is the CLSID GUID for CLSID_VideoInputDeviceCategory. + + // Unregister the 64 bit driver CLSID: + RegDeleteTreeW(HKEY_CLASSES_ROOT, L"CLSID\\{31AD75E9-8C3A-49C8-B9ED-5880D6B4A764}"); + // Unregister the 64 bit driver CLSID from Video Input Devices: + RegDeleteTreeW(HKEY_CLASSES_ROOT, L"CLSID\\{860BB310-5D01-11D0-BD3B-00A0C911CE86}\\Instance\\{31AD75E9-8C3A-49C8-B9ED-5880D6B4A764}"); + // Unregister the 32 bit driver CLSID: + RegDeleteTreeW(HKEY_LOCAL_MACHINE, L"Software\\WOW6432Node\\Classes\\CLSID\\{31AD75E9-8C3A-49C8-B9ED-5880D6B4A732}"); + // Unregister the 32 bit driver CLSID from Video Input Devices: + RegDeleteTreeW(HKEY_LOCAL_MACHINE, L"Software\\WOW6432Node\\Classes\\CLSID\\{860BB310-5D01-11D0-BD3B-00A0C911CE86}\\Instance\\{31AD75E9-8C3A-49C8-B9ED-5880D6B4A732}"); +} diff --git a/src/common/utils/gpo.h b/src/common/utils/gpo.h index 04e03b4767..2e3c681c91 100644 --- a/src/common/utils/gpo.h +++ b/src/common/utils/gpo.h @@ -53,7 +53,6 @@ namespace powertoys_gpo { const std::wstring POLICY_CONFIGURE_ENABLED_SHORTCUT_GUIDE = L"ConfigureEnabledUtilityShortcutGuide"; const std::wstring POLICY_CONFIGURE_ENABLED_TEXT_EXTRACTOR = L"ConfigureEnabledUtilityTextExtractor"; const std::wstring POLICY_CONFIGURE_ENABLED_ADVANCED_PASTE = L"ConfigureEnabledUtilityAdvancedPaste"; - const std::wstring POLICY_CONFIGURE_ENABLED_VIDEO_CONFERENCE_MUTE = L"ConfigureEnabledUtilityVideoConferenceMute"; const std::wstring POLICY_CONFIGURE_ENABLED_REGISTRY_PREVIEW = L"ConfigureEnabledUtilityRegistryPreview"; const std::wstring POLICY_CONFIGURE_ENABLED_MOUSE_WITHOUT_BORDERS = L"ConfigureEnabledUtilityMouseWithoutBorders"; const std::wstring POLICY_CONFIGURE_ENABLED_PEEK = L"ConfigureEnabledUtilityPeek"; @@ -414,11 +413,6 @@ namespace powertoys_gpo { return getUtilityEnabledValue(POLICY_CONFIGURE_ENABLED_WORKSPACES); } - inline gpo_rule_configured_t getConfiguredVideoConferenceMuteEnabledValue() - { - return getUtilityEnabledValue(POLICY_CONFIGURE_ENABLED_VIDEO_CONFERENCE_MUTE); - } - inline gpo_rule_configured_t getConfiguredMouseWithoutBordersEnabledValue() { return getUtilityEnabledValue(POLICY_CONFIGURE_ENABLED_MOUSE_WITHOUT_BORDERS); diff --git a/src/common/version/version.vcxproj b/src/common/version/version.vcxproj index f6ad515137..b045d8f5a5 100644 --- a/src/common/version/version.vcxproj +++ b/src/common/version/version.vcxproj @@ -10,7 +10,7 @@ - + Debug diff --git a/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml b/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml index 5324df75ea..92986e8107 100644 --- a/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml +++ b/src/dsc/Microsoft.PowerToys.Configure/examples/disableAllModules.dsc.yaml @@ -63,8 +63,6 @@ properties: Enabled: false ShortcutGuide: Enabled: false - VideoConference: - Enabled: false MeasureTool: Enabled: false Hosts: diff --git a/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml b/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml index 5fa895ddfd..5ff4dcfe71 100644 --- a/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml +++ b/src/dsc/Microsoft.PowerToys.Configure/examples/enableAllModules.dsc.yaml @@ -63,8 +63,6 @@ properties: Enabled: true ShortcutGuide: Enabled: true - VideoConference: - Enabled: true MeasureTool: Enabled: true Hosts: diff --git a/src/gpo/assets/PowerToys.admx b/src/gpo/assets/PowerToys.admx index 799b1f20f3..c17e6712bf 100644 --- a/src/gpo/assets/PowerToys.admx +++ b/src/gpo/assets/PowerToys.admx @@ -1,11 +1,11 @@ - + - + @@ -23,6 +23,7 @@ + @@ -45,6 +46,9 @@ + + + @@ -441,8 +445,8 @@ - - + + diff --git a/src/gpo/assets/en-US/PowerToys.adml b/src/gpo/assets/en-US/PowerToys.adml index 7a8f037eee..adcc902811 100644 --- a/src/gpo/assets/en-US/PowerToys.adml +++ b/src/gpo/assets/en-US/PowerToys.adml @@ -1,7 +1,7 @@ - + PowerToys PowerToys @@ -13,6 +13,7 @@ Mouse Without Borders General settings New+ + Deprecated policies PowerToys version 0.64.0 or later PowerToys version 0.68.0 or later @@ -29,6 +30,7 @@ PowerToys version 0.84.0 or later PowerToys version 0.85.0 or later PowerToys version 0.86.0 or later + From PowerToys version 0.64.0 until PowerToys version 0.87.1 This policy configures the enabled state for all PowerToys utilities. diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Dark.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Dark.png deleted file mode 100644 index 08446a20784f5ea25073748d15d5fa2a4cfc9e00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13104 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 - - - - - - - - - - - - - Camera not in use - - - Microphone off - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.png deleted file mode 100644 index 285ea495b86078735bd6e8a8ac531ddd22912f40..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12931 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 a0YP5=e>%aHp3Vc>fMlhV-oqqJ{`zlUYgK6g diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.svg deleted file mode 100644 index a30e909ff1..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-NotInUse Light.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera not in use - - - Microphone off - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Dark.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Dark.png deleted file mode 100644 index 32d7559e73a1fb996776ead24f6ff9633bfd0bfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11546 zcmeHtWmr_-*Y?pf^>I{fPxZIk^_T)bkEQ+ z)U(Im@BLrzhv)tJUeAYTt_#k&&dfPy@3q%n>t6T0g4I;y2=S@$ArJ_mg1oc_1aj>r zIIp;Q9sHO2=06Ay^ycy!$`FXxBM9Ve00e>sm)@>GAZ}a`$l6N?L^ufop>R%XQWphZ zTsKpclLkldIhI1e!2!=%Uhg#oa_Q~gKe~mU2M`F`k%IIytv9I6Dc?BF{q)Z5fvqqt z)1c=%dh2AXR7IWc+?`HSLkI2w6Kgf2DP=Dq!RoS65vBCG;gha3-0M>L?;nOd3{dBi z-%N8V^$!tdHhQtHDN$GaUPG{y_)QH>Y1eLV1-#e)bu2-wMa*x;!!zMd@f}4c^x?VF zg5R2Fu(lI zg{X&%i;D?J(P#hX2b9+&|M}+Yx5u~t{SlGuyW9UpkNm%FDbS0?8S7>F&W=mZI&LkbfSDy|x3B)sH6mfP$XhMtw5RIuvvm`< ztv}zw>cqFd-*sDz*C{G0dVZH#W#r?Xhu6slzWLwSUlza6i-cke#!3zHiN#NUp`U>H zJ+_T~q&!3@`1=#x>7N^R_V(2x_kk0|s0+BQjePdKhtEBc!e<-PHe2D2nJzuvU0(nC z?uxCWxFd?MRKNDQd1pkQf)A$kqQ%b6uEzJo9f1H_o!;@U^L|Jo&TvQBqH4f9l#)K_ znD}bbM#|CoY`vQ@1v`K=_vp0zPY@*>{W^0vPdRn(5Por(BH)-JnH3cwf^LYb&*ZTT zp}u$T^^5y)O&KbN^-k$3LW`sb#4QNq(?XidPnPB%&lIqy%i`rHXoM@VFVb;f1cE1~5VFx4qEDXePw-g=D zz)cVyn7SI@*;^)RPw)4yD!&BokpK9Ip##hYRblGi|8$-}(VLHY^o!^2-gYP5A!0KC z@9y44^?+Shl9I{ zhK|p2kz-A6>wAlw@QI-o$4P;{bP=7CgUxCY5ZvBotGh~tO`=c>+i&)Q#81BspI>IH;B5H zcUO;>GwW+IeGev@F3wLhX^p_Dzm>jbLLZj{yg;qmdSEPqMudIy;wbW>fbgDx4KR#C z{bb|od}Hs;+G!-F<)kcvR;L`NAOd5czkr?}nfE30 zGH1!Z=@(jF$?!%G7N~#TAi4vVcZF2>om$KRda4*aX=TDXv$iJlRRa;gzv@81I=HDk3kZQkE!&=yM^A3ob+hzj$ z2{`>O81Px*#hX0cgu#b@H@@B2Ic%sva)t>UkG*fe% z1xzu3QIm#ev)z7fB-6%L{zaqp;ta#FnV;#`)Hdrp^k5b@@l>a#ZuBo;|0pK0(24!@ z*ZMIn2esvem6g#C7=YPALaHPlyOH5>ww}5;PBo1V`C(V{*T3DM8&P0RkE>9&w$7h2 z1-7IQJ;x$jf6i~)9HOTZ+=uzxI%zy?#w$$SgFs49+xiKd%1*EGb7^TGI%$Z6Pt)VC@3Y_oo5tVFMRZz&bFN3?RdbxJ zovu=ZD~_vuuQ0DjpNuxqFu@}`L^jumgV2sZhO}q!;BERGg*RKBk6Mh1@G7I&(I0=| z{Si%$%~V0y7(deR^TB~TLP|Q2pk2#SIlhREb-|@^ZhG@v&|N3A&cRljk)&G0kUqal z2V$YNh?rJ6<7s}Fq(P3$BbwXU~EU0$bXGr zNH17Zs+X*M=G&O^@DkJ6fv_ezfK!kxjKAC5_EwMm5m_bTGh`ugRmwKhXZ;OZZTy!Xl(&wd+H zZX7@~w2h3?$Cle?D}b4W6`%dubT4jhHWEMIj&$2w84Pd?B%sP(9nQBu+M3miY|YJO zns*!!!H9~1wbhF(R7?J5#cx?0GP_g2qQQL>&HA7B~L6B%ewZmT4uS!N-n?k^Ny- zsk$`HO^_VVUsT$U21Bj48!amF8R$*sWl|77?p7rsFJIr-(9+XOeowY2qCfCB2yd=rXTErPe+)O;*UKtkv?R%5GB!nzBzSJp8|4+v zRWDZPl0qq0d=M5lLj{f@fa&oP6Iqh`> zIj3>S>j5z&y6h)gJ2LIdQ%b@f#P@PPByI2y($EhJkpT;W1j+pS6W*8aRL~sbzddE? z4%QVG7Ort!)et+~YEL-Wp6_J4Ph|fyjs@&+g^)n9I`*Rt_4wo^k0k8`5wk&O-NI4^ zn&=rW3*B?`cO+lA!xV}>+T+6%%zw0e14Dd~XzW$!2PXH(7c(eFS8Ms~ZemaF4ca#n z#A16<^CA8`K1HhT?SdQet5DfjT*mBqA7?n)_c|7nB%&XfT#AxoI=pHc84*E*8xFSL zqs82olamt(60_@sWuk3o1dV&psxxAA{B}bAz^0jMscLw%S_lP)6tri--;|#ZZ3UHt zT;YAxsjPf^EJ2>O{sz}$_)$CE(DYKxu*z^gbiZ&K3C&d9+}y;!?vI!0XlsiL_Y3=8 zydjv9>i*}))tdP#qjNt(_eab9_z!7xq6m)HV%Y_dGny)eA7vIiQc+X)?_5z<8^O7v zdN=vaNXw1!O8r*9<|l{^p60zFMfae2hiKVR8L>=8SlL^<-l)@P(mHS;l->$WuzrMxpeLoWEUTWn=3xm?29$@==K)O%NQOds&_&>7)s}y3XH?Hosc+ z!RML;kr0UV3ILTz!lIo)ZU=*V$z59~O}4^YSd;%VPMn0wS#g*rOIFJ*{0<9-GRc|;=IBSuSo$W;SSd?<)&Y_BcA%o8E?^A;|S_pmWk#TBue0XQhGzDI4 zfE*cNeL+^GcJ#)^%J@mBEZNj(c3_9vnp6ya_JzaK7U)TVb7P4|lJ{Zk=5B(@o5ppx zxrPk(p5-fV$noJ%wsM<;jS2jqc4`rK2iVE!@op{r!f(p&WYaVFb9S~Q((pCmhi3}G zpPw}aG*6@)1LPXv!`!YAct$koiDT#;bv>l|{H0S}K0le^^~Q$ z->JdDtSqS@edsR0SUv0eYd7&irOn!4EeQzL4ZlNB1;SFVxKA@;J{i&l_ED;jxD%b9Ig*=S}Tbw`OJ%|71 zIy&^-BWiJ3xJ6Z~&3G|Wvgo@g|8us2`B;WwopO{!Nb5}8fI-4S(M8`UGv(yoXTQ#1 zG2C67H$sRj)IB{L7u~WJ{kK&Y2(7ed3N`cX+5-uxd9A{7&nQ}tKA;=sBhr4HG!FQx z+@g3gB12)6!ypx-dZh)#DSkda#uAiaRWT)V_vBDdC(neXAvC3`pv~Umbkg<%8N@++YUA-7x%qtVKY$06A%SzooCz9Hg-WJ z@M}I&yeyQn<*Dr}=jHzN6mfVm6V}Q4?^QgV5u%DC=7D^yIme4y^5fIaDLGdwPpt5U%FM`jT+=)3YG<6A>#I?>O2_yx+nPE9C$?nI^0NFpqeX@fbpU4^Ks`I z5))6RH@T#ieP0LQeJs|i)Ua`ANWg2)rc|%G;~QJo1UtEgR0GUkaWr0bD3ZEGUr)A4 zV8MwpB);&ac((+fA#=IyPp+`(3#H-WrltxWT4!jZ#y4HzVoWl=0F%O(Z1oS#dA-m| zsz8=ugM837xut?&+4iE)nMm88sSeCL1p-sgHDk`0Hg_3M))i`Q6#x^Xw&IV4=x5No>W=()V%!mJ`H_RT0b2#gF&{Q z_Ouo>HtK<-?(PvpNT958BnMBN{Z^D4t))|2Iw`?fWAznhdRCr>ka=COS;C;s038XDyeO`X||g#us5?TNIv2niyN)m__n>9@=ni4UnAk5XcRcEa^z(hfp9uIX#ISr=cFk1B8y|+Dg)r6~q7(+R!4}Q8L7FClPgz|J58Cym4E^+ofP^&=@|MvSZ zcX)R_<^FH3b&`k~vMz@Pw;5on*R2NA&Zn}p+R4{Ya8F@qyG~|Qn%ue)Rd>GuW}Av< zeJ%p_Ra}%OHt{_2Nc`BJ{k(xR0r~M{{_|lg`uNRtgxK5nyQjMY>qW(7Lm-;6Z}uc` z3|l4|CG4Ly@AixAoSg9}YtA~4XMOnQ)WOKao_TvZCijOzMCp2m6S8%{2`(Qk&;IIC zuAU=Pg*w$?=N>viIb(M6=$TFJw%lfnB%_;gG9Ge0$?Q(+Zv_|j0q&Uh zKFe2Dm#W2l<1xFjtT>DIR^luQYIL{VK0yPNY#3!00^Ovjt*s3#Dq8uXR=1Oi8ER=Y zrppZNM~dgPmJ7Y7N*=Lw?wr8|9@a-Q~tK;2OMrVlw^Tm-T_McjRc#}kM z#l7*#K(UL<=+d7Ne@(7)nkoY2+>iz%I~&_Djtc=br-db*_rZp`k&zM1w4%9r3f*3p z$t`r)t{nUELsO_qrE8sDb^u?VnZ{3Kn@u`P{e|vB^h4T)H|-JY!i$qQ&>}RQwQnx$?z9mB){P|XOEdzXlsM@Y!0Kz+-he<)V2IF zB6*gq4Kb{mRNK_6^C`OT~!s&=;-KbjN%ijy~EVJLbb;^?Lowoz6IAfnnbKTZk~NC ztZ>F=M_)S^2A`)7K(j~IF%Ln}u(zfhrHdMxd}$p2pELqF={ z?(E{{2L}BVa;?qD9$7XD9N;Aj2@#F3miWc-z&@Y|5Hp(sjwlO{6{bhqL@x)nuB{s( zM9W+#bdutBcx#08kx8h#Aqq=dc(CA{=GFj2ThTAZhltL&2I9m=)}C}{YZw)mJNqV9 zofH=*gluQ+p|&2sO*qIVgc~$g;Si=-fOB*Jp&=Q)HD&-C^=LgYLbS7aB6bjx3f=PT z5loHOQE|jMX#?cKU^fwQ0iqILK~pmp3=u~+C`bjmj;aI^-peCndtvka;~fB5RmPV9 zouV!$7gW}I?iC*&KjC|miGkcs?ddP;%P(~#_@RYuO|Gxb9}OxeJ!Fpj(M>SlV-uiq zn7*#sQjB<$*e9htF6UvE?BB~>C*r4i_Bijnr(;{j!}_+y;oZ>2B=#ct6FP}iuf0Jz zw?2O43NA}mm>Lzj3@Fe4TSB-8=~lVK-_7ZWGNtC>Q_$9qWzsIlmW(mD>)lHSi=*oo*7f zGJe-LASK+3C0N*9eWuW1fzTv5nd`9~(xHFed~tNvu>qBa$gD-n(c%gx*Y(nReJAR2 z-Ac(IBAOvkgqwPN?1}@x)udR$m{yF9;6nznu0O|@T~G^u#Y^(9pldzugW(EJH&@ra zy8RL>K@j0`CLMk^sEfF7REX>iMLCenI3@QUMr%_Mc1yqwJyQd2L*DM4uIaQ6?ITTK z$)CLd1EpVU7vHiS4%8YMh60qzs31QEr!o!LH-3#M4|&K zIz)kow0kOCw>^L9(ExW~u`C%OW~gimQM(u}n4??5mY}P|&0C-w%RDN^a2GdDvTJRZ zM0dI#u5E18C}|mi$`7!qgP-N>M~gsm(rq#;wF|z^ewR4tp5%deGqPE~Wb+jy`Quo( zE5+9fIf$CHfW!Ew+4i7yYw;63*d&^5x_ux z2Cn*;6kq-E#%S{cry0AbV*Pm8$8wt8lslt0V#qVIP0JJbWJ!Cv{cdS}TfBlB;ytM_ z%?i(5tI?5>m91I86addIs;e7AZ#~ylV(57~U$H@H^t)EyVfLq`j~={fASow+CBxBp zJGTH^{xzcf*F0MQ@MB>d@88rUtT+jrr^c#}I^7%Hh?j|BApu2j>*&$;e67O-kIaKR zo}wAksr~)rn)Zrq^yb<+)QuDA>V<0oYnobac?|Wfd!eepvq-VW3?`TUTqV7!If6nJ z6_>XNXUR8Mbd%s>FUAA0v}9FVUq4CXw;gh1Nhx~>_mgqB$#Bq7){ua&%(H<`y8k^f zaxR@)2;J|j<-RN}GYX&hb#~Pu%h~Ya%454MHF@AG^)=zNV*215@Xm>Mp);T|v@dUd zVNmA~&6w^wqyUHnQhWrH@fAiLH%pZ=O<7B~wqaY-a*^^|Gh}g>dv4&Loko>IoG;@C z*uL56X6A>V`+$x3Yse3frM44QmJ0Qr8j>yHeS~{yKlEfHV4%Lf-hMD! z#%rxG-)r)GmhSx7x0h;>Vh2er`=zk`vY3shfS+Izm8Mh+Pd+nZDwDJy=psdsdO_8; zmVSf>jMj+5* z&FK00wo8-`>z)t2aaKAVE+0v}ioT!R-5Mw_MNmk<3$h`4tTS#Ut9~ zP!CWf5%xa^r#4G|EEg(g5FB=H6$(I2@L=8OD5q-KcSqQliuRWn;W9&TcUqIIPMu$8 z#GkZEbt@m3RyKj^&lm(tq@Hzp{MNDm4dSA_JXzS6ZP_+&%{-;S=ELdYnbRdf9_3-Q zR8O&P!L!+b7m+FNm*`;~)I9#&`-lq1cZ8LF&5{E*=170zyjBhSyh(!6zDq^VzbQ9=0+4Q$zIKco?pw*Q^XS_qhoxP=Ema0y8G={y~d;GIV1r@4eA za2Vv>Re5Uq>x5R&DeXzapZ7T!qgOx3uoDA*2{rQLg0!U37Oxk&KIbicQZoP3M>vd3 zFL*(4I;-?u(oTLSZvJa*Llxa^fPI*%V+JJ}B~1d-gPuJomlK z&CWzDrv6aZ_Zh!j3Tf8?rs1#8A&!?)Ye5;UI0=|FpkG~APUc~n-33Tz=h#QT;^jMI z-+gUFJ14=N)|k|5`9=1p6X_o6pvT@sn0+jtu zRLsWUV)5kY)cAwgs}K5#a>{oGn3sRKgiW=Ye%8>g9o<AqbewfgP+KQD z=OYQc^mz=7Qa0D_dee&^`lBR-y5;xE-ahDy)uw2djibI~@@;lam782M&Y)5Bs&6 zq^GC5dr(|wBafLB(W?w#Ab8RUj5RK{lhb-+_{1~i!E^pE706OoJC7%ca%GPqFSEez zBp{96;zcW;C5qoU?i1E#Z0yN67wUZ%gMmXP;v6DcCHeeL-{6F$GjhD#G8P+vT!qqs zUWrSbfPS{}7#9d;SrEuwVw91zoYyDQEMO>+XmjiMEP+3BFI;w!HQ3HHYw3!N3l7G| zRbIkM=EF4HpX^q*qZiqe z5jy9>Lve^4wYc9G9BS!~Wv1JG4V2H}G@;jfIJkm6!@yx+3ahLnUh7q{_A>2mJ1M^S z+;>`gn_OEP*RgX>6r-w#Dr-K_@7W?Mw7)hB^cpr& z{8d#rHWoEGd7~L46+~nU7%}V*PQNS=uvdV94&UGD;p~~;E&#&d&IB&H6qT3f%j>c} z@M}~qUmNNz0*=eC!13uQd$8;(icaBSgLC?q)s2Th7dT)`HyVFna%P>VD}AnXaTMat zRGSywKJ)7D6tR2x;-&lR$aOF*nyqTiFI(@QH1BBu1y}Abe006{ofOY9!QL&{eepg3 z3gU559^WOMl3B<-yj<#IzO<0qK-KtgSxy3v6?DfGS-uBs&x@?rjfPmj_*?4TUI4fn z`7@r)G1L~wAfSvH1IdbgGg5TtqaRQbta2rSB~82bw2O+G^vTMO8V|BV0zClfJZJdi z_*S`fL_$b_DaC&n^2+|jVPam&>XPdP6*__9*=5JtO-tv&7=PD8b?2&a_=lfdO4?&u zg-zKHx__k=WDowO+h2%83|~4UCJp)91|r#Wqqw+ulZe3)kQGf^ZMQfaVXbF%R{d#( zK-FW*#XJU#!QSdHj-MO%eOkw(l*wBBh;Ck=Y17VjFkwuMTJQnjl^J)(Wj=?X?bM~r zg=e%+@j2-pXX9Y`C;1=Ca2cEwkHEATEN8;~FzcW-fc5rGT#~5!Uj1g<%;2ep%j92xww_PpWM1zoC<&=}q(N1IMSHZ`+rpRAJzTq)5_1e0K?hLR2SD={ z0Oj)Lb${$uJF&M(Vto86K-43EOG|P7+UN=ZQE_Eu<;>hC#&r1kF^-_&_c?MFK@b2T zTxbLoTOYhXt3a%SS4TbkSF@w_J2F)~`5t_?79LQEi>oKi~Y_gYXGHGIT)HnkdcE z48YbI1+E5AnQza~Id0>Ceu6yEIUt6R0@fqajFAfSc9{O6=TvV1Ki|#VB$An|hb2yK zj@3C%?t%Pcx73@Aou|97IqpTap1T1)HSZ;U3K(8j3#fq4wt~c!bR8CO(if;+-R6Rs zQ8W)gCs;!aD`=4bbkkq;^>}9y`^TSnr{zL$#zzxr>|Oe#<;bjgyW?K-CZ_o?1LtVq zYTwQ==xbmBdmktS)&Cj^2x(2&wc>rCMeCzLwc%Q7(h4o#wF1op-`NToI<{pa?ib>+ zBCaW*UwEBeIf?7pd}rhUN;Dvdm~IS+<2BX;w439VQaCOD;&k8wM=_r{X&M`sIX^97 z(ah6DWx~%rjr@)mQT4FQsj2IXKW>{t9vcyG_h;gY9vsJDX_=dQ2Am+ibG~x%x*(Wh z25`KbTLG(BMC*x&<4nuckQJru*ded`hVB&n;tV@S(Q0EGDf>A^5SD@K0YM-x%S(Vx zw&xVr+D>tu7U;%hTHpD5GZi%eQud^XdDlTtx1|2A3sYInGCeyv9Ar&C540gp^h?>Lz$l(VvuAy zhFLTs?z$*dv3;#@I`L`r7I^j*HG1~jH;C^4iq|nN1RHn_C_%{FMB}1#5f2m%Ik - - - - - - - - - - - - - Camera off - - - Microphone off - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.png deleted file mode 100644 index 7f0477ff8984cae4a39a3beebc574400f89e0bec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11488 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ðIdE|FMn@+r zoW+fA%LfD)KRw@q_E+WN%hwb~8t9(liMcNQN6BG&$;rnDy-{~)0&tU`Yg=SfM{7kI zTKr~V=FUZd9P`AN7g5z8eMw%C@LzaJO%Tle=S?f?zAy5&j*fBcgtGiNE&xZ*B;#-7 zy4W2)_H!LskejPWEpu7|*0~e*=Jkt$!sr4_>pwplyuE7sso)W!cYRtNSj`sN+RdCF zv>a(MWVjx8?<=Ia*LcQt%Z87&E;m0QPWU7L=gZ+>nD0ux8)KSZa+FN%fckw)v(j9t z^#I7*g8claJbFcg^z}#b1RK zWusn8kC3-BPPF_Q{Q69518kZHxYNjDNXe^O=oN1%X6c=_JJ{mQnpG$-9OL^iP26!x zijqM{(V-HJR`gsMyoUwlDR}D z)BQftPntvXU})s<$j@chk3z@OWAChS``6c7lQv;|YG#QCa?%6sj$}Le_K2Je`d z!JGqAX&DaHG5d@|nOCPme#dTSYgRG?uSv+=z}!kHxZiP@y}OjmQqKjgx`ia=vSh_r zi*qzpF)!5SIc|y%GWL+plBP&5hJeMQ15gOR_Bp^D^#S0TpO?3cah;r+Dtb#!zcTvW zyk;@g$E*T3OJAS+KG>*-l)`1} zuXc&@_3PrLeJcF-GFkF+b92#!cEacw9=)GfOG0IEyi(9bRmb0))O=W`vv8tV@HyBb zU9{nw>f=k0hb|knyJ{d(H}oj5!NVrWHlU3seUC}y&8QRDO~yO8}kSI(j1{c zatLHh04%lNA$nSv_HqP^Oc8n$W5|a&GMhxi^1+J$qU%u)BLH_HpM2D)%Y{b28{RZ7 zzP%RHw7hCwm2ZrUQ!Wa=2=WV@?CrOYZ@*=`Dt`(^`Fz`Q_J{n?p%B zkblm#M@LD7z1iR2mvEVTw}IY-p=9qHRgmdUtWwfYqgQOZ0wDN3+wa+}7qS`&^$FFf zB+)CW{uol&)(>JVqV*%w0Kk{?gzbixvXdMh)YgODCUd?WaaRdo$OH3naKb9*XJ
%D{nN0CdEKMipNnq0ZHwpHez2b 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 BQeyxB diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.svg deleted file mode 100644 index 25eecdd72f..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-Off Light.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera off - - - Microphone off - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.png deleted file mode 100644 index ac33d985c89d570a400abf579264ff21a0262cca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5664 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 b4Q03nLh&CGYW|s%2d?U4u;>z$WB9)T2z+bK diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.svg deleted file mode 100644 index ea31e3d78d..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Dark.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera on - - Microphone off - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.png deleted file mode 100644 index a43b3cf364b2def9ecad99c1351cb6ddee759cfe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5678 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 N)#2K(k5EMTe*k6bX?g$v diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.svg deleted file mode 100644 index e3c0352bcc..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/Off-On Light.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera on - - Microphone off - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Dark.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Dark.png deleted file mode 100644 index ff34ff3eb5cd58b11ae59659e5aca4b41121ac4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6016 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 - - - - - - - - - - - - - Camera not in use - - Microphone on - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.png deleted file mode 100644 index b4e5edaea5cb02f6e0b50386a9768e275389db29..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6321 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 diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.svg deleted file mode 100644 index d9d340c034..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-NotInUse Light.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera not in use - - Microphone on - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.png deleted file mode 100644 index 8492439759f691898f6c098431c84f9e317965d0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5808 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 diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.svg deleted file mode 100644 index 67080eabdd..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Dark.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera off - - Microphone on - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Light.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-Off Light.png deleted file mode 100644 index b011e944bb27d7f43deada6c475d81bd17998da8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10232 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 - - - - - - - - - - - - - Camera off - - Microphone on - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.png deleted file mode 100644 index 6f1955d2d2ea98d7b1d2c8f48d485b0713f2c6fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4975 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 bQc%@YQv8?5yOQ|_KjXZBG|?~Cy-NHqs-GnS diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.svg deleted file mode 100644 index e539e785a6..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Dark.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera on - - Microphone on - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.png b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.png deleted file mode 100644 index b9fb04c6a6e3dd4311bea4bf3b4db0fc3a4fc653..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4976 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 Z)YH`YNs{|;Ul+iDE+8#UUz%VD{{ho^266xZ diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.svg b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.svg deleted file mode 100644 index ff4a5c2e31..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/On-On Light.svg +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - Camera on - - Microphone on - - - diff --git a/src/modules/videoconference/VideoConferenceModule/Assets/VCM/black.bmp b/src/modules/videoconference/VideoConferenceModule/Assets/VCM/black.bmp deleted file mode 100644 index 18d40779cedd9cf94146441fb2f6aeb19c617d9d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 822 lcmZ?rHDhJ~12Z700mK4O%*Y@C7H5FULpY=4Xb6mk003!i0b>9F diff --git a/src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.cpp b/src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.cpp deleted file mode 100644 index 1252907184..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "pch.h" - -#include "AudioDeviceNotificationClient.h" - -AudioDeviceNotificationClient::AudioDeviceNotificationClient() -{ - (void)CoCreateInstance(__uuidof(MMDeviceEnumerator), nullptr, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&_deviceEnumerator)); - if (!_deviceEnumerator) - { - return; - } - - if (FAILED(_deviceEnumerator->RegisterEndpointNotificationCallback(this))) - { - _deviceEnumerator->Release(); - _deviceEnumerator = nullptr; - } -} - -AudioDeviceNotificationClient::~AudioDeviceNotificationClient() -{ - if (!_deviceEnumerator) - { - return; - } - - _deviceEnumerator->UnregisterEndpointNotificationCallback(this); - _deviceEnumerator->Release(); -} - -ULONG AudioDeviceNotificationClient::AddRef() -{ - return 1; -} - -ULONG AudioDeviceNotificationClient::Release() -{ - return 1; -} - -HRESULT AudioDeviceNotificationClient::QueryInterface(REFIID, void**) -{ - return S_OK; -} - -HRESULT AudioDeviceNotificationClient::OnPropertyValueChanged(LPCWSTR, const PROPERTYKEY) -{ - _deviceConfigurationChanged = true; - return S_OK; -} - -HRESULT AudioDeviceNotificationClient::OnDeviceAdded(LPCWSTR) -{ - _deviceConfigurationChanged = true; - return S_OK; -} - -HRESULT AudioDeviceNotificationClient::OnDeviceRemoved(LPCWSTR) -{ - _deviceConfigurationChanged = true; - return S_OK; -} - -HRESULT AudioDeviceNotificationClient::OnDeviceStateChanged(LPCWSTR, DWORD) -{ - _deviceConfigurationChanged = true; - return S_OK; -} - -HRESULT AudioDeviceNotificationClient::OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR) -{ - if (role == eConsole && (flow == eCapture || flow == eAll)) - { - _deviceConfigurationChanged = true; - } - - return S_OK; -} diff --git a/src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.h b/src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.h deleted file mode 100644 index 3fe3f5fd1d..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/AudioDeviceNotificationClient.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -#include - -struct AudioDeviceNotificationClient : IMMNotificationClient -{ - AudioDeviceNotificationClient(); - ~AudioDeviceNotificationClient(); - - bool PullPendingNotifications() - { - const bool result = _deviceConfigurationChanged; - _deviceConfigurationChanged = false; - return result; - } - -private: - ULONG AddRef() override; - ULONG Release() override; - HRESULT QueryInterface(REFIID, void**) override; - HRESULT OnPropertyValueChanged(LPCWSTR, const PROPERTYKEY) override; - HRESULT OnDeviceAdded(LPCWSTR) override; - HRESULT OnDeviceRemoved(LPCWSTR) override; - HRESULT OnDeviceStateChanged(LPCWSTR, DWORD) override; - HRESULT OnDefaultDeviceChanged(EDataFlow flow, ERole role, LPCWSTR) override; - - IMMDeviceEnumerator* _deviceEnumerator = nullptr; - - bool _deviceConfigurationChanged = false; -}; diff --git a/src/modules/videoconference/VideoConferenceModule/README.md b/src/modules/videoconference/VideoConferenceModule/README.md deleted file mode 100644 index d53920685a..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/README.md +++ /dev/null @@ -1,14 +0,0 @@ -# Video Conference Mute - -# Introduction -The Video Conference Mute module allows muting microphone and/or web camera video stream during video calls or other activity. - -# Usage -If you'd like to mute your web camera, please select "PowerToys VideoConference Mute" device in your web camera-using app, then restart it. - -During a video call, you can use default shortcuts to mute microphone, web camera or both. You'll see a toolbar indicating corresponding mute statuses. - -# Options -You can tweak the toolbar position on the screen as well as set web camera overlay image during muting. - -# Backlog diff --git a/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp b/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp deleted file mode 100644 index 0dabd58d9c..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Toolbar.cpp +++ /dev/null @@ -1,390 +0,0 @@ -#include "pch.h" -#include "Toolbar.h" - -#include - -#include -#include - -#include "Logging.h" -#include "VideoConferenceModule.h" - -Toolbar* toolbar = nullptr; - -const int REFRESH_RATE = 100; -const int OVERLAY_SHOW_TIME = 500; -const int BORDER_OFFSET = 12; -const int TOP_RIGHT_BORDER_OFFSET = 40; -std::wstring cached_position = L""; - -Toolbar::Toolbar() -{ - toolbar = this; - darkImages.camOnMicOn = Gdiplus::Image::FromFile(L"Assets/VCM/On-On Dark.png"); - darkImages.camOffMicOn = Gdiplus::Image::FromFile(L"Assets/VCM/On-Off Dark.png"); - darkImages.camOnMicOff = Gdiplus::Image::FromFile(L"Assets/VCM/Off-On Dark.png"); - darkImages.camOffMicOff = Gdiplus::Image::FromFile(L"Assets/VCM/Off-Off Dark.png"); - darkImages.camUnusedMicOn = Gdiplus::Image::FromFile(L"Assets/VCM/On-NotInUse Dark.png"); - darkImages.camUnusedMicOff = Gdiplus::Image::FromFile(L"Assets/VCM/Off-NotInUse Dark.png"); - - lightImages.camOnMicOn = Gdiplus::Image::FromFile(L"Assets/VCM/On-On Light.png"); - lightImages.camOffMicOn = Gdiplus::Image::FromFile(L"Assets/VCM/On-Off Light.png"); - lightImages.camOnMicOff = Gdiplus::Image::FromFile(L"Assets/VCM/Off-On Light.png"); - lightImages.camOffMicOff = Gdiplus::Image::FromFile(L"Assets/VCM/Off-Off Light.png"); - lightImages.camUnusedMicOn = Gdiplus::Image::FromFile(L"Assets/VCM/On-NotInUse Light.png"); - lightImages.camUnusedMicOff = Gdiplus::Image::FromFile(L"Assets/VCM/Off-NotInUse Light.png"); -} - -void Toolbar::scheduleModuleSettingsUpdate() -{ - moduleSettingsUpdateScheduled = true; -} - -void Toolbar::scheduleGeneralSettingsUpdate() -{ - generalSettingsUpdateScheduled = true; -} - -inline POINT calculateToolbarPositioning(Box const& screenSize, std::wstring& position, const int desiredWidth, const int desiredHeight) -{ - POINT p; - p.x = p.y = 0; - - if (position == L"Top left corner") - { - p.x = screenSize.left() + BORDER_OFFSET; - p.y = screenSize.top() + BORDER_OFFSET; - } - else if (position == L"Top center") - { - p.x = screenSize.middle().x - desiredWidth / 2; - p.y = screenSize.top() + BORDER_OFFSET; - } - else if (position == L"Bottom left corner") - { - p.x = screenSize.left() + BORDER_OFFSET; - p.y = screenSize.bottom() - desiredHeight - BORDER_OFFSET; - } - else if (position == L"Bottom center") - { - p.x = screenSize.middle().x - desiredWidth / 2; - p.y = screenSize.bottom() - desiredHeight - BORDER_OFFSET; - } - else if (position == L"Bottom right corner") - { - p.x = screenSize.right() - desiredWidth - BORDER_OFFSET; - p.y = screenSize.bottom() - desiredHeight - BORDER_OFFSET; - } - else //"Top right corner" or non-present - { - p.x = screenSize.right() - desiredWidth - BORDER_OFFSET; - p.y = screenSize.top() + TOP_RIGHT_BORDER_OFFSET; - } - return p; -} - -LRESULT Toolbar::WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam) -{ - switch (msg) - { - case WM_DESTROY: - return 0; - case WM_LBUTTONDOWN: - { - int x = GET_X_LPARAM(lparam); - int y = GET_Y_LPARAM(lparam); - UINT dpi = DPIAware::DEFAULT_DPI; - DPIAware::GetScreenDPIForWindow(hwnd, dpi); - - if (x < 322 * static_cast(dpi) / static_cast(DPIAware::DEFAULT_DPI) / 2) - { - VideoConferenceModule::reverseMicrophoneMute(); - } - else - { - VideoConferenceModule::reverseVirtualCameraMuteState(); - } - - return DefWindowProcW(hwnd, msg, wparam, lparam); - } - case WM_DPICHANGED: - { - UINT dpi = LOWORD(wparam); - RECT* prcNewWindow = reinterpret_cast(lparam); - - POINT suggestedPosition; - suggestedPosition.x = prcNewWindow->left; - suggestedPosition.y = prcNewWindow->top; - - int desiredWidth = prcNewWindow->right - prcNewWindow->left; - int desiredHeight = prcNewWindow->bottom - prcNewWindow->top; - - HMONITOR hMonitor = MonitorFromPoint(suggestedPosition, MONITOR_DEFAULTTONEAREST); - - MonitorInfo info{ hMonitor }; - - suggestedPosition = calculateToolbarPositioning(info.GetScreenSize(false), cached_position, desiredWidth, desiredHeight); - - SetWindowPos(hwnd, - NULL, - suggestedPosition.x, - suggestedPosition.y, - desiredWidth, - desiredHeight, - SWP_NOZORDER | SWP_NOACTIVATE); - return DefWindowProcW(hwnd, msg, wparam, lparam); - } - case WM_CREATE: - case WM_PAINT: - { - PAINTSTRUCT ps; - HDC hdc; - UINT dpi = DPIAware::DEFAULT_DPI; - - DPIAware::GetScreenDPIForWindow(hwnd, dpi); - - hdc = BeginPaint(hwnd, &ps); - - Gdiplus::Graphics graphic(hdc); - - ToolbarImages* themeImages = &toolbar->darkImages; - - if (toolbar->theme == L"light" || (toolbar->theme == L"system" && !WindowsColors::is_dark_mode())) - { - themeImages = &toolbar->lightImages; - } - else - { - themeImages = &toolbar->darkImages; - } - Gdiplus::Image* toolbarImage = nullptr; - if (!toolbar->cameraInUse) - { - if (toolbar->microphoneMuted) - { - toolbarImage = themeImages->camUnusedMicOff; - } - else - { - toolbarImage = themeImages->camUnusedMicOn; - } - } - else if (toolbar->microphoneMuted) - { - if (toolbar->cameraMuted) - { - toolbarImage = themeImages->camOffMicOff; - } - else - { - toolbarImage = themeImages->camOnMicOff; - } - } - else - { - if (toolbar->cameraMuted) - { - toolbarImage = themeImages->camOffMicOn; - } - else - { - toolbarImage = themeImages->camOnMicOn; - } - } - // Images are scaled by 4 to support higher dpi values. - graphic.DrawImage(toolbarImage, 0, 0, toolbarImage->GetWidth() / 4 * dpi / DPIAware::DEFAULT_DPI, toolbarImage->GetHeight() / 4 * dpi / DPIAware::DEFAULT_DPI); - - EndPaint(hwnd, &ps); - break; - } - case WM_TIMER: - { - if (toolbar->audioConfChangesNotifier.PullPendingNotifications()) - { - instance->onMicrophoneConfigurationChanged(); - } - toolbar->microphoneMuted = instance->getMicrophoneMuteState(); - - if (toolbar->generalSettingsUpdateScheduled) - { - instance->onGeneralSettingsChanged(); - toolbar->generalSettingsUpdateScheduled = false; - } - if (toolbar->moduleSettingsUpdateScheduled) - { - instance->onModuleSettingsChanged(); - toolbar->moduleSettingsUpdateScheduled = false; - } - - toolbar->cameraInUse = VideoConferenceModule::getVirtualCameraInUse(); - - InvalidateRect(hwnd, NULL, NULL); - - using namespace std::chrono; - const auto nowMillis = duration_cast(system_clock::now().time_since_epoch()).count(); - const bool showOverlayTimeout = nowMillis - toolbar->lastTimeCamOrMicMuteStateChanged > OVERLAY_SHOW_TIME; - - static bool previousShow = false; - bool show = toolbar->ToolbarHide == L"Never"; - - const bool cameraJustStoppedInUse = toolbar->previouscameraInUse && !toolbar->cameraInUse; - bool shouldUnmuteAll = cameraJustStoppedInUse; - - if (toolbar->ToolbarHide == L"When both camera and microphone are muted") - { - // We shouldn't unmute devices, since we'd like to only show the toolbar only - // when something is unmuted -> the use case is to keep everything muted by default and track it - shouldUnmuteAll = false; - show = (!toolbar->cameraMuted && toolbar->cameraInUse) || !toolbar->microphoneMuted; - } - else if (toolbar->ToolbarHide == L"When both camera and microphone are unmuted") - show = (toolbar->cameraMuted && toolbar->cameraInUse) || toolbar->microphoneMuted; - - if (shouldUnmuteAll && !toolbar->moduleSettingsUpdateScheduled) - VideoConferenceModule::unmuteAll(); - - show = show || !showOverlayTimeout; - ShowWindow(hwnd, show ? SW_SHOW : SW_HIDE); - - if (previousShow != show) - { - previousShow = show; - LOG(show ? "Toolbar visibility changed to shown" : "Toolbar visibility changed to hidden"); - } - - KillTimer(hwnd, toolbar->nTimerId); - toolbar->previouscameraInUse = toolbar->cameraInUse; - break; - } - default: - return DefWindowProcW(hwnd, msg, wparam, lparam); - } - - toolbar->nTimerId = SetTimer(hwnd, 101, REFRESH_RATE, nullptr); - - return DefWindowProcW(hwnd, msg, wparam, lparam); -} - -void Toolbar::show(std::wstring position, std::wstring monitorString) -{ - cached_position = position; - for (auto& hwnd : hwnds) - { - PostMessageW(hwnd, WM_CLOSE, 0, 0); - } - hwnds.clear(); - - // Images are scaled by 4 to support higher dpi values. - int overlayWidth = darkImages.camOffMicOff->GetWidth() / 4; - int overlayHeight = darkImages.camOffMicOff->GetHeight() / 4; - - // Register the window class - LPCWSTR CLASS_NAME = L"MuteNotificationWindowClass"; - WNDCLASS wc{}; - wc.hInstance = GetModuleHandleW(nullptr); - wc.lpszClassName = CLASS_NAME; - wc.hCursor = LoadCursor(nullptr, IDC_ARROW); - wc.hbrBackground = reinterpret_cast(COLOR_WINDOW); - wc.lpfnWndProc = WindowProcessMessages; - RegisterClassW(&wc); - - // Create the window - DWORD dwExtStyle = 0; - DWORD dwStyle = WS_POPUPWINDOW; - - std::vector monitorInfos; - - if (monitorString == L"All monitors") - { - monitorInfos = MonitorInfo::GetMonitors(false); - } - else //"Main monitor" or non-present - { - monitorInfos.push_back(MonitorInfo::GetPrimaryMonitor()); - } - - for (auto& monitorInfo : monitorInfos) - { - const auto screenSize = monitorInfo.GetScreenSize(false); - UINT dpi = DPIAware::DEFAULT_DPI; - DPIAware::GetScreenDPIForMonitor(monitorInfo.GetHandle(), dpi); - - int scaledOverlayWidth = overlayWidth * dpi / DPIAware::DEFAULT_DPI; - int scaledOverlayHeight = overlayHeight * dpi / DPIAware::DEFAULT_DPI; - - POINT p = calculateToolbarPositioning(screenSize, position, scaledOverlayWidth, scaledOverlayHeight); - - HWND hwnd; - hwnd = CreateWindowExW( - WS_EX_TOOLWINDOW | WS_EX_LAYERED, - CLASS_NAME, - CLASS_NAME, - WS_POPUP, - static_cast(p.x), - static_cast(p.y), - scaledOverlayWidth, - scaledOverlayHeight, - nullptr, - nullptr, - GetModuleHandleW(nullptr), - nullptr); - - auto transparentColorKey = RGB(0, 0, 255); - HBRUSH brush = CreateSolidBrush(transparentColorKey); - SetClassLongPtr(hwnd, GCLP_HBRBACKGROUND, reinterpret_cast(brush)); - - SetLayeredWindowAttributes(hwnd, transparentColorKey, 0, LWA_COLORKEY); - - SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); - - hwnds.push_back(hwnd); - } -} - -void Toolbar::hide() -{ - for (auto& hwnd : hwnds) - { - PostMessage(hwnd, WM_CLOSE, 0, 0); - } - hwnds.clear(); -} - -bool Toolbar::getCameraMute() -{ - return cameraMuted; -} - -void Toolbar::setCameraMute(bool mute) -{ - if (mute != cameraMuted) - { - lastTimeCamOrMicMuteStateChanged = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - } - cameraMuted = mute; -} - -bool Toolbar::getMicrophoneMute() -{ - return microphoneMuted; -} - -void Toolbar::setMicrophoneMute(bool mute) -{ - if (mute != microphoneMuted) - { - lastTimeCamOrMicMuteStateChanged = std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count(); - } - - microphoneMuted = mute; -} - -void Toolbar::setToolbarHide(std::wstring hide) -{ - ToolbarHide = hide; -} - -void Toolbar::setTheme(std::wstring theme) -{ - Toolbar::theme = theme; -} diff --git a/src/modules/videoconference/VideoConferenceModule/Toolbar.h b/src/modules/videoconference/VideoConferenceModule/Toolbar.h deleted file mode 100644 index 04b1c28a23..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/Toolbar.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once - -#include -#include -#include - -#include - -#include "AudioDeviceNotificationClient.h" - -struct ToolbarImages -{ - Gdiplus::Image* camOnMicOn = nullptr; - Gdiplus::Image* camOffMicOn = nullptr; - Gdiplus::Image* camOnMicOff = nullptr; - Gdiplus::Image* camOffMicOff = nullptr; - Gdiplus::Image* camUnusedMicOn = nullptr; - Gdiplus::Image* camUnusedMicOff = nullptr; -}; - -class Toolbar -{ -public: - Toolbar(); - - void scheduleModuleSettingsUpdate(); - void scheduleGeneralSettingsUpdate(); - - void show(std::wstring position, std::wstring monitorString); - void hide(); - - bool getCameraMute(); - void setCameraMute(bool mute); - bool getMicrophoneMute(); - void setMicrophoneMute(bool mute); - - void setTheme(std::wstring theme); - void setToolbarHide(std::wstring hide); - -private: - static LRESULT CALLBACK WindowProcessMessages(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam); - - // Window callback can't be non-static so this members can't as well - std::vector hwnds; - - ToolbarImages darkImages; - ToolbarImages lightImages; - AudioDeviceNotificationClient audioConfChangesNotifier; - - bool cameraMuted = false; - bool cameraInUse = false; - bool previouscameraInUse = false; - bool microphoneMuted = false; - - std::wstring theme = L"system"; - - std::wstring ToolbarHide = L"When both camera and microphone are unmuted"; - - uint64_t lastTimeCamOrMicMuteStateChanged{}; - - std::atomic_bool moduleSettingsUpdateScheduled = false; - std::atomic_bool generalSettingsUpdateScheduled = false; - UINT_PTR nTimerId{}; -}; diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConference.filters b/src/modules/videoconference/VideoConferenceModule/VideoConference.filters deleted file mode 100644 index e19316f1bd..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/VideoConference.filters +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - - - - {2c7c97f7-0d87-4230-a4b2-baf2cfc35d58} - - - {aa4b6713-589d-42ef-804d-3a045833f83f} - - - - - - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj b/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj deleted file mode 100644 index e043322021..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj +++ /dev/null @@ -1,189 +0,0 @@ - - - - - 15.0 - {5ABA70DE-3A3F-41F6-A1F5-D1F74F54F9BB} - Win32Proj - overlaywindow - VideoConferenceModule - ..\..\..\..\$(Platform)\$(Configuration)\ - PowerToys.VideoConferenceModule - - - - DynamicLibrary - true - v143 - Unicode - Spectre - - - DynamicLibrary - false - v143 - true - Unicode - Spectre - - - - - - - - - - - false - - - true - - - - Level3 - MaxSpeed - true - true - true - NDEBUG;OVERLAYWINDOW_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - MultiThreaded - ..\..\..\;..\..\;..\VideoConferenceShared\;%(AdditionalIncludeDirectories) - stdcpplatest - - - Windows - true - true - true - $(OutDir)$(TargetName)$(TargetExt) - shlwapi.lib;gdiplus.lib;dwmapi.lib;uxtheme.lib;shcore.lib;Wtsapi32.lib;%(AdditionalDependencies) - - - - - Level3 - Disabled - true - _DEBUG;OVERLAYWINDOW_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - MultiThreadedDebug - ..\..\..\common\inc;..\..\..\common\Telemetry;..\..\..\;..\..\;..\VideoConferenceShared\;%(AdditionalIncludeDirectories) - stdcpplatest - - - Windows - true - $(OutDir)$(TargetName)$(TargetExt) - shlwapi.lib;gdiplus.lib;dwmapi.lib;uxtheme.lib;shcore.lib;Wtsapi32.lib;dxguid.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - Create - - - - - - {459e0768-7ebd-4c41-bba1-6db3b3815e0a} - - - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - true - PreserveNewest - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - - - {caba8dfb-823b-4bf2-93ac-3f31984150d9} - - - {6955446d-23f7-4023-9bb3-8657f904af99} - - - {98537082-0fdb-40de-abd8-0dc5a4269bab} - - - - - - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj.filters b/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj.filters deleted file mode 100644 index fea3b28290..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/VideoConference.vcxproj.filters +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - {efd98846-4568-41d4-a425-451c246802cd} - - - {e79f8c1a-b78b-4ba5-b923-f7db79eba776} - - - - - - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - Assets\VCM - - - - - - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.cpp b/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.cpp deleted file mode 100644 index aab538e883..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.cpp +++ /dev/null @@ -1,733 +0,0 @@ -#include "pch.h" - -#include "VideoConferenceModule.h" - -#include - -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include - -#include "logging.h" -#include "trace.h" - -extern "C" IMAGE_DOS_HEADER __ImageBase; - -VideoConferenceModule* instance = nullptr; - -VideoConferenceSettings VideoConferenceModule::settings; -Toolbar VideoConferenceModule::toolbar; -bool VideoConferenceModule::pushToTalkPressed = false; - -HHOOK VideoConferenceModule::hook_handle; - -IAudioEndpointVolume* endpointVolume = NULL; - -bool VideoConferenceModule::isKeyPressed(unsigned int keyCode) -{ - return (GetKeyState(keyCode) & 0x8000); -} - -namespace fs = std::filesystem; - -bool VideoConferenceModule::isHotkeyPressed(DWORD code, PowerToysSettings::HotkeyObject& hotkey) -{ - return code == hotkey.get_code() && - isKeyPressed(VK_SHIFT) == hotkey.shift_pressed() && - isKeyPressed(VK_CONTROL) == hotkey.ctrl_pressed() && - isKeyPressed(VK_LWIN) == hotkey.win_pressed() && - (isKeyPressed(VK_LMENU)) == hotkey.alt_pressed(); -} - -void VideoConferenceModule::reverseMicrophoneMute() -{ - // 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) - { - controlledMic->set_muted(muted); - } - if (muted) - { - Trace::MicrophoneMuted(); - } - instance->_mic_muted_state_during_disconnect = !instance->_mic_muted_state_during_disconnect; - - toolbar.setMicrophoneMute(muted); -} - -bool VideoConferenceModule::getMicrophoneMuteState() -{ - return instance->_microphoneTrackedInUI ? instance->_microphoneTrackedInUI->muted() : instance->_mic_muted_state_during_disconnect; -} - -void VideoConferenceModule::reverseVirtualCameraMuteState() -{ - bool muted = false; - if (!instance->_settingsUpdateChannel.has_value()) - { - return; - } - - instance->_settingsUpdateChannel->access([&muted](auto settingsMemory) { - auto settings = reinterpret_cast(settingsMemory._data); - settings->useOverlayImage = !settings->useOverlayImage; - muted = settings->useOverlayImage; - }); - - if (muted) - { - Trace::CameraMuted(); - } - toolbar.setCameraMute(muted); -} - -bool VideoConferenceModule::getVirtualCameraMuteState() -{ - bool disabled = false; - if (!instance->_settingsUpdateChannel.has_value()) - { - return disabled; - } - instance->_settingsUpdateChannel->access([&disabled](auto settingsMemory) { - auto settings = reinterpret_cast(settingsMemory._data); - disabled = settings->useOverlayImage; - }); - return disabled; -} - -bool VideoConferenceModule::getVirtualCameraInUse() -{ - if (!instance->_settingsUpdateChannel.has_value()) - { - return false; - } - bool inUse = false; - instance->_settingsUpdateChannel->access([&inUse](auto settingsMemory) { - auto settings = reinterpret_cast(settingsMemory._data); - inUse = settings->cameraInUse; - }); - return inUse; -} - -LRESULT CALLBACK VideoConferenceModule::LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) -{ - if (nCode == HC_ACTION) - { - KBDLLHOOKSTRUCT* kbd = reinterpret_cast(lParam); - switch (wParam) - { - case WM_KEYDOWN: - - if (isHotkeyPressed(kbd->vkCode, settings.cameraAndMicrophoneMuteHotkey)) - { - const bool cameraInUse = getVirtualCameraInUse(); - const bool microphoneIsMuted = getMicrophoneMuteState(); - const bool cameraIsMuted = cameraInUse && getVirtualCameraMuteState(); - if (cameraInUse) - { - // we're likely on a video call, so we must mute the unmuted cam/mic or reverse the mute state - // of everything, if cam and mic mute states are the same - if (microphoneIsMuted == cameraIsMuted) - { - reverseMicrophoneMute(); - reverseVirtualCameraMuteState(); - } - else if (cameraIsMuted) - { - reverseMicrophoneMute(); - } - else if (microphoneIsMuted) - { - reverseVirtualCameraMuteState(); - } - } - else - { - // if the camera is not in use, we just mute/unmute the mic - reverseMicrophoneMute(); - } - return 1; - } - else if (isHotkeyPressed(kbd->vkCode, settings.microphoneMuteHotkey)) - { - reverseMicrophoneMute(); - return 1; - } - else if (isHotkeyPressed(kbd->vkCode, settings.microphonePushToTalkHotkey)) - { - if (!pushToTalkPressed) - { - if (settings.pushToReverseEnabled || getMicrophoneMuteState()) - { - reverseMicrophoneMute(); - } - pushToTalkPressed = true; - } - return 1; - } - else if (isHotkeyPressed(kbd->vkCode, settings.cameraMuteHotkey)) - { - reverseVirtualCameraMuteState(); - return 1; - } - break; - case WM_KEYUP: - if (pushToTalkPressed && (kbd->vkCode == settings.microphonePushToTalkHotkey.get_code())) - { - reverseMicrophoneMute(); - pushToTalkPressed = false; - return 1; - } - } - } - - return CallNextHookEx(hook_handle, nCode, wParam, lParam); -} - -void VideoConferenceModule::onGeneralSettingsChanged() -{ - auto settings = PTSettingsHelper::load_general_settings(); - bool enabled = false; - try - { - if (json::has(settings, L"enabled")) - { - for (const auto& mod : settings.GetNamedObject(L"enabled")) - { - const auto value = mod.Value(); - if (value.ValueType() != json::JsonValueType::Boolean) - { - continue; - } - if (mod.Key() == get_key()) - { - enabled = value.GetBoolean(); - break; - } - } - } - } - catch (...) - { - LOG("Couldn't get enabled state"); - } - if (enabled) - { - enable(); - } - else - { - disable(); - } -} - -void VideoConferenceModule::onModuleSettingsChanged() -{ - try - { - PowerToysSettings::PowerToyValues values = PowerToysSettings::PowerToyValues::load_from_settings_file(get_key()); - //Trace::SettingsChanged(pressTime.value, overlayOpacity.value, theme.value); - - if (_enabled) - { - if (const auto val = values.get_json(L"mute_camera_and_microphone_hotkey")) - { - settings.cameraAndMicrophoneMuteHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = values.get_json(L"mute_microphone_hotkey")) - { - settings.microphoneMuteHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = values.get_json(L"push_to_talk_microphone_hotkey")) - { - settings.microphonePushToTalkHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = values.get_bool_value(L"push_to_reverse_enabled")) - { - settings.pushToReverseEnabled = *val; - } - if (const auto val = values.get_json(L"mute_camera_hotkey")) - { - settings.cameraMuteHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = values.get_string_value(L"toolbar_position")) - { - settings.toolbarPositionString = val.value(); - } - if (const auto val = values.get_string_value(L"toolbar_monitor")) - { - settings.toolbarMonitorString = val.value(); - } - if (const auto val = values.get_string_value(L"selected_camera"); val && val != settings.selectedCamera) - { - settings.selectedCamera = val.value(); - sendSourceCameraNameUpdate(); - } - if (const auto val = values.get_string_value(L"camera_overlay_image_path"); val && val != settings.imageOverlayPath) - { - settings.imageOverlayPath = val.value(); - sendOverlayImageUpdate(); - } - if (const auto val = values.get_string_value(L"toolbar_hide")) - { - 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) - { - settings.selectedMicrophone = *selectedMic; - updateControlledMicrophones(settings.selectedMicrophone); - } - - toolbar.show(settings.toolbarPositionString, settings.toolbarMonitorString); - } - } - catch (...) - { - LOG("onModuleSettingsChanged encountered an exception"); - } -} - -void VideoConferenceModule::onMicrophoneConfigurationChanged() -{ - if (!_controllingAllMics) - { - // Don't care if we don't control all the mics - return; - } - - const bool mutedStateForNewMics = getMicrophoneMuteState(); - std::unordered_set currentlyTrackedMicsIds; - for (const auto& controlledMic : _controlledMicrophones) - { - currentlyTrackedMicsIds.emplace(controlledMic->id()); - } - - auto allMics = MicrophoneDevice::getAllActive(); - for (auto& newMic : allMics) - { - if (currentlyTrackedMicsIds.contains(newMic->id())) - { - continue; - } - - if (mutedStateForNewMics) - { - newMic->set_muted(true); - } - - _controlledMicrophones.emplace_back(std::move(newMic)); - } - // Restore invalidated pointer - _microphoneTrackedInUI = controlledDefaultMic(); - if (_microphoneTrackedInUI) - { - _microphoneTrackedInUI->set_mute_changed_callback([](const bool muted) { - toolbar.setMicrophoneMute(muted); - }); - } -} - -VideoConferenceModule::VideoConferenceModule() -{ - init_settings(); - _settingsUpdateChannel = - SerializedSharedMemory::create(CameraSettingsUpdateChannel::endpoint(), sizeof(CameraSettingsUpdateChannel), false); - if (_settingsUpdateChannel) - { - _settingsUpdateChannel->access([](auto memory) { - -// Suppress warning 26403 - Reset or explicitly delete an owner pointer 'variable' (r.3) -// the video conference class should be only instantiated once and it is using placement new -// the access to the data can be done through memory._data -#pragma warning(push) -#pragma warning(disable : 26403) - auto updatesChannel = new (memory._data) CameraSettingsUpdateChannel{}; -#pragma warning(pop) - }); - } - sendSourceCameraNameUpdate(); - sendOverlayImageUpdate(); -} - -inline VideoConferenceModule::~VideoConferenceModule() -{ - toolbar.hide(); -} - -const wchar_t* VideoConferenceModule::get_name() -{ - return L"Video Conference"; -} - -const wchar_t* VideoConferenceModule::get_key() -{ - return L"Video Conference"; -} - -// Return the configured status for the gpo policy for the module -powertoys_gpo::gpo_rule_configured_t VideoConferenceModule::gpo_policy_enabled_configuration() -{ - return powertoys_gpo::getConfiguredVideoConferenceMuteEnabledValue(); -} - -bool VideoConferenceModule::get_config(wchar_t* buffer, int* buffer_size) -{ - return true; -} - -void VideoConferenceModule::set_config(const wchar_t* config) -{ - try - { - PowerToysSettings::PowerToyValues values = PowerToysSettings::PowerToyValues::from_json_string(config, get_key()); - values.save_to_settings_file(); - } - catch (...) - { - LOG("VideoConferenceModule::set_config: exception during saving new settings values"); - } -} - -void VideoConferenceModule::init_settings() -{ - try - { - PowerToysSettings::PowerToyValues powerToysSettings = PowerToysSettings::PowerToyValues::load_from_settings_file(L"Video Conference"); - - if (const auto val = powerToysSettings.get_json(L"mute_camera_and_microphone_hotkey")) - { - settings.cameraAndMicrophoneMuteHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = powerToysSettings.get_json(L"mute_microphone_hotkey")) - { - settings.microphoneMuteHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = powerToysSettings.get_json(L"push_to_talk_microphone_hotkey")) - { - settings.microphonePushToTalkHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = powerToysSettings.get_bool_value(L"push_to_reverse_enabled")) - { - settings.pushToReverseEnabled = *val; - } - if (const auto val = powerToysSettings.get_json(L"mute_camera_hotkey")) - { - settings.cameraMuteHotkey = PowerToysSettings::HotkeyObject::from_json(*val); - } - if (const auto val = powerToysSettings.get_string_value(L"toolbar_position")) - { - settings.toolbarPositionString = val.value(); - } - if (const auto val = powerToysSettings.get_string_value(L"toolbar_monitor")) - { - settings.toolbarMonitorString = val.value(); - } - if (const auto val = powerToysSettings.get_string_value(L"selected_camera")) - { - settings.selectedCamera = val.value(); - } - if (const auto val = powerToysSettings.get_string_value(L"camera_overlay_image_path")) - { - settings.imageOverlayPath = val.value(); - } - if (const auto val = powerToysSettings.get_string_value(L"toolbar_hide")) - { - 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; - updateControlledMicrophones(settings.selectedMicrophone); - } - } - catch (std::exception&) - { - // Error while loading from the settings file. Just let default values stay as they are. - } - - try - { - auto loaded = PTSettingsHelper::load_general_settings(); - std::wstring settings_theme{ static_cast(loaded.GetNamedString(L"theme", L"system")) }; - if (settings_theme != L"dark" && settings_theme != L"light") - { - settings_theme = L"system"; - } - toolbar.setTheme(settings_theme); - } - catch (...) - { - } -} - -void VideoConferenceModule::updateControlledMicrophones(const std::wstring_view new_mic) -{ - for (auto& controlledMic : _controlledMicrophones) - { - controlledMic->set_muted(false); - } - _controlledMicrophones.clear(); - _microphoneTrackedInUI = nullptr; - auto allMics = MicrophoneDevice::getAllActive(); - if (new_mic == L"[All]") - { - _controllingAllMics = true; - _controlledMicrophones = std::move(allMics); - _microphoneTrackedInUI = controlledDefaultMic(); - } - else - { - _controllingAllMics = false; - for (auto& controlledMic : allMics) - { - if (controlledMic->name() == new_mic) - { - _controlledMicrophones.emplace_back(std::move(controlledMic)); - _microphoneTrackedInUI = _controlledMicrophones[0].get(); - break; - } - } - } - - if (_microphoneTrackedInUI) - { - _microphoneTrackedInUI->set_mute_changed_callback([](const bool muted) { - toolbar.setMicrophoneMute(muted); - }); - 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); - } - } -} - -MicrophoneDevice* VideoConferenceModule::controlledDefaultMic() -{ - if (auto defaultMic = MicrophoneDevice::getDefault()) - { - for (auto& controlledMic : _controlledMicrophones) - { - if (controlledMic->id() == defaultMic->id()) - { - return controlledMic.get(); - } - } - } - - return nullptr; -} - -void toggleProxyCamRegistration(const bool enable) -{ - if (!is_process_elevated()) - { - return; - } - - auto vcmRoot = fs::path{ get_module_folderpath() }; -#if defined(_M_ARM64) - std::array proxyFilters = { vcmRoot / "PowerToys.VideoConferenceProxyFilter_ARM64.dll", vcmRoot / "PowerToys.VideoConferenceProxyFilter_x86.dll" }; -#else - std::array proxyFilters = { vcmRoot / "PowerToys.VideoConferenceProxyFilter_x64.dll", vcmRoot / "PowerToys.VideoConferenceProxyFilter_x86.dll" }; -#endif - for (const auto filter : proxyFilters) - { - std::wstring params{ L"/s " }; - if (!enable) - { - params += L"/u "; - } - params += '"'; - params += filter; - params += '"'; - SHELLEXECUTEINFOW sei{ sizeof(sei) }; - sei.fMask = { SEE_MASK_FLAG_NO_UI | SEE_MASK_NOASYNC }; - sei.lpFile = L"regsvr32"; - sei.lpParameters = params.c_str(); - sei.nShow = SW_SHOWNORMAL; - ShellExecuteExW(&sei); - } -} - -void VideoConferenceModule::enable() -{ - if (!_enabled) - { - _generalSettingsWatcher = std::make_unique( - PTSettingsHelper::get_powertoys_general_save_file_location(), [this] { - toolbar.scheduleGeneralSettingsUpdate(); - }); - _moduleSettingsWatcher = std::make_unique( - PTSettingsHelper::get_module_save_file_location(get_key()), [this] { - toolbar.scheduleModuleSettingsUpdate(); - }); - - toggleProxyCamRegistration(true); - toolbar.setMicrophoneMute(getMicrophoneMuteState()); - toolbar.setCameraMute(getVirtualCameraMuteState()); - - toolbar.show(settings.toolbarPositionString, settings.toolbarMonitorString); - - _enabled = true; - -#if defined(DISABLE_LOWLEVEL_HOOKS_WHEN_DEBUGGED) - if (IsDebuggerPresent()) - { - return; - } -#endif - hook_handle = SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, GetModuleHandle(NULL), NULL); - } - Trace::EnableVideoConference(true); -} - -void VideoConferenceModule::unmuteAll() -{ - if (getVirtualCameraMuteState()) - { - reverseVirtualCameraMuteState(); - } - - if (getMicrophoneMuteState()) - { - reverseMicrophoneMute(); - } -} - -void VideoConferenceModule::muteAll() -{ - if (!getVirtualCameraMuteState()) - { - reverseVirtualCameraMuteState(); - } - - if (!getMicrophoneMuteState()) - { - reverseMicrophoneMute(); - } -} - -void VideoConferenceModule::disable() -{ - if (_enabled) - { - _generalSettingsWatcher.reset(); - _moduleSettingsWatcher.reset(); - toggleProxyCamRegistration(false); - if (hook_handle) - { - bool success = UnhookWindowsHookEx(hook_handle); - if (success) - { - hook_handle = nullptr; - } - } - - if (getVirtualCameraMuteState()) - { - reverseVirtualCameraMuteState(); - } - - toolbar.hide(); - - _enabled = false; - } - Trace::EnableVideoConference(false); -} - -bool VideoConferenceModule::is_enabled() -{ - return _enabled; -} - -void VideoConferenceModule::destroy() -{ - delete this; - instance = nullptr; -} - -bool VideoConferenceModule::is_enabled_by_default() const -{ - return false; -} - -void VideoConferenceModule::sendSourceCameraNameUpdate() -{ - if (!_settingsUpdateChannel.has_value() || settings.selectedCamera.empty()) - { - return; - } - _settingsUpdateChannel->access([](auto memory) { - auto updatesChannel = reinterpret_cast(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; - } - }); -} - -void VideoConferenceModule::sendOverlayImageUpdate() -{ - if (!_settingsUpdateChannel.has_value()) - { - return; - } - _imageOverlayChannel.reset(); - - wchar_t powertoysDirectory[MAX_PATH + 1]; - - DWORD length = GetModuleFileNameW(nullptr, powertoysDirectory, MAX_PATH); - PathRemoveFileSpecW(powertoysDirectory); - - std::wstring blankImagePath(powertoysDirectory); - blankImagePath += L"\\Assets\\VCM\\black.bmp"; - - _imageOverlayChannel = SerializedSharedMemory::create_readonly(CameraOverlayImageChannel::endpoint(), - settings.imageOverlayPath != L"" ? settings.imageOverlayPath : blankImagePath); - - const auto imageSize = static_cast(_imageOverlayChannel->size()); - _settingsUpdateChannel->access([imageSize](auto memory) { - auto updatesChannel = reinterpret_cast(memory._data); - updatesChannel->overlayImageSize.emplace(imageSize); - updatesChannel->newOverlayImagePosted = true; - }); -} diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.h b/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.h deleted file mode 100644 index f3b835867a..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.h +++ /dev/null @@ -1,102 +0,0 @@ -#pragma once - -#include - -#include -#include - -#include - -#include -#include - -#include "Toolbar.h" - -#include - -extern class VideoConferenceModule* instance; - -struct VideoConferenceSettings -{ - PowerToysSettings::HotkeyObject cameraAndMicrophoneMuteHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, true, 81); - PowerToysSettings::HotkeyObject microphoneMuteHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, true, 65); - PowerToysSettings::HotkeyObject microphonePushToTalkHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, true, 73); - PowerToysSettings::HotkeyObject cameraMuteHotkey = PowerToysSettings::HotkeyObject::from_settings(true, false, false, true, 79); - - std::wstring toolbarPositionString; - std::wstring toolbarMonitorString; - - std::wstring selectedCamera; - std::wstring imageOverlayPath; - std::wstring selectedMicrophone; - - std::wstring startupAction; - - bool pushToReverseEnabled = false; -}; - -class VideoConferenceModule : public PowertoyModuleIface -{ -public: - VideoConferenceModule(); - ~VideoConferenceModule(); - virtual const wchar_t* get_name() override; - - virtual powertoys_gpo::gpo_rule_configured_t gpo_policy_enabled_configuration() override; - - virtual bool get_config(wchar_t* buffer, int* buffer_size) override; - - virtual void set_config(const wchar_t* config) override; - - virtual void enable() override; - virtual void disable() override; - virtual bool is_enabled() override; - virtual void destroy() override; - virtual bool is_enabled_by_default() const override; - - virtual const wchar_t * get_key() override; - - void sendSourceCameraNameUpdate(); - void sendOverlayImageUpdate(); - - static void unmuteAll(); - static void muteAll(); - static void reverseMicrophoneMute(); - static bool getMicrophoneMuteState(); - static void reverseVirtualCameraMuteState(); - static bool getVirtualCameraMuteState(); - static bool getVirtualCameraInUse(); - - void onGeneralSettingsChanged(); - void onModuleSettingsChanged(); - void onMicrophoneConfigurationChanged(); - -private: - - void init_settings(); - void updateControlledMicrophones(const std::wstring_view new_mic); - MicrophoneDevice* controlledDefaultMic(); - - // all callback methods and used by callback have to be static - static LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam); - static bool isKeyPressed(unsigned int keyCode); - static bool isHotkeyPressed(DWORD code, PowerToysSettings::HotkeyObject& hotkey); - - static HHOOK hook_handle; - bool _enabled = false; - - bool _mic_muted_state_during_disconnect = false; - bool _controllingAllMics = false; - std::vector> _controlledMicrophones; - MicrophoneDevice* _microphoneTrackedInUI = nullptr; - - std::optional _imageOverlayChannel; - std::optional _settingsUpdateChannel; - - std::unique_ptr _generalSettingsWatcher; - std::unique_ptr _moduleSettingsWatcher; - - static VideoConferenceSettings settings; - static Toolbar toolbar; - static bool pushToTalkPressed; -}; diff --git a/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.rc b/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.rc deleted file mode 100644 index 5fa3c8b90d..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/VideoConferenceModule.rc +++ /dev/null @@ -1,40 +0,0 @@ -#include -#include "resource.h" -#include "../../../common/version/version.h" - -#define APSTUDIO_READONLY_SYMBOLS -#include "winres.h" -#undef APSTUDIO_READONLY_SYMBOLS - -1 VERSIONINFO -FILEVERSION FILE_VERSION -PRODUCTVERSION PRODUCT_VERSION -FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG -FILEFLAGS VS_FF_DEBUG -#else -FILEFLAGS 0x0L -#endif -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_DLL -FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" // US English (0x0409), Unicode (0x04B0) charset - BEGIN - VALUE "CompanyName", COMPANY_NAME - VALUE "FileDescription", FILE_DESCRIPTION - VALUE "FileVersion", FILE_VERSION_STRING - VALUE "InternalName", INTERNAL_NAME - VALUE "LegalCopyright", COPYRIGHT_NOTE - VALUE "OriginalFilename", ORIGINAL_FILENAME - VALUE "ProductName", PRODUCT_NAME - VALUE "ProductVersion", PRODUCT_VERSION_STRING - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 // US English (0x0409), Unicode (1200) charset - END -END diff --git a/src/modules/videoconference/VideoConferenceModule/dllmain.cpp b/src/modules/videoconference/VideoConferenceModule/dllmain.cpp deleted file mode 100644 index c3d012cd6c..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/dllmain.cpp +++ /dev/null @@ -1,35 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "pch.h" -#include -#include "trace.h" -#include "VideoConferenceModule.h" - -BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) -{ - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - Trace::RegisterProvider(); - break; - case DLL_THREAD_ATTACH: - case DLL_THREAD_DETACH: - break; - case DLL_PROCESS_DETACH: - Trace::UnregisterProvider(); - break; - } - return TRUE; -} - -extern "C" __declspec(dllexport) PowertoyModuleIface* __cdecl powertoy_create() -{ - if (!instance) - { - instance = new VideoConferenceModule(); - return instance; - } - else - { - return nullptr; - } -} diff --git a/src/modules/videoconference/VideoConferenceModule/framework.h b/src/modules/videoconference/VideoConferenceModule/framework.h deleted file mode 100644 index 54b83e94fd..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/framework.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers -// Windows Header Files -#include diff --git a/src/modules/videoconference/VideoConferenceModule/packages.config b/src/modules/videoconference/VideoConferenceModule/packages.config deleted file mode 100644 index ff4b059648..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceModule/pch.cpp b/src/modules/videoconference/VideoConferenceModule/pch.cpp deleted file mode 100644 index 64b7eef6d6..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/pch.cpp +++ /dev/null @@ -1,5 +0,0 @@ -// pch.cpp: source file corresponding to the pre-compiled header - -#include "pch.h" - -// When you are using pre-compiled headers, this source file is necessary for compilation to succeed. diff --git a/src/modules/videoconference/VideoConferenceModule/pch.h b/src/modules/videoconference/VideoConferenceModule/pch.h deleted file mode 100644 index 7c614d9a5c..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/pch.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#define WIN32_LEAN_AND_MEAN -#include -#include - -#include -#include -#include - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include diff --git a/src/modules/videoconference/VideoConferenceModule/resource.h b/src/modules/videoconference/VideoConferenceModule/resource.h deleted file mode 100644 index 6073efd0c3..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/resource.h +++ /dev/null @@ -1,13 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by VideoConferenceModule.rc - -////////////////////////////// -// Non-localizable - -#define FILE_DESCRIPTION "PowerToys VideoConferenceMute Module" -#define INTERNAL_NAME "PowerToys.VideoConferenceModule" -#define ORIGINAL_FILENAME "PowerToys.VideoConferenceModule.dll" - -// Non-localizable -////////////////////////////// diff --git a/src/modules/videoconference/VideoConferenceModule/trace.cpp b/src/modules/videoconference/VideoConferenceModule/trace.cpp deleted file mode 100644 index 043c6b30e7..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/trace.cpp +++ /dev/null @@ -1,60 +0,0 @@ -#include "pch.h" - -#include "trace.h" - -#include - -TRACELOGGING_DEFINE_PROVIDER( - g_hProvider, - "Microsoft.PowerToys", - // {38e8889b-9731-53f5-e901-e8a7c1753074} - (0x38e8889b, 0x9731, 0x53f5, 0xe9, 0x01, 0xe8, 0xa7, 0xc1, 0x75, 0x30, 0x74), - TraceLoggingOptionProjectTelemetry()); - -// Log if the user has VCM enabled or disabled -void Trace::EnableVideoConference(const bool enabled) noexcept -{ - TraceLoggingWriteWrapper( - g_hProvider, - "VideoConference_EnableVideoConference", - ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE), - TraceLoggingBoolean(enabled, "Enabled")); -} - -void Trace::SettingsChanged(const struct VideoConferenceSettings& settings) noexcept -{ - bool CustomOverlayImage = (settings.imageOverlayPath.length() > 0); - - TraceLoggingWriteWrapper( - g_hProvider, - "VideoConference_SettingsChanged", - TraceLoggingWideString(settings.toolbarPositionString.c_str(), "ToolbarPosition"), - TraceLoggingWideString(settings.toolbarMonitorString.c_str(), "ToolbarMonitorSelection"), - TraceLoggingBool(CustomOverlayImage, "CustomImageOverlayUsed"), - ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), - TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); -} - -void Trace::MicrophoneMuted() noexcept -{ - TraceLoggingWriteWrapper( - g_hProvider, - "VideoConference_MicrophoneMuted", - TraceLoggingBoolean(true, "MicrophoneMuted"), - ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), - TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); -} - -void Trace::CameraMuted() noexcept -{ - TraceLoggingWriteWrapper( - g_hProvider, - "VideoConference_CameraMuted", - TraceLoggingBoolean(true, "CameraMuted"), - ProjectTelemetryPrivacyDataTag(ProjectTelemetryTag_ProductAndServicePerformance), - TraceLoggingBoolean(TRUE, "UTCReplace_AppSessionGuid"), - TraceLoggingKeyword(PROJECT_KEYWORD_MEASURE)); -} diff --git a/src/modules/videoconference/VideoConferenceModule/trace.h b/src/modules/videoconference/VideoConferenceModule/trace.h deleted file mode 100644 index 0a9f193e69..0000000000 --- a/src/modules/videoconference/VideoConferenceModule/trace.h +++ /dev/null @@ -1,13 +0,0 @@ -#pragma once -#include "VideoConferenceModule.h" - -#include - -class Trace : public telemetry::TraceBase -{ -public: - static void EnableVideoConference(const bool enabled) noexcept; - static void SettingsChanged(const struct VideoConferenceSettings &settings) noexcept; - static void MicrophoneMuted() noexcept; - static void CameraMuted() noexcept; -}; diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.cpp b/src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.cpp deleted file mode 100644 index ef2d3f76ea..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "DirectShowUtils.h" - -#include - -unique_media_type_ptr CopyMediaType(const AM_MEDIA_TYPE* source) -{ - unique_media_type_ptr target{ static_cast(CoTaskMemAlloc(sizeof(AM_MEDIA_TYPE))) }; - *target = *source; - if (source->cbFormat) - { - target->pbFormat = static_cast(CoTaskMemAlloc(source->cbFormat)); - std::copy(source->pbFormat, source->pbFormat + source->cbFormat, target->pbFormat); - } - - if (target->pUnk) - { - target->pUnk->AddRef(); - } - - return target; -} - -wil::com_ptr_nothrow GetPinAllocator(wil::com_ptr_nothrow& inputPin) -{ - if (!inputPin) - { - return nullptr; - } - wil::com_ptr_nothrow allocator; - if (auto memInput = inputPin.try_query(); memInput) - { - memInput->GetAllocator(&allocator); - return allocator; - } - - return nullptr; -} - -void MyFreeMediaType(AM_MEDIA_TYPE& mt) -{ - if (mt.cbFormat != 0) - { - CoTaskMemFree(mt.pbFormat); - mt.cbFormat = 0; - mt.pbFormat = nullptr; - } - - if (mt.pUnk != nullptr) - { - mt.pUnk->Release(); - mt.pUnk = nullptr; - } -} - -void MyDeleteMediaType(AM_MEDIA_TYPE* pmt) -{ - if (!pmt) - { - return; - } - - MyFreeMediaType(*pmt); - CoTaskMemFree(const_cast(pmt)); -} - -HRESULT MediaTypeEnumerator::Next(ULONG cObjects, AM_MEDIA_TYPE** outObjects, ULONG* pcFetched) -{ - if (!outObjects) - { - return E_POINTER; - } - - ULONG fetched = 0; - ULONG toFetch = cObjects; - while (toFetch-- && _pos < _objects.size()) - { - auto copy = CopyMediaType(_objects[_pos++].get()); - outObjects[fetched++] = copy.release(); - } - - if (pcFetched) - { - *pcFetched = fetched; - } - - return fetched == cObjects ? S_OK : S_FALSE; -} - -HRESULT MediaTypeEnumerator::Skip(ULONG cObjects) -{ - _pos += cObjects; - return _pos < _objects.size() ? S_OK : S_FALSE; -} - -HRESULT MediaTypeEnumerator::Reset() -{ - _pos = 0; - return S_OK; -} - -HRESULT MediaTypeEnumerator::Clone(IEnumMediaTypes** ppEnum) -{ - auto cloned = winrt::make_self(); - cloned->_objects.resize(_objects.size()); - for (size_t i = 0; i < _objects.size(); ++i) - { - cloned->_objects[i] = CopyMediaType(_objects[i].get()); - } - - cloned->_pos = _pos; - cloned.as().copy_to(ppEnum); - return S_OK; -} \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.h b/src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.h deleted file mode 100644 index d8c35a54b6..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/DirectShowUtils.h +++ /dev/null @@ -1,87 +0,0 @@ -#pragma once -#include - -#define WIN32_LEAN_AND_MEAN -#include -#include - -#include -#include - -#include - -#include "Logging.h" - -void MyDeleteMediaType(AM_MEDIA_TYPE* pmt); - -using unique_media_type_ptr = - wistd::unique_ptr>; - -unique_media_type_ptr CopyMediaType(const AM_MEDIA_TYPE* source); - -template -struct ObjectEnumerator : public winrt::implements, EnumeratorInterface> -{ - std::vector> _objects; - ULONG _pos = 0; - - HRESULT STDMETHODCALLTYPE Next(ULONG cObjects, ObjectInterface** outObjects, ULONG* pcFetched) override - { - if (!outObjects) - { - return E_POINTER; - } - - ULONG fetched = 0; - ULONG toFetch = cObjects; - while (toFetch-- && _pos < _objects.size()) - { - _objects[_pos++].copy_to(&outObjects[fetched++]); - } - - if (pcFetched) - { - *pcFetched = fetched; - } - - return fetched == cObjects ? S_OK : S_FALSE; - } - - HRESULT STDMETHODCALLTYPE Skip(ULONG cObjects) override - { - _pos += cObjects; - return _pos < _objects.size() ? S_OK : S_FALSE; - } - - HRESULT STDMETHODCALLTYPE Reset() override - { - _pos = 0; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE Clone(EnumeratorInterface** ppEnum) override - { - auto cloned = winrt::make_self(); - cloned->_objects = _objects; - cloned->_pos = _pos; - cloned.as().copy_to(ppEnum); - return S_OK; - } - - virtual ~ObjectEnumerator() = default; -}; - -struct MediaTypeEnumerator : public winrt::implements -{ - std::vector _objects; - ULONG _pos = 0; - - HRESULT STDMETHODCALLTYPE Next(ULONG cObjects, AM_MEDIA_TYPE** outObjects, ULONG* pcFetched) override; - HRESULT STDMETHODCALLTYPE Skip(ULONG cObjects) override; - HRESULT STDMETHODCALLTYPE Reset() override; - HRESULT STDMETHODCALLTYPE Clone(IEnumMediaTypes** ppEnum) override; - - virtual ~MediaTypeEnumerator() = default; -}; - -wil::com_ptr_nothrow GetPinAllocator(wil::com_ptr_nothrow& inputPin); diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/ImageLoading.cpp b/src/modules/videoconference/VideoConferenceProxyFilter/ImageLoading.cpp deleted file mode 100644 index 4887801154..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/ImageLoading.cpp +++ /dev/null @@ -1,424 +0,0 @@ -#include - -#include -#include -#include - -#pragma warning(push) -#pragma warning(disable : 4005) -#include -#pragma warning(pop) - -#include -#include -#include -#include - -#include -#include - -#include -#include -#include -#include - -#include - -#include "Logging.h" - -IWICImagingFactory* _GetWIC() noexcept -{ - static IWICImagingFactory* s_Factory = nullptr; - - if (s_Factory) - { - return s_Factory; - } - - OK_OR_BAIL(CoCreateInstance( - CLSID_WICImagingFactory, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), (LPVOID*)&s_Factory)); - - return s_Factory; -} - -bool ReencodeJPGImage(BYTE* imageBuf, const DWORD imageSize, DWORD& reencodedSize) -{ - auto pWIC = _GetWIC(); - wil::com_ptr_nothrow imageStream = SHCreateMemStream(imageBuf, imageSize); - if (!imageStream) - { - return false; - } - - // Decode jpg into bitmap - wil::com_ptr_nothrow bitmapDecoder; - OK_OR_BAIL(pWIC->CreateDecoderFromStream(imageStream.get(), nullptr, WICDecodeMetadataCacheOnLoad, &bitmapDecoder)); - wil::com_ptr_nothrow decodedFrame; - OK_OR_BAIL(bitmapDecoder->GetFrame(0, &decodedFrame)); - wil::com_ptr_nothrow bitmap; - bitmap.attach(decodedFrame.detach()); - UINT width = 0, height = 0; - OK_OR_BAIL(bitmap->GetSize(&width, &height)); - - // Initialize jpg encoder - wil::com_ptr_nothrow encoder; - OK_OR_BAIL(pWIC->CreateEncoder(GUID_ContainerFormatJpeg, nullptr, &encoder)); - - wil::com_ptr_nothrow outputStream; - OK_OR_BAIL(CreateStreamOnHGlobal(nullptr, true, &outputStream)); - OK_OR_BAIL(encoder->Initialize(outputStream.get(), WICBitmapEncoderNoCache)); - wil::com_ptr_nothrow encodedFrame; - wil::com_ptr_nothrow encoderOptions; - OK_OR_BAIL(encoder->CreateNewFrame(&encodedFrame, &encoderOptions)); - - ULONG nProperties = 0; - OK_OR_BAIL(encoderOptions->CountProperties(&nProperties)); - for (ULONG propIdx = 0; propIdx < nProperties; ++propIdx) - { - PROPBAG2 propBag{}; - ULONG _; - OK_OR_BAIL(encoderOptions->GetPropertyInfo(propIdx, 1, &propBag, &_)); - if (propBag.pstrName == std::wstring_view{ L"ImageQuality" }) - { - wil::unique_variant variant; - variant.vt = VT_R4; - variant.fltVal = 0.1f; - OK_OR_BAIL(encoderOptions->Write(1, &propBag, &variant)); - LOG("Successfully set jpg compression quality"); - // skip the rest of the properties - propIdx = nProperties; - } - CoTaskMemFree(propBag.pstrName); - } - - OK_OR_BAIL(encodedFrame->Initialize(encoderOptions.get())); - WICPixelFormatGUID intermediateFormat = GUID_WICPixelFormat24bppRGB; - - OK_OR_BAIL(encodedFrame->SetPixelFormat(&intermediateFormat)); - OK_OR_BAIL(encodedFrame->SetSize(width, height)); - - // Commit the image encoding - OK_OR_BAIL(encodedFrame->WriteSource(bitmap.get(), nullptr)); - OK_OR_BAIL(encodedFrame->Commit()); - OK_OR_BAIL(encoder->Commit()); - - STATSTG intermediateStreamStat{}; - OK_OR_BAIL(outputStream->Stat(&intermediateStreamStat, STATFLAG_NONAME)); - const ULONGLONG jpgStreamSize = intermediateStreamStat.cbSize.QuadPart; - HGLOBAL streamMemoryHandle{}; - OK_OR_BAIL(GetHGlobalFromStream(outputStream.get(), &streamMemoryHandle)); - - auto jpgStreamMemory = static_cast(GlobalLock(streamMemoryHandle)); - std::copy(jpgStreamMemory, jpgStreamMemory + jpgStreamSize, imageBuf); - auto unlockJpgStreamMemory = wil::scope_exit([jpgStreamMemory] { GlobalUnlock(jpgStreamMemory); }); - reencodedSize = static_cast(jpgStreamSize); - return true; -} - -wil::com_ptr_nothrow LoadAsRGB24BitmapWithSize(IWICImagingFactory* pWIC, - wil::com_ptr_nothrow image, - const UINT targetWidth, - const UINT targetHeight) -{ - wil::com_ptr_nothrow bitmap; - // Initialize image bitmap decoder from filename and get the image frame - wil::com_ptr_nothrow bitmapDecoder; - OK_OR_BAIL(pWIC->CreateDecoderFromStream(image.get(), nullptr, WICDecodeMetadataCacheOnLoad, &bitmapDecoder)); - - wil::com_ptr_nothrow decodedFrame; - OK_OR_BAIL(bitmapDecoder->GetFrame(0, &decodedFrame)); - - UINT imageWidth = 0, imageHeight = 0; - OK_OR_BAIL(decodedFrame->GetSize(&imageWidth, &imageHeight)); - - // Scale the image if required - if (targetWidth != imageWidth || targetHeight != imageHeight) - { - wil::com_ptr_nothrow scaler; - OK_OR_BAIL(pWIC->CreateBitmapScaler(&scaler)); - OK_OR_BAIL( - scaler->Initialize(decodedFrame.get(), targetWidth, targetHeight, WICBitmapInterpolationModeHighQualityCubic)); - bitmap.attach(scaler.detach()); - } - else - { - bitmap.attach(decodedFrame.detach()); - } - WICPixelFormatGUID pixelFormat{}; - OK_OR_BAIL(bitmap->GetPixelFormat(&pixelFormat)); - - const auto targetPixelFormat = GUID_WICPixelFormat24bppBGR; - if (pixelFormat != targetPixelFormat) - { - wil::com_ptr_nothrow convertedBitmap; - if (SUCCEEDED(WICConvertBitmapSource(targetPixelFormat, bitmap.get(), &convertedBitmap))) - { - return convertedBitmap; - } - } - - return bitmap; -} - -wil::com_ptr_nothrow EncodeBitmapToContainer(IWICImagingFactory* pWIC, - wil::com_ptr_nothrow bitmap, - const GUID& containerGUID, - const UINT width, - const UINT height, - const float quality) -{ - wil::com_ptr_nothrow encoder; - pWIC->CreateEncoder(containerGUID, nullptr, &encoder); - - if (!encoder) - { - return nullptr; - } - - // Prepare the encoder output memory stream and encoding params - wil::com_ptr_nothrow encodedBitmap; - OK_OR_BAIL(CreateStreamOnHGlobal(nullptr, true, &encodedBitmap)); - OK_OR_BAIL(encoder->Initialize(encodedBitmap.get(), WICBitmapEncoderNoCache)); - wil::com_ptr_nothrow encodedFrame; - - wil::com_ptr_nothrow encoderOptions; - OK_OR_BAIL(encoder->CreateNewFrame(&encodedFrame, &encoderOptions)); - - ULONG nProperties = 0; - OK_OR_BAIL(encoderOptions->CountProperties(&nProperties)); - for (ULONG propIdx = 0; propIdx < nProperties; ++propIdx) - { - PROPBAG2 propBag{}; - ULONG _; - OK_OR_BAIL(encoderOptions->GetPropertyInfo(propIdx, 1, &propBag, &_)); - if (propBag.pstrName == std::wstring_view{ L"ImageQuality" }) - { - wil::unique_variant variant; - variant.vt = VT_R4; - variant.fltVal = quality; - OK_OR_BAIL(encoderOptions->Write(1, &propBag, &variant)); - LOG("Successfully set jpg compression quality"); - // skip the rest of the properties - propIdx = nProperties; - } - CoTaskMemFree(propBag.pstrName); - } - - OK_OR_BAIL(encodedFrame->Initialize(encoderOptions.get())); - - WICPixelFormatGUID intermediateFormat = GUID_WICPixelFormat24bppRGB; - OK_OR_BAIL(encodedFrame->SetPixelFormat(&intermediateFormat)); - OK_OR_BAIL(encodedFrame->SetSize(width, height)); - - // Commit the image encoding - OK_OR_BAIL(encodedFrame->WriteSource(bitmap.get(), nullptr)); - OK_OR_BAIL(encodedFrame->Commit()); - OK_OR_BAIL(encoder->Commit()); - return encodedBitmap; -} - -IMFSample* ConvertIMFVideoSample(const MFT_REGISTER_TYPE_INFO& inputType, - IMFMediaType* outputMediaType, - const wil::com_ptr_nothrow& inputSample, - const UINT width, - const UINT height) -{ - IMFActivate** ppVDActivate = nullptr; - UINT32 count = 0; - - MFT_REGISTER_TYPE_INFO outputType = { MFMediaType_Video, {} }; - outputMediaType->GetGUID(MF_MT_SUBTYPE, &outputType.guidSubtype); - - const std::array transformerCategories = { - MFT_CATEGORY_VIDEO_PROCESSOR, MFT_CATEGORY_VIDEO_DECODER, MFT_CATEGORY_VIDEO_ENCODER - }; - - for (const auto& transformerCategory : transformerCategories) - { - OK_OR_BAIL(MFTEnumEx(transformerCategory, MFT_ENUM_FLAG_SYNCMFT, &inputType, &outputType, &ppVDActivate, &count)); - if (count != 0) - { - break; - } - } - - wil::com_ptr_nothrow videoTransformer; - - bool videoDecoderActivated = false; - for (UINT32 i = 0; i < count; ++i) - { - if (!videoDecoderActivated && !FAILED(ppVDActivate[i]->ActivateObject(IID_PPV_ARGS(&videoTransformer)))) - { - videoDecoderActivated = true; - } - ppVDActivate[i]->Release(); - } - - if (count) - { - CoTaskMemFree(ppVDActivate); - } - - if (!videoDecoderActivated) - { - LOG("No converter available for the selected format"); - return nullptr; - } - - auto shutdownVideoDecoder = wil::scope_exit([&videoTransformer] { MFShutdownObject(videoTransformer.get()); }); - // Set input/output types for the decoder - wil::com_ptr_nothrow intermediateFrameMediaType; - OK_OR_BAIL(MFCreateMediaType(&intermediateFrameMediaType)); - intermediateFrameMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video); - intermediateFrameMediaType->SetGUID(MF_MT_SUBTYPE, MFVideoFormat_RGB24); - intermediateFrameMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); - intermediateFrameMediaType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); - OK_OR_BAIL(MFSetAttributeSize(intermediateFrameMediaType.get(), MF_MT_FRAME_SIZE, width, height)); - OK_OR_BAIL(MFSetAttributeRatio(intermediateFrameMediaType.get(), MF_MT_PIXEL_ASPECT_RATIO, width, height)); - OK_OR_BAIL(videoTransformer->SetInputType(0, intermediateFrameMediaType.get(), 0)); - OK_OR_BAIL(videoTransformer->SetOutputType(0, outputMediaType, 0)); - - // Process the input sample - OK_OR_BAIL(videoTransformer->ProcessInput(0, inputSample.get(), 0)); - - // Check whether we need to allocate output sample and buffer ourselves - MFT_OUTPUT_STREAM_INFO outputStreamInfo{}; - OK_OR_BAIL(videoTransformer->GetOutputStreamInfo(0, &outputStreamInfo)); - const bool onlyProvidesSamples = outputStreamInfo.dwFlags & MFT_OUTPUT_STREAM_PROVIDES_SAMPLES; - const bool canProvideSamples = outputStreamInfo.dwFlags & MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES; - const bool mustAllocateSample = - (!onlyProvidesSamples && !canProvideSamples) || - (!onlyProvidesSamples && (outputStreamInfo.dwFlags & MFT_PROCESS_OUTPUT_DISCARD_WHEN_NO_BUFFER)); - - MFT_OUTPUT_DATA_BUFFER outputSamples{}; - IMFSample* outputSample = nullptr; - - // If so, do the allocation - if (mustAllocateSample) - { - OK_OR_BAIL(MFCreateSample(&outputSample)); - OK_OR_BAIL(outputSample->SetSampleDuration(333333)); - OK_OR_BAIL(outputSample->SetSampleTime(1)); - OK_OR_BAIL(outputSample->SetUINT32(MF_MT_VIDEO_ROTATION, MFVideoRotationFormat::MFVideoRotationFormat_0)); - IMFMediaBuffer* outputMediaBuffer = nullptr; - OK_OR_BAIL( - MFCreateAlignedMemoryBuffer(outputStreamInfo.cbSize, outputStreamInfo.cbAlignment - 1, &outputMediaBuffer)); - OK_OR_BAIL(outputMediaBuffer->SetCurrentLength(outputStreamInfo.cbSize)); - OK_OR_BAIL(outputSample->AddBuffer(outputMediaBuffer)); - outputSamples.pSample = outputSample; - } - - // Finally, produce the output sample - DWORD processStatus = 0; - if (failed(videoTransformer->ProcessOutput(0, 1, &outputSamples, &processStatus))) - { - LOG("Failed to convert image frame"); - } - if (outputSamples.pEvents) - { - outputSamples.pEvents->Release(); - } - - return outputSamples.pSample; -} - -wil::com_ptr_nothrow LoadImageAsSample(wil::com_ptr_nothrow imageStream, - IMFMediaType* sampleMediaType, - const float quality) noexcept -{ - UINT targetWidth = 0; - UINT targetHeight = 0; - OK_OR_BAIL(MFGetAttributeSize(sampleMediaType, MF_MT_FRAME_SIZE, &targetWidth, &targetHeight)); - MFT_REGISTER_TYPE_INFO outputType = { MFMediaType_Video, {} }; - OK_OR_BAIL(sampleMediaType->GetGUID(MF_MT_SUBTYPE, &outputType.guidSubtype)); - - IWICImagingFactory* pWIC = _GetWIC(); - if (!pWIC) - { - LOG("Failed to create IWICImagingFactory"); - return nullptr; - } - - if (!imageStream) - { - return nullptr; - } - - const auto srcImageBitmap = LoadAsRGB24BitmapWithSize(pWIC, imageStream, targetWidth, targetHeight); - if (!srcImageBitmap) - { - return nullptr; - } - - // First, let's create a sample containing RGB24 bitmap - IMFSample* outputSample = nullptr; - OK_OR_BAIL(MFCreateSample(&outputSample)); - OK_OR_BAIL(outputSample->SetUINT32(MF_MT_VIDEO_ROTATION, MFVideoRotationFormat::MFVideoRotationFormat_0)); - OK_OR_BAIL(outputSample->SetSampleDuration(333333)); - OK_OR_BAIL(outputSample->SetSampleTime(1)); - IMFMediaBuffer* outputMediaBuffer = nullptr; - const DWORD nPixelBytes = targetWidth * targetHeight * 3; - OK_OR_BAIL(MFCreateAlignedMemoryBuffer(nPixelBytes, MF_64_BYTE_ALIGNMENT, &outputMediaBuffer)); - - const UINT stride = 3 * targetWidth; - - DWORD max_length = 0, current_length = 0; - BYTE* sampleBufferMemory = nullptr; - OK_OR_BAIL(outputMediaBuffer->Lock(&sampleBufferMemory, &max_length, ¤t_length)); - OK_OR_BAIL(srcImageBitmap->CopyPixels(nullptr, stride, nPixelBytes, sampleBufferMemory)); - OK_OR_BAIL(outputMediaBuffer->Unlock()); - - OK_OR_BAIL(outputMediaBuffer->SetCurrentLength(nPixelBytes)); - OK_OR_BAIL(outputSample->AddBuffer(outputMediaBuffer)); - - if (outputType.guidSubtype == MFVideoFormat_RGB24) - { - return outputSample; - } - - // Special case for mjpg, since we need to use jpg container for it instead of supplying raw pixels - if (outputType.guidSubtype == MFVideoFormat_MJPG) - { - // Use an intermediate jpg container sample which will be transcoded to the target format - wil::com_ptr_nothrow jpgStream = - EncodeBitmapToContainer(pWIC, srcImageBitmap, GUID_ContainerFormatJpeg, targetWidth, targetHeight, quality); - - // Obtain stream size and lock its memory pointer - STATSTG intermediateStreamStat{}; - OK_OR_BAIL(jpgStream->Stat(&intermediateStreamStat, STATFLAG_NONAME)); - const ULONGLONG jpgStreamSize = intermediateStreamStat.cbSize.QuadPart; - HGLOBAL streamMemoryHandle{}; - OK_OR_BAIL(GetHGlobalFromStream(jpgStream.get(), &streamMemoryHandle)); - - auto jpgStreamMemory = static_cast(GlobalLock(streamMemoryHandle)); - auto unlockJpgStreamMemory = wil::scope_exit([jpgStreamMemory] { GlobalUnlock(jpgStreamMemory); }); - - // Create a sample from the input image buffer - wil::com_ptr_nothrow jpgSample; - OK_OR_BAIL(MFCreateSample(&jpgSample)); - OK_OR_BAIL(jpgSample->SetUINT32(MF_MT_VIDEO_ROTATION, MFVideoRotationFormat::MFVideoRotationFormat_0)); - IMFMediaBuffer* inputMediaBuffer = nullptr; - OK_OR_BAIL(MFCreateAlignedMemoryBuffer(static_cast(jpgStreamSize), MF_64_BYTE_ALIGNMENT, &inputMediaBuffer)); - BYTE* inputBuf = nullptr; - OK_OR_BAIL(inputMediaBuffer->Lock(&inputBuf, &max_length, ¤t_length)); - if (max_length < jpgStreamSize) - { - return nullptr; - } - - std::copy(jpgStreamMemory, jpgStreamMemory + jpgStreamSize, inputBuf); - unlockJpgStreamMemory.reset(); - OK_OR_BAIL(inputMediaBuffer->Unlock()); - OK_OR_BAIL(inputMediaBuffer->SetCurrentLength(static_cast(jpgStreamSize))); - OK_OR_BAIL(jpgSample->AddBuffer(inputMediaBuffer)); - - return jpgSample; - } - - // Now we are ready to convert it to the requested media type - MFT_REGISTER_TYPE_INFO intermediateType = { MFMediaType_Video, MFVideoFormat_RGB24 }; - - // But if no conversion is needed, just return the input sample - - return ConvertIMFVideoSample(intermediateType, sampleMediaType, outputSample, targetWidth, targetHeight); -} \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/Resources.resx b/src/modules/videoconference/VideoConferenceProxyFilter/Resources.resx deleted file mode 100644 index 4770a524fe..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/Resources.resx +++ /dev/null @@ -1,124 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - VideoCaptureProxyFilter - do not loc, product name - - diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.cpp b/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.cpp deleted file mode 100644 index 7b97891c5b..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.cpp +++ /dev/null @@ -1,636 +0,0 @@ -#include "Logging.h" -#include "VideoCaptureDevice.h" - -#include -#include - -struct VideoCaptureReceiverFilter : winrt::implements -{ - FILTER_STATE _state = State_Stopped; - IFilterGraph* _graph = nullptr; - wil::com_ptr_nothrow _videoReceiverPin; - - ULONG STDMETHODCALLTYPE GetMiscFlags() override { return AM_FILTER_MISC_FLAGS_IS_RENDERER; } - - HRESULT STDMETHODCALLTYPE GetClassID(CLSID*) override { return E_NOTIMPL; } - - HRESULT STDMETHODCALLTYPE Stop() override - { - _state = State_Stopped; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE Pause() override - { - _state = State_Paused; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME) override - { - _state = State_Running; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE GetState(DWORD, FILTER_STATE* outState) override - { - *outState = _state; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock** outRefClock) override - { - *outRefClock = nullptr; - return NOERROR; - } - - HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock*) override { return S_OK; } - - HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins** ppEnum) override - { - auto enumerator = winrt::make_self>(); - enumerator->_objects.emplace_back(_videoReceiverPin); - *ppEnum = enumerator.detach(); - - return S_OK; - } - - HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR, IPin**) override { return E_NOTIMPL; } - - HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR) override - { - _graph = pGraph; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO* pInfo) override - { - std::copy(std::begin(NAME), std::end(NAME), pInfo->achName); - if (_graph) - { - pInfo->pGraph = _graph; - _graph->AddRef(); - } - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR* pVendorInfo) override - { - auto info = static_cast(CoTaskMemAlloc(sizeof(VENDOR))); - std::copy(std::begin(VENDOR), std::end(VENDOR), info); - *pVendorInfo = info; - return S_OK; - } - - virtual ~VideoCaptureReceiverFilter() = default; - - constexpr static inline wchar_t NAME[] = L"PowerToysVCMCaptureFilter"; - constexpr static inline wchar_t VENDOR[] = L"Microsoft Corporation"; -}; - -struct VideoCaptureReceiverPin : winrt::implements -{ - VideoCaptureReceiverFilter* _owningFilter = nullptr; - unique_media_type_ptr _expectedMediaType; - wil::com_ptr_nothrow _captureInputPin; - unique_media_type_ptr _inputCaptureMediaType; - std::atomic_bool _flushing = false; - VideoCaptureDevice::callback_t _frameCallback; - - wil::com_ptr_nothrow _allocator; - - VideoCaptureReceiverPin(unique_media_type_ptr mediaType, VideoCaptureReceiverFilter* filter) : - _expectedMediaType{ std::move(mediaType) }, _owningFilter{ filter } - { - } - - HRESULT STDMETHODCALLTYPE Connect(IPin*, const AM_MEDIA_TYPE* pmt) override - { - if (_owningFilter->_state == State_Running) - { - return VFW_E_NOT_STOPPED; - } - - if (_captureInputPin) - { - return VFW_E_ALREADY_CONNECTED; - } - - if (!pmt || pmt->majortype == GUID_NULL) - { - return S_OK; - } - - if (pmt->majortype != _expectedMediaType->majortype || pmt->subtype != _expectedMediaType->subtype) - { - return S_FALSE; - } - - return S_OK; - } - - HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt) override - { - if (!pConnector || !pmt) - { - return E_POINTER; - } - - if (_captureInputPin) - { - return VFW_E_ALREADY_CONNECTED; - } - - if (_owningFilter->_state != State_Stopped) - { - return VFW_E_NOT_STOPPED; - } - - if (QueryAccept(pmt) != S_OK) - { - return VFW_E_TYPE_NOT_ACCEPTED; - } - - _captureInputPin = pConnector; - _inputCaptureMediaType = CopyMediaType(pmt); - - return S_OK; - } - - HRESULT STDMETHODCALLTYPE Disconnect() override - { - _allocator.reset(); - _captureInputPin.reset(); - _inputCaptureMediaType.reset(); - return S_OK; - } - - HRESULT STDMETHODCALLTYPE ConnectedTo(IPin** pPin) override - { - if (!_captureInputPin) - { - return VFW_E_NOT_CONNECTED; - } - - return _captureInputPin.try_copy_to(pPin) ? S_OK : E_FAIL; - } - - HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE* pmt) override - { - if (!pmt) - { - return E_POINTER; - } - - if (!_inputCaptureMediaType) - { - return VFW_E_NOT_CONNECTED; - } - - *pmt = *CopyMediaType(_inputCaptureMediaType.get()).release(); - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO* pInfo) override - { - if (!pInfo) - { - return E_POINTER; - } - - pInfo->pFilter = _owningFilter; - if (_owningFilter) - { - _owningFilter->AddRef(); - } - - pInfo->dir = PINDIR_INPUT; - std::copy(std::begin(NAME), std::end(NAME), pInfo->achName); - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION* pPinDir) override - { - if (!pPinDir) - { - return E_POINTER; - } - - *pPinDir = PINDIR_INPUT; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryId(LPWSTR* lpId) override - { - if (!lpId) - { - return E_POINTER; - } - - *lpId = static_cast(CoTaskMemAlloc(sizeof(NAME))); - - std::copy(std::begin(NAME), std::end(NAME), *lpId); - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE* pmt) override - { - if (!pmt) - { - return E_POINTER; - } - - if (pmt->majortype != _expectedMediaType->majortype || pmt->subtype != _expectedMediaType->subtype) - { - return S_FALSE; - } - - if (_captureInputPin) - { -// disable warning 26492 - Don't use const_cast to cast away const -// reset needs 'pmt' to be non-const, we can't easily change the query accept prototype -// because of the inheritance. -#pragma warning(suppress : 26492) - _inputCaptureMediaType.reset(const_cast(pmt)); - } - - return S_OK; - } - - HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes** ppEnum) override - { - if (!ppEnum) - { - return E_POINTER; - } - - auto enumerator = winrt::make_self(); - enumerator->_objects.emplace_back(CopyMediaType(_expectedMediaType.get())); - *ppEnum = enumerator.detach(); - - return S_OK; - } - - HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin**, ULONG*) override { return E_NOTIMPL; } - - HRESULT STDMETHODCALLTYPE EndOfStream() override { return S_OK; } - - HRESULT STDMETHODCALLTYPE BeginFlush() override - { - _flushing = true; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE EndFlush() override - { - _flushing = false; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME, REFERENCE_TIME, double) override { return S_OK; } - - HRESULT STDMETHODCALLTYPE GetAllocator(IMemAllocator** allocator) override - { - VERBOSE_LOG; - if (!_allocator) - { - return VFW_E_NO_ALLOCATOR; - } - - return _allocator.try_copy_to(allocator) ? S_OK : E_FAIL; - } - - HRESULT STDMETHODCALLTYPE NotifyAllocator(IMemAllocator* allocator, BOOL readOnly) override - { - VERBOSE_LOG; - LOG(readOnly ? "Allocator READONLY: true" : "Allocator READONLY: false"); - _allocator = allocator; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE GetAllocatorRequirements(ALLOCATOR_PROPERTIES*) override { return E_NOTIMPL; } - - HRESULT STDMETHODCALLTYPE Receive(IMediaSample* pSample) override - { - if (_flushing) - { - return S_FALSE; - } - - if (!pSample) - { - return E_POINTER; - } - - if (pSample && _frameCallback) - { - _frameCallback(pSample); - } - - return S_OK; - } - - HRESULT STDMETHODCALLTYPE ReceiveMultiple(IMediaSample** pSamples, long nSamples, long* nSamplesProcessed) override - { - if (!pSamples && nSamples) - { - return E_POINTER; - } - - if (_flushing) - { - return S_FALSE; - } - - for (long i = 0; i < nSamples; i++) - { - Receive(pSamples[i]); - } - - *nSamplesProcessed = nSamples; - return S_OK; - } - - HRESULT STDMETHODCALLTYPE ReceiveCanBlock() override { return S_FALSE; } - - virtual ~VideoCaptureReceiverPin() = default; - - constexpr static inline wchar_t NAME[] = L"PowerToysVCMCapturePin"; -}; - -constexpr long MINIMAL_FPS_ALLOWED = 29; - -const char* GetMediaSubTypeString(const GUID& guid) -{ - if (guid == MEDIASUBTYPE_RGB24) - { - return "MEDIASUBTYPE_RGB24"; - } - - if (guid == MEDIASUBTYPE_YUY2) - { - return "MEDIASUBTYPE_YUY2"; - } - - if (guid == MEDIASUBTYPE_MJPG) - { - return "MEDIASUBTYPE_MJPG"; - } - - if (guid == MEDIASUBTYPE_NV12) - { - return "MEDIASUBTYPE_NV12"; - } - - return "MEDIASUBTYPE_UNKNOWN"; -} - -std::optional SelectBestMediaType(wil::com_ptr_nothrow& pin) -{ - VERBOSE_LOG; - wil::com_ptr_nothrow mediaTypeEnum; - if (pin->EnumMediaTypes(&mediaTypeEnum); !mediaTypeEnum) - { - return std::nullopt; - } - - ULONG _ = 0; - VideoStreamFormat bestFormat; - unique_media_type_ptr mt; - while (mediaTypeEnum->Next(1, wil::out_param(mt), &_) == S_OK) - { - if (mt->majortype != MEDIATYPE_Video) - { - continue; - } - - auto format = reinterpret_cast(mt->pbFormat); - if (!format || !format->AvgTimePerFrame) - { - LOG("VideoInfoHeader not found"); - continue; - } - - const auto formatAvgFPS = 10000000LL / format->AvgTimePerFrame; - if (format->AvgTimePerFrame > bestFormat.avgFrameTime || formatAvgFPS < MINIMAL_FPS_ALLOWED) - { - continue; - } - - if (format->bmiHeader.biWidth < bestFormat.width || format->bmiHeader.biHeight < bestFormat.height) - { - continue; - } - - if (mt->subtype != MEDIASUBTYPE_YUY2 && mt->subtype != MEDIASUBTYPE_MJPG && mt->subtype != MEDIASUBTYPE_RGB24) - { - OLECHAR* guidString; - StringFromCLSID(mt->subtype, &guidString); - LOG("Skipping mediatype due to unsupported subtype: "); - LOG(guidString); - ::CoTaskMemFree(guidString); - continue; - } - - bestFormat.avgFrameTime = format->AvgTimePerFrame; - bestFormat.width = format->bmiHeader.biWidth; - bestFormat.height = format->bmiHeader.biHeight; - bestFormat.mediaType = std::move(mt); - } - - if (!bestFormat.mediaType) - { - LOG(L"Couldn't select a suitable media format"); - return std::nullopt; - } - - char selectedFormat[512]{}; - sprintf_s(selectedFormat, "Selected media format: %s %ldx%ld %lld fps", GetMediaSubTypeString(bestFormat.mediaType->subtype), bestFormat.width, bestFormat.height, 10000000LL / bestFormat.avgFrameTime); - LOG(selectedFormat); - - return std::move(bestFormat); -} - -std::vector VideoCaptureDevice::ListAll() -{ - std::vector devices; - auto enumeratorFactory = wil::CoCreateInstanceNoThrow(CLSID_SystemDeviceEnum); - if (!enumeratorFactory) - { - LOG("Couldn't create devenum factory"); - return devices; - } - - wil::com_ptr_nothrow enumMoniker; - enumeratorFactory->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &enumMoniker, CDEF_DEVMON_PNP_DEVICE); - if (!enumMoniker) - { - LOG("Couldn't create class enumerator"); - return devices; - } - - ULONG _ = 0; - wil::com_ptr_nothrow moniker; - while (enumMoniker->Next(1, &moniker, &_) == S_OK) - { - LOG("Inspecting moniker"); - VideoCaptureDeviceInfo deviceInfo; - - wil::com_ptr_nothrow propertyData; - moniker->BindToStorage(nullptr, nullptr, IID_IPropertyBag, reinterpret_cast(&propertyData)); - if (!propertyData) - { - LOG("BindToStorage failed"); - continue; - } - - wil::unique_variant propVal; - propVal.vt = VT_BSTR; - - if (FAILED(propertyData->Read(L"FriendlyName", &propVal, nullptr))) - { - LOG("Couldn't obtain FriendlyName property"); - continue; - } - - deviceInfo.friendlyName = { propVal.bstrVal, SysStringLen(propVal.bstrVal) }; - LOG(deviceInfo.friendlyName); - - propVal.reset(); - propVal.vt = VT_BSTR; - - if (FAILED(propertyData->Read(L"DevicePath", &propVal, nullptr))) - { - LOG("Couldn't obtain DevicePath property"); - continue; - } - deviceInfo.devicePath = { propVal.bstrVal, SysStringLen(propVal.bstrVal) }; - - wil::com_ptr_nothrow filter; - moniker->BindToObject(nullptr, nullptr, IID_IBaseFilter, reinterpret_cast(&filter)); - if (!filter) - { - LOG("Couldn't BindToObject"); - continue; - } - - wil::com_ptr_nothrow pinsEnum; - if (FAILED(filter->EnumPins(&pinsEnum))) - { - LOG("BindToObject EnumPins"); - continue; - } - - wil::com_ptr_nothrow pin; - while (pinsEnum->Next(1, &pin, &_) == S_OK) - { - LOG("Inspecting pin"); - // Skip pins which do not belong to capture category - GUID category{}; - DWORD __; - if (auto props = pin.try_copy(); - !props || - FAILED(props->Get(AMPROPSETID_Pin, AMPROPERTY_PIN_CATEGORY, nullptr, 0, &category, sizeof(GUID), &__)) || - category != PIN_CATEGORY_CAPTURE) - { - continue; - } - - // Skip non-output pins - if (PIN_DIRECTION direction = {}; FAILED(pin->QueryDirection(&direction)) || direction != PINDIR_OUTPUT) - { - continue; - } - - LOG("Found a pin of suitable category and direction, selecting format"); - auto bestFormat = SelectBestMediaType(pin); - if (!bestFormat) - { - continue; - } - - deviceInfo.captureOutputPin = std::move(pin); - deviceInfo.bestFormat = std::move(bestFormat.value()); - deviceInfo.captureOutputFilter = std::move(filter); - devices.emplace_back(std::move(deviceInfo)); - } - } - - return devices; -} - -std::optional VideoCaptureDevice::Create(VideoCaptureDeviceInfo&& vdi, callback_t callback) -{ - VERBOSE_LOG; - VideoCaptureDevice result; - - result._graph = wil::CoCreateInstanceNoThrow(CLSID_FilterGraph); - result._builder = wil::CoCreateInstanceNoThrow(CLSID_CaptureGraphBuilder2); - if (!result._graph || !result._builder) - { - return std::nullopt; - } - - if (FAILED(result._builder->SetFiltergraph(result._graph.get()))) - { - return std::nullopt; - } - - result._control = result._graph.try_query(); - if (!result._control) - { - return std::nullopt; - } - - auto pinConfig = vdi.captureOutputPin.try_query(); - if (!pinConfig) - { - return std::nullopt; - } - - if (FAILED(pinConfig->SetFormat(vdi.bestFormat.mediaType.get()))) - { - return std::nullopt; - } - - auto captureInputFilter = winrt::make_self(); - auto receiverPin = winrt::make_self(std::move(vdi.bestFormat.mediaType), captureInputFilter.get()); - receiverPin->_frameCallback = std::move(callback); - captureInputFilter->_videoReceiverPin.attach(receiverPin.get()); - auto detachReceiverPin = wil::scope_exit([&receiverPin]() { receiverPin.detach(); }); - - if (FAILED(result._graph->AddFilter(captureInputFilter.get(), nullptr))) - { - return std::nullopt; - } - - if (FAILED(result._graph->AddFilter(vdi.captureOutputFilter.get(), nullptr))) - { - return std::nullopt; - } - - if (FAILED(result._graph->ConnectDirect(vdi.captureOutputPin.get(), captureInputFilter->_videoReceiverPin.get(), nullptr))) - { - return std::nullopt; - } - - result._allocator = receiverPin->_allocator; - return std::make_optional(std::move(result)); -} - -bool VideoCaptureDevice::StartCapture() -{ - VERBOSE_LOG; - return SUCCEEDED(_control->Run()); -} - -bool VideoCaptureDevice::StopCapture() -{ - VERBOSE_LOG; - return SUCCEEDED(_control->Stop()); -} - -VideoCaptureDevice::~VideoCaptureDevice() -{ - StopCapture(); -} diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.h b/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.h deleted file mode 100644 index 3af63691a6..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureDevice.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once -#include -#define WIN32_LEAN_AND_MEAN - -#include -#include - -#include - -#include -#include -#include -#include - -#include "DirectShowUtils.h" - -struct VideoStreamFormat -{ - long width = 0; - long height = 0; - REFERENCE_TIME avgFrameTime = std::numeric_limits::max(); - unique_media_type_ptr mediaType; - - VideoStreamFormat() = default; - - VideoStreamFormat(const VideoStreamFormat&) = delete; - VideoStreamFormat& operator=(const VideoStreamFormat&) = delete; - - VideoStreamFormat(VideoStreamFormat&&) = default; - VideoStreamFormat& operator=(VideoStreamFormat&&) = default; -}; - -struct VideoCaptureDeviceInfo -{ - std::wstring friendlyName; - std::wstring devicePath; - wil::com_ptr_nothrow captureOutputPin; - wil::com_ptr_nothrow captureOutputFilter; - VideoStreamFormat bestFormat; -}; - -class VideoCaptureDevice final -{ -public: - wil::com_ptr_nothrow _allocator; - - using callback_t = std::function; - - static std::vector ListAll(); - static std::optional Create(VideoCaptureDeviceInfo&& vdi, callback_t callback); - - bool StartCapture(); - bool StopCapture(); - - ~VideoCaptureDevice(); - -private: - wil::com_ptr_nothrow _graph; - wil::com_ptr_nothrow _builder; - wil::com_ptr_nothrow _control; - callback_t _callback; -}; diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.cpp b/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.cpp deleted file mode 100644 index 2a860a72fa..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.cpp +++ /dev/null @@ -1,937 +0,0 @@ -#include "VideoCaptureProxyFilter.h" - -#include "VideoCaptureDevice.h" -#include -#include -#include -#include - -constexpr static inline wchar_t FILTER_NAME[] = L"PowerToysVCMProxyFilter"; -constexpr static inline wchar_t PIN_NAME[] = L"PowerToysVCMProxyPIN"; -constexpr static inline wchar_t VENDOR[] = L"Microsoft Corporation"; - -namespace -{ - constexpr float initialJpgQuality = 0.5f; - constexpr std::array overlayColor = { 0, 0, 0 }; - // clang-format off - unsigned char bmpPixelData[58] = { - 0x42, 0x4D, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, - 0x00, 0x00, 0x28, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, - 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0xC4, 0x0E, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, overlayColor[0], overlayColor[1], overlayColor[2], 0x00 - }; - // clang-format on -} - -wil::com_ptr_nothrow VideoCaptureProxyPin::FindAllocator() -{ - auto allocator = GetPinAllocator(_connectedInputPin); - if (!allocator && _owningFilter->_captureDevice) - { - allocator = _owningFilter->_captureDevice->_allocator; - } - - return allocator; -} - -wil::com_ptr_nothrow LoadImageAsSample(wil::com_ptr_nothrow imageStream, - IMFMediaType* sampleMediaType, - const float quality) noexcept; -bool ReencodeJPGImage(BYTE* imageBuf, const DWORD imageSize, DWORD& reencodedSize); - -HRESULT VideoCaptureProxyPin::Connect(IPin* pReceivePin, const AM_MEDIA_TYPE*) -{ - if (!pReceivePin) - { - LOG("VideoCaptureProxyPin::Connect FAILED pReceivePin"); - return E_POINTER; - } - - if (_owningFilter->_state == State_Running) - { - LOG("VideoCaptureProxyPin::Connect FAILED _owningFilter->_state"); - return VFW_E_NOT_STOPPED; - } - - if (_connectedInputPin) - { - LOG("VideoCaptureProxyPin::Connect FAILED _connectedInputPin"); - return VFW_E_ALREADY_CONNECTED; - } - - if (FAILED(pReceivePin->ReceiveConnection(this, _mediaFormat.get()))) - { - LOG("VideoCaptureProxyPin::Connect FAILED pReceivePin->ReceiveConnection"); - return E_POINTER; - } - - _connectedInputPin = pReceivePin; - - auto memInput = _connectedInputPin.try_query(); - if (!memInput) - { - LOG("VideoCaptureProxyPin::Connect FAILED _connectedInputPin.try_query"); - return VFW_E_NO_TRANSPORT; - } - - auto allocator = FindAllocator(); - if (allocator == nullptr) - { - LOG("VideoCaptureProxyPin::Connect FAILED FindAllocator"); - return VFW_E_NO_TRANSPORT; - } - - if (FAILED(memInput->NotifyAllocator(allocator.get(), false))) - { - LOG("VideoCaptureProxyPin::Connect FAILED memInput->NotifyAllocator"); - return VFW_E_NO_TRANSPORT; - } - - return S_OK; -} - -HRESULT VideoCaptureProxyPin::ReceiveConnection(IPin*, const AM_MEDIA_TYPE*) -{ - return S_OK; -} - -HRESULT VideoCaptureProxyPin::Disconnect(void) -{ - if (!_connectedInputPin) - { - LOG("VideoCaptureProxyPin::Disconnect FAILED _connectedInputPin"); - return S_FALSE; - } - - _connectedInputPin.reset(); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::ConnectedTo(IPin** pPin) -{ - if (!_connectedInputPin) - { - *pPin = nullptr; - return VFW_E_NOT_CONNECTED; - } - - return _connectedInputPin.try_copy_to(pPin) ? S_OK : E_FAIL; -} - -HRESULT VideoCaptureProxyPin::ConnectionMediaType(AM_MEDIA_TYPE* pmt) -{ - if (!_connectedInputPin) - { - LOG("VideoCaptureProxyPin::ConnectionMediaType FAILED _connectedInputPin"); - return VFW_E_NOT_CONNECTED; - } - - *pmt = *CopyMediaType(_mediaFormat.get()).release(); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::QueryPinInfo(PIN_INFO* pInfo) -{ - if (!pInfo) - { - LOG("VideoCaptureProxyPin::QueryPinInfo FAILED pInfo"); - return E_POINTER; - } - - pInfo->pFilter = _owningFilter; - if (_owningFilter) - { - _owningFilter->AddRef(); - } - - if (_mediaFormat->majortype == MEDIATYPE_Video) - { - std::copy(std::begin(PIN_NAME), std::end(PIN_NAME), pInfo->achName); - } - - pInfo->dir = PINDIR_OUTPUT; - return S_OK; -} - -HRESULT VideoCaptureProxyPin::QueryDirection(PIN_DIRECTION* pPinDir) -{ - if (!pPinDir) - { - LOG("VideoCaptureProxyPin::QueryDirection FAILED pPinDir"); - return E_POINTER; - } - - *pPinDir = PINDIR_OUTPUT; - return S_OK; -} - -HRESULT VideoCaptureProxyPin::QueryId(LPWSTR* Id) -{ - if (!Id) - { - LOG("VideoCaptureProxyPin::QueryId FAILED Id"); - return E_POINTER; - } - - *Id = static_cast(CoTaskMemAlloc(sizeof(PIN_NAME))); - std::copy(std::begin(PIN_NAME), std::end(PIN_NAME), *Id); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::QueryAccept(const AM_MEDIA_TYPE*) -{ - return S_OK; -} - -HRESULT VideoCaptureProxyPin::EnumMediaTypes(IEnumMediaTypes** ppEnum) -{ - if (!ppEnum) - { - LOG("VideoCaptureProxyPin::EnumMediaTypes FAILED ppEnum"); - return E_POINTER; - } - - *ppEnum = nullptr; - - auto enumerator = winrt::make_self(); - enumerator->_objects.emplace_back(CopyMediaType(_mediaFormat.get())); - *ppEnum = enumerator.detach(); - - return S_OK; -} - -HRESULT VideoCaptureProxyPin::QueryInternalConnections(IPin** pins, ULONG*) -{ - if (pins) - { - *pins = nullptr; - } - return E_NOTIMPL; -} - -HRESULT VideoCaptureProxyPin::EndOfStream(void) -{ - return S_OK; -} - -HRESULT VideoCaptureProxyPin::BeginFlush(void) -{ - _flushing = true; - return S_OK; -} - -HRESULT VideoCaptureProxyPin::EndFlush(void) -{ - _flushing = false; - return S_OK; -} - -HRESULT VideoCaptureProxyPin::NewSegment(REFERENCE_TIME, REFERENCE_TIME, double) -{ - return S_OK; -} - -HRESULT VideoCaptureProxyPin::SetFormat(AM_MEDIA_TYPE* pmt) -{ - if (pmt == nullptr) - { - return S_OK; - } - - _mediaFormat = CopyMediaType(pmt); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::GetFormat(AM_MEDIA_TYPE** ppmt) -{ - if (!ppmt) - { - LOG("VideoCaptureProxyPin::GetFormat FAILED ppmt"); - return E_POINTER; - } - *ppmt = CopyMediaType(_mediaFormat.get()).release(); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::GetNumberOfCapabilities(int* piCount, int* piSize) -{ - if (!piCount || !piSize) - { - LOG("VideoCaptureProxyPin::GetNumberOfCapabilities FAILED piCount || piSize"); - return E_POINTER; - } - - *piCount = 1; - *piSize = sizeof(VIDEO_STREAM_CONFIG_CAPS); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::GetStreamCaps(int iIndex, AM_MEDIA_TYPE** ppmt, BYTE* pSCC) -{ - if (!ppmt || !pSCC) - { - LOG("VideoCaptureProxyPin::GetStreamCaps FAILED ppmt || pSCC"); - return E_POINTER; - } - - if (iIndex != 0) - { - LOG("VideoCaptureProxyPin::GetStreamCaps FAILED iIndex"); - return S_FALSE; - } - - VIDEOINFOHEADER* vih = reinterpret_cast(_mediaFormat->pbFormat); - - VIDEO_STREAM_CONFIG_CAPS caps{}; - caps.guid = FORMAT_VideoInfo; - caps.MinFrameInterval = vih->AvgTimePerFrame; - caps.MaxFrameInterval = vih->AvgTimePerFrame; - caps.MinOutputSize.cx = vih->bmiHeader.biWidth; - caps.MinOutputSize.cy = vih->bmiHeader.biHeight; - caps.MaxOutputSize = caps.MinOutputSize; - caps.InputSize = caps.MinOutputSize; - caps.MinCroppingSize = caps.MinOutputSize; - caps.MaxCroppingSize = caps.MinOutputSize; - caps.CropGranularityX = vih->bmiHeader.biWidth; - caps.CropGranularityY = vih->bmiHeader.biHeight; - caps.MinBitsPerSecond = vih->dwBitRate; - caps.MaxBitsPerSecond = caps.MinBitsPerSecond; - - *ppmt = CopyMediaType(_mediaFormat.get()).release(); - - const auto caps_begin = reinterpret_cast(&caps); - std::copy(caps_begin, caps_begin + sizeof(caps), pSCC); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::Set(REFGUID, DWORD, LPVOID, DWORD, LPVOID, DWORD) -{ - return E_NOTIMPL; -} - -HRESULT VideoCaptureProxyPin::Get( - REFGUID guidPropSet, - DWORD dwPropID, - LPVOID, - DWORD, - LPVOID pPropData, - DWORD cbPropData, - DWORD* pcbReturned) -{ - if (guidPropSet != AMPROPSETID_Pin) - { - LOG("VideoCaptureProxyPin::Get FAILED guidPropSet"); - return E_PROP_SET_UNSUPPORTED; - } - - if (dwPropID != AMPROPERTY_PIN_CATEGORY) - { - LOG("VideoCaptureProxyPin::Get FAILED dwPropID"); - return E_PROP_ID_UNSUPPORTED; - } - - if (!pPropData) - { - LOG("VideoCaptureProxyPin::Get FAILED pPropData || pcbReturned"); - return E_POINTER; - } - - if (pcbReturned) - { - *pcbReturned = sizeof(GUID); - } - - if (cbPropData < sizeof(GUID)) - { - LOG("VideoCaptureProxyPin::Get FAILED cbPropData"); - return E_UNEXPECTED; - } - - *static_cast(pPropData) = PIN_CATEGORY_CAPTURE; - - LOG("VideoCaptureProxyPin::Get SUCCESS"); - return S_OK; -} - -HRESULT VideoCaptureProxyPin::QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD* pTypeSupport) -{ - if (guidPropSet != AMPROPSETID_Pin) - { - LOG("VideoCaptureProxyPin::QuerySupported FAILED guidPropSet"); - return E_PROP_SET_UNSUPPORTED; - } - - if (dwPropID != AMPROPERTY_PIN_CATEGORY) - { - LOG("VideoCaptureProxyPin::QuerySupported FAILED dwPropID"); - return E_PROP_ID_UNSUPPORTED; - } - - if (pTypeSupport) - { - *pTypeSupport = KSPROPERTY_SUPPORT_GET; - } - - return S_OK; -} - -long GetImageSize(wil::com_ptr_nothrow& image) -{ - if (!image) - { - return 0; - } - - DWORD imageSize = 0; - wil::com_ptr_nothrow imageBuf; - - OK_OR_BAIL(image->GetBufferByIndex(0, &imageBuf)); - OK_OR_BAIL(imageBuf->GetCurrentLength(&imageSize)); - return imageSize; -} - -void ReencodeFrame(IMediaSample* frame) -{ - BYTE* frameData = nullptr; - frame->GetPointer(&frameData); - if (!frameData) - { - LOG("VideoCaptureProxyPin::ReencodeFrame FAILED frameData"); - return; - } - const DWORD frameSize = frame->GetSize(); - DWORD reencodedSize = 0; - if (!ReencodeJPGImage(frameData, frameSize, reencodedSize)) - { - LOG("VideoCaptureProxyPin::ReencodeJPGImage FAILED"); - return; - } - frame->SetActualDataLength(reencodedSize); -} - -bool OverwriteFrame(IMediaSample* frame, wil::com_ptr_nothrow& image) -{ - if (!image) - { - return false; - } - - BYTE* frameData = nullptr; - frame->GetPointer(&frameData); - if (!frameData) - { - LOG("VideoCaptureProxyPin::OverwriteFrame FAILED frameData"); - return false; - } - - wil::com_ptr_nothrow imageBuf; - const DWORD frameSize = frame->GetSize(); - - image->GetBufferByIndex(0, &imageBuf); - if (!imageBuf) - { - LOG("VideoCaptureProxyPin::OverwriteFrame FAILED imageBuf"); - return false; - } - - BYTE* imageData = nullptr; - DWORD _ = 0, imageSize = 0; - imageBuf->Lock(&imageData, &_, &imageSize); - if (!imageData) - { - LOG("VideoCaptureProxyPin::OverwriteFrame FAILED imageData"); - return false; - } - - if (imageSize > frameSize && failed(frame->SetActualDataLength(imageSize))) - { - char buf[512]{}; - sprintf_s(buf, "VideoCaptureProxyPin::OverwriteFrame FAILED overlay image size %lu is larger than frame size %lu", imageSize, frameSize); - LOG(buf); - imageBuf->Unlock(); - return false; - } - - std::copy(imageData, imageData + imageSize, frameData); - imageBuf->Unlock(); - frame->SetActualDataLength(imageSize); - - return true; -} - -//#define DEBUG_FRAME_DATA -//#define DEBUG_OVERWRITE_FRAME -//#define DEBUG_REENCODE_JPG_DATA - -#if defined(DEBUG_OVERWRITE_FRAME) -void DebugOverwriteFrame(IMediaSample* frame, std::string_view filepath) -{ - std::ifstream file{ filepath.data(), std::ios::binary }; - std::streampos fileSize = 0; - fileSize = file.tellg(); - file.seekg(0, std::ios::end); - fileSize = file.tellg() - fileSize; - - BYTE* frameData = nullptr; - if (!frame) - { - LOG("null frame provided"); - return; - } - frame->GetPointer(&frameData); - const DWORD frameSize = frame->GetSize(); - - if (fileSize > frameSize || !frameData) - { - LOG("frame can't be filled with data"); - return; - } - file.read((char*)frameData, fileSize); - frame->SetActualDataLength((long)fileSize); - LOG("DebugOverwriteFrame success"); -} - -#endif - -#if defined(DEBUG_FRAME_DATA) -#include - -namespace fs = std::filesystem; - -void DumpSample(IMediaSample* frame, const std::string_view filename) -{ - BYTE* data = nullptr; - frame->GetPointer(&data); - if (!data) - { - LOG("Couldn't get sample pointer"); - return; - } - const long nBytes = frame->GetActualDataLength(); - std::ofstream file{ fs::temp_directory_path() / filename, std::ios::binary }; - file.write((const char*)data, nBytes); -} -#endif - -VideoCaptureProxyFilter::VideoCaptureProxyFilter() : - _worker_thread{ - std::thread{ - [this]() { - using namespace std::chrono_literals; - const auto uninitializedSleepInterval = 15ms; - std::vector lowerJpgQualityModes = { 0.1f, 0.25f }; - while (!_shutdown_request) - { - std::unique_lock lock{ _worker_mutex }; - _worker_cv.wait(lock, [this] { return _pending_frame != nullptr || _shutdown_request; }); - - if (!_outPin || !_outPin->_connectedInputPin) - { - lock.unlock(); - std::this_thread::sleep_for(uninitializedSleepInterval); - continue; - } - - auto input = _outPin->_connectedInputPin.try_query(); - if (!input) - { - continue; - } - - IMediaSample* sample = _pending_frame; - if (!sample) - { - continue; - } -#if defined(DEBUG_FRAME_DATA) - static bool realFrameSaved = false; - if (!realFrameSaved) - { - DumpSample(sample, "PowerToysVCMRealFrame.binary"); - realFrameSaved = true; - } -#endif - auto newSettings = SyncCurrentSettings(); - if (newSettings.webcamDisabled) - { -#if !defined(DEBUG_OVERWRITE_FRAME) - bool overwritten = OverwriteFrame(_pending_frame, _overlayImage ? _overlayImage : _blankImage); - while (!overwritten && _overlayImage) - { - _overlayImage.reset(); - newSettings = SyncCurrentSettings(); - if (!lowerJpgQualityModes.empty() && newSettings.overlayImage) - { - const float quality = lowerJpgQualityModes.back(); - lowerJpgQualityModes.pop_back(); - char buf[512]{}; - sprintf_s(buf, "Reload overlay image with quality %f", quality); - LOG(buf); - _overlayImage = LoadImageAsSample(newSettings.overlayImage, _targetMediaType.get(), quality); - overwritten = OverwriteFrame(_pending_frame, _overlayImage); - } - else - { - LOG("Couldn't overwrite frame with image with all available quality modes."); - } - } -#if defined(DEBUG_FRAME_DATA) - static bool overlayFrameSaved = false; - if (!overlayFrameSaved && _overlayImage && overwritten) - { - DumpSample(sample, "PowerToysVCMOverlayImageFrame.binary"); - overlayFrameSaved = true; - } -#endif - if (!overwritten && !_overlayImage) - { - OverwriteFrame(_pending_frame, _blankImage); - } -#else - DebugOverwriteFrame(_pending_frame, "R:\\frame.data"); -#endif - } -#if defined(DEBUG_REENCODE_JPG_DATA) - else - { - GUID subtype{}; - _targetMediaType->GetGUID(MF_MT_SUBTYPE, &subtype); - if (subtype == MFVideoFormat_MJPG) - { - ReencodeFrame(_pending_frame); - } - } -#endif - - _pending_frame = nullptr; - input->Receive(sample); - sample->Release(); - } - } } - } -{ -} - -HRESULT VideoCaptureProxyFilter::Stop(void) -{ - if (_state != State_Stopped && _captureDevice) - { - _captureDevice->StopCapture(); - } - - _state = State_Stopped; - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::Pause(void) -{ - if (_state == State_Stopped) - { - std::unique_lock lock{ _worker_mutex }; - - if (!_outPin) - { - LOG("VideoCaptureProxyPin::Pause FAILED _outPin"); - return VFW_E_NO_TRANSPORT; - } - - auto allocator = _outPin->FindAllocator(); - if (!allocator) - { - LOG("VideoCaptureProxyPin::Pause FAILED allocator"); - return VFW_E_NO_TRANSPORT; - } - - allocator->Commit(); - } - - _state = State_Paused; - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::Run(REFERENCE_TIME) -{ - _state = State_Running; - if (_captureDevice) - { - _captureDevice->StartCapture(); - } - - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::GetState(DWORD, FILTER_STATE* State) -{ - *State = _state; - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::SetSyncSource(IReferenceClock* pClock) -{ - _clock = pClock; - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::GetSyncSource(IReferenceClock** pClock) -{ - if (!pClock) - { - return E_POINTER; - } - *pClock = nullptr; - return _clock.try_copy_to(pClock) ? S_OK : E_FAIL; -} - -GUID MapDShowSubtypeToMFT(const GUID& dshowSubtype) -{ - if (dshowSubtype == MEDIASUBTYPE_YUY2) - { - return MFVideoFormat_YUY2; - } - else if (dshowSubtype == MEDIASUBTYPE_MJPG) - { - return MFVideoFormat_MJPG; - } - else if (dshowSubtype == MEDIASUBTYPE_RGB24) - { - return MFVideoFormat_RGB24; - } - else - { - LOG("MapDShowSubtypeToMFT: Unsupported media type format provided!"); - return MFVideoFormat_MJPG; - } -} - -HRESULT VideoCaptureProxyFilter::EnumPins(IEnumPins** ppEnum) -{ - if (!ppEnum) - { - LOG("VideoCaptureProxyFilter::EnumPins null arg provided"); - return E_POINTER; - } - *ppEnum = nullptr; - auto enumerator = winrt::make_self>(); - auto detached_enumerator = enumerator.detach(); - *ppEnum = detached_enumerator; - - std::unique_lock lock{ _worker_mutex }; - - // We cannot initialize capture device and outpin during VideoCaptureProxyFilter ctor - // since that results in a deadlock -> initializing now. - if (!_outPin) - { - LOG("VideoCaptureProxyFilter::EnumPins started pin initialization"); - const auto newSettings = SyncCurrentSettings(); - std::vector webcams; - webcams = VideoCaptureDevice::ListAll(); - if (webcams.empty()) - { - LOG("VideoCaptureProxyFilter::EnumPins no physical webcams found"); - return E_FAIL; - } - - std::optional selectedCamIdx; - for (size_t i = 0; i < size(webcams); ++i) - { - if (newSettings.newCameraName == webcams[i].friendlyName) - { - selectedCamIdx = i; - LOG("VideoCaptureProxyFilter::EnumPins webcam selected using settings"); - break; - } - } - - if (!selectedCamIdx) - { - for (size_t i = 0; i < size(webcams); ++i) - { - if (newSettings.newCameraName != CAMERA_NAME) - { - LOG("VideoCaptureProxyFilter::EnumPins webcam selected using first fit"); - selectedCamIdx = i; - break; - } - } - } - - if (!selectedCamIdx) - { - LOG("VideoCaptureProxyFilter::EnumPins FAILED webcam couldn't be selected"); - return E_FAIL; - } - - auto& webcam = webcams[*selectedCamIdx]; - auto pin = winrt::make_self(); - pin->_mediaFormat = CopyMediaType(webcam.bestFormat.mediaType.get()); - pin->_owningFilter = this; - _outPin.attach(pin.detach()); - - auto frameCallback = [this](IMediaSample* sample) { - std::unique_lock lock{ _worker_mutex }; - sample->AddRef(); - _pending_frame = sample; - _worker_cv.notify_one(); - }; - - _targetMediaType.reset(); - MFCreateMediaType(&_targetMediaType); - _targetMediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video); - _targetMediaType->SetGUID(MF_MT_SUBTYPE, MapDShowSubtypeToMFT(webcam.bestFormat.mediaType->subtype)); - _targetMediaType->SetUINT32(MF_MT_INTERLACE_MODE, MFVideoInterlace_Progressive); - _targetMediaType->SetUINT32(MF_MT_ALL_SAMPLES_INDEPENDENT, TRUE); - MFSetAttributeSize( - _targetMediaType.get(), MF_MT_FRAME_SIZE, webcam.bestFormat.width, webcam.bestFormat.height); - MFSetAttributeRatio(_targetMediaType.get(), MF_MT_PIXEL_ASPECT_RATIO, 1, 1); - - _captureDevice = VideoCaptureDevice::Create(std::move(webcam), std::move(frameCallback)); - if (_captureDevice) - { - if (!_blankImage) - { - wil::com_ptr_nothrow blackBMPImage = SHCreateMemStream(bmpPixelData, sizeof(bmpPixelData)); - _blankImage = LoadImageAsSample(blackBMPImage, _targetMediaType.get(), initialJpgQuality); - } - - _overlayImage = LoadImageAsSample(newSettings.overlayImage, _targetMediaType.get(), initialJpgQuality); - LOG("VideoCaptureProxyFilter::EnumPins capture device created successfully"); - } - else - { - LOG("VideoCaptureProxyFilter::EnumPins FAILED couldn't create capture device"); - } - } - - detached_enumerator->_objects.emplace_back(_outPin); - - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::FindPin(LPCWSTR, IPin** pin) -{ - if (pin) - { - *pin = nullptr; - } - return E_NOTIMPL; -} - -HRESULT VideoCaptureProxyFilter::QueryFilterInfo(FILTER_INFO* pInfo) -{ - if (!pInfo) - { - LOG("VideoCaptureProxyPin::QueryFilterInfo FAILED pInfo"); - return E_POINTER; - } - - VERBOSE_LOG; - std::copy(std::begin(FILTER_NAME), std::end(FILTER_NAME), pInfo->achName); - - pInfo->pGraph = _graph; - if (_graph) - { - _graph->AddRef(); - } - - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR) -{ - _graph = pGraph; - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::QueryVendorInfo(LPWSTR* pVendorInfo) -{ - auto info = static_cast(CoTaskMemAlloc(sizeof(VENDOR))); - std::copy(std::begin(VENDOR), std::end(VENDOR), info); - *pVendorInfo = info; - return S_OK; -} - -HRESULT VideoCaptureProxyFilter::GetClassID(CLSID*) -{ - return E_NOTIMPL; -} - -ULONG VideoCaptureProxyFilter::GetMiscFlags(void) -{ - return AM_FILTER_MISC_FLAGS_IS_SOURCE; -} - -VideoCaptureProxyFilter::~VideoCaptureProxyFilter() -{ - VERBOSE_LOG; - _shutdown_request = true; - - _worker_cv.notify_one(); - _worker_thread.join(); - if (_settingsUpdateChannel) - { - _settingsUpdateChannel->access([](auto settingsMemory) { - auto settings = reinterpret_cast(settingsMemory._data); - settings->cameraInUse = false; - }); - } -} - -VideoCaptureProxyFilter::SyncedSettings VideoCaptureProxyFilter::SyncCurrentSettings() -{ - SyncedSettings result; - if (!_settingsUpdateChannel.has_value()) - { - _settingsUpdateChannel = SerializedSharedMemory::open(CameraSettingsUpdateChannel::endpoint(), sizeof(CameraSettingsUpdateChannel), false); - } - - if (!_settingsUpdateChannel) - { - return result; - } - - _settingsUpdateChannel->access([this, &result](auto settingsMemory) { - auto settings = reinterpret_cast(settingsMemory._data); - bool cameraNameUpdated = false; - result.webcamDisabled = settings->useOverlayImage; - - settings->cameraInUse = true; - - if (settings->sourceCameraName.has_value()) - { - std::wstring_view newCameraNameView{ settings->sourceCameraName->data() }; - if (!_currentSourceCameraName.has_value() || *_currentSourceCameraName != newCameraNameView) - { - cameraNameUpdated = true; - result.newCameraName = newCameraNameView; - } - } - - if (!settings->overlayImageSize.has_value()) - { - return; - } - - if (settings->newOverlayImagePosted || !_overlayImage) - { - auto imageChannel = - SerializedSharedMemory::open(CameraOverlayImageChannel::endpoint(), *settings->overlayImageSize, true); - if (!imageChannel) - { - return; - } - - imageChannel->access([this, settings, &result](auto imageMemory) { - result.overlayImage = SHCreateMemStream(imageMemory._data, static_cast(imageMemory._size)); - if (!result.overlayImage) - { - return; - } - - settings->newOverlayImagePosted = false; - }); - } - }); - return result; -} diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.h b/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.h deleted file mode 100644 index 58f49f032a..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoCaptureProxyFilter.h +++ /dev/null @@ -1,120 +0,0 @@ -#pragma once - -#include - -#define WIN32_LEAN_AND_MEAN -#include -#include - -#include -#include -#include - -#include -#include - -#include "VideoCaptureDevice.h" - -#include -#include - -struct VideoCaptureProxyPin; -struct IMFSample; -struct IMFMediaType; - -inline const wchar_t CAMERA_NAME[] = L"PowerToys VideoConference Mute"; - -struct VideoCaptureProxyFilter : winrt::implements -{ - // BLOCK START: member accessed concurrently - wil::com_ptr_nothrow _outPin; - IMediaSample* _pending_frame = nullptr; - std::atomic_bool _shutdown_request = false; - std::optional _settingsUpdateChannel; - std::optional _currentSourceCameraName; - wil::com_ptr_nothrow _blankImage; - wil::com_ptr_nothrow _overlayImage; - wil::com_ptr_nothrow _targetMediaType; - // BLOCK END: member accessed concurrently - - std::mutex _worker_mutex; - std::condition_variable _worker_cv; - - FILTER_STATE _state = State_Stopped; - wil::com_ptr_nothrow _clock; - IFilterGraph* _graph = nullptr; - std::optional _captureDevice; - - std::thread _worker_thread; - - VideoCaptureProxyFilter(); - ~VideoCaptureProxyFilter(); - - struct SyncedSettings - { - bool webcamDisabled = false; - std::wstring newCameraName; - wil::com_ptr_nothrow overlayImage; - }; - - SyncedSettings SyncCurrentSettings(); - - HRESULT STDMETHODCALLTYPE Stop(void) override; - HRESULT STDMETHODCALLTYPE Pause(void) override; - HRESULT STDMETHODCALLTYPE Run(REFERENCE_TIME tStart) override; - HRESULT STDMETHODCALLTYPE GetState(DWORD dwMilliSecsTimeout, FILTER_STATE* State) override; - HRESULT STDMETHODCALLTYPE SetSyncSource(IReferenceClock* pClock) override; - HRESULT STDMETHODCALLTYPE GetSyncSource(IReferenceClock** pClock) override; - HRESULT STDMETHODCALLTYPE EnumPins(IEnumPins** ppEnum) override; - HRESULT STDMETHODCALLTYPE FindPin(LPCWSTR Id, IPin** ppPin) override; - HRESULT STDMETHODCALLTYPE QueryFilterInfo(FILTER_INFO* pInfo) override; - HRESULT STDMETHODCALLTYPE JoinFilterGraph(IFilterGraph* pGraph, LPCWSTR pName) override; - HRESULT STDMETHODCALLTYPE QueryVendorInfo(LPWSTR* pVendorInfo) override; - - HRESULT STDMETHODCALLTYPE GetClassID(CLSID* pClassID) override; - ULONG STDMETHODCALLTYPE GetMiscFlags(void) override; -}; -struct VideoCaptureProxyPin : winrt::implements -{ - VideoCaptureProxyFilter* _owningFilter = nullptr; - wil::com_ptr_nothrow _connectedInputPin; - unique_media_type_ptr _mediaFormat; - std::atomic_bool _flushing = false; - - HRESULT STDMETHODCALLTYPE Connect(IPin* pReceivePin, const AM_MEDIA_TYPE* pmt) override; - HRESULT STDMETHODCALLTYPE ReceiveConnection(IPin* pConnector, const AM_MEDIA_TYPE* pmt) override; - HRESULT STDMETHODCALLTYPE Disconnect(void) override; - HRESULT STDMETHODCALLTYPE ConnectedTo(IPin** pPin) override; - HRESULT STDMETHODCALLTYPE ConnectionMediaType(AM_MEDIA_TYPE* pmt) override; - HRESULT STDMETHODCALLTYPE QueryPinInfo(PIN_INFO* pInfo) override; - HRESULT STDMETHODCALLTYPE QueryDirection(PIN_DIRECTION* pPinDir) override; - HRESULT STDMETHODCALLTYPE QueryId(LPWSTR* Id) override; - HRESULT STDMETHODCALLTYPE QueryAccept(const AM_MEDIA_TYPE* pmt) override; - HRESULT STDMETHODCALLTYPE EnumMediaTypes(IEnumMediaTypes** ppEnum) override; - HRESULT STDMETHODCALLTYPE QueryInternalConnections(IPin** apPin, ULONG* nPin) override; - HRESULT STDMETHODCALLTYPE EndOfStream(void) override; - HRESULT STDMETHODCALLTYPE BeginFlush(void) override; - HRESULT STDMETHODCALLTYPE EndFlush(void) override; - HRESULT STDMETHODCALLTYPE NewSegment(REFERENCE_TIME tStart, REFERENCE_TIME tStop, double dRate) override; - - HRESULT STDMETHODCALLTYPE SetFormat(AM_MEDIA_TYPE* pmt) override; - HRESULT STDMETHODCALLTYPE GetFormat(AM_MEDIA_TYPE** ppmt) override; - HRESULT STDMETHODCALLTYPE GetNumberOfCapabilities(int* piCount, int* piSize) override; - HRESULT STDMETHODCALLTYPE GetStreamCaps(int iIndex, AM_MEDIA_TYPE** ppmt, BYTE* pSCC) override; - HRESULT STDMETHODCALLTYPE Set(REFGUID guidPropSet, - DWORD dwPropID, - LPVOID pInstanceData, - DWORD cbInstanceData, - LPVOID pPropData, - DWORD cbPropData) override; - HRESULT STDMETHODCALLTYPE Get(REFGUID guidPropSet, - DWORD dwPropID, - LPVOID pInstanceData, - DWORD cbInstanceData, - LPVOID pPropData, - DWORD cbPropData, - DWORD* pcbReturned) override; - HRESULT STDMETHODCALLTYPE QuerySupported(REFGUID guidPropSet, DWORD dwPropID, DWORD* pTypeSupport) override; - - wil::com_ptr_nothrow FindAllocator(); -}; diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.rc b/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.rc deleted file mode 100644 index 1a2f62db5e..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.rc +++ /dev/null @@ -1,47 +0,0 @@ -#ifdef _WIN64 - #include "resource.h" -#else - #include "resource.x86.h" -#endif - -#include - -#include "../../../common/version/version.h" - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -1 VERSIONINFO -FILEVERSION FILE_VERSION -PRODUCTVERSION PRODUCT_VERSION -FILEFLAGSMASK VS_FFI_FILEFLAGSMASK -#ifdef _DEBUG -FILEFLAGS VS_FF_DEBUG -#else -FILEFLAGS 0x0L -#endif -FILEOS VOS_NT_WINDOWS32 -FILETYPE VFT_DLL -FILESUBTYPE VFT2_UNKNOWN -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" // US English (0x0409), Unicode (0x04B0) charset - BEGIN - VALUE "CompanyName", COMPANY_NAME - VALUE "FileDescription", FILE_DESCRIPTION - VALUE "FileVersion", FILE_VERSION_STRING - VALUE "InternalName", INTERNAL_NAME - VALUE "LegalCopyright", COPYRIGHT_NOTE - VALUE "OriginalFilename", ORIGINAL_FILENAME - VALUE "ProductName", PRODUCT_NAME - VALUE "ProductVersion", PRODUCT_VERSION_STRING - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 // US English (0x0409), Unicode (1200) charset - END -END diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj b/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj deleted file mode 100644 index fd8525072f..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilter.vcxproj +++ /dev/null @@ -1,157 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Debug - ARM64 - - - Release - Win32 - - - Release - x64 - - - Release - ARM64 - - - - 16.0 - {AC2857B4-103D-4D6D-9740-926EBF785042} - Win32Proj - VideoConferenceProxyFilter - VideoConferenceProxyFilter - - - - DynamicLibrary - - - v143 - - - v143 - - - v143 - - - v143 - - - - $(SolutionDir)\src\;$(ProjectDir)..\..\..\ - Level4 - - - - - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - - - Console - true - - - true - - - - - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - $(SolutionDir)\src\; - - - Console - - - true - - - call "$(ProjectDir)build_vcm_x86.cmd" - - - - ..\..\..\..\$(Platform)\$(Configuration)\ - PowerToys.VideoConferenceProxyFilter_$(Platform) - - - ..\..\..\..\x86\$(Configuration)\ - PowerToys.VideoConferenceProxyFilter_x86 - - - - - - - - - - ..\VideoConferenceShared\;%(AdditionalIncludeDirectories) - _LIB;NOMINMAX;%(PreprocessorDefinitions) - NotUsing - MultiThreaded - MultiThreadedDebug - - - $(OutDir)VideoConferenceShared.lib;Windowscodecs.lib;Wtsapi32.lib;mfplat.lib;WindowsApp.lib;Mfsensorgroup.lib;Mf.lib;Shlwapi.lib;Strmiids.lib;%(AdditionalDependencies); - module.def - - - _WIN64;_UNICODE;UNICODE;%(PreprocessorDefinitions) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {459e0768-7ebd-4c41-bba1-6db3b3815e0a} - - - {cc6e41ac-8174-4e8a-8d22-85dd7f4851df} - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilterx86.sln b/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilterx86.sln deleted file mode 100644 index e4f5a92176..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/VideoConferenceProxyFilterx86.sln +++ /dev/null @@ -1,51 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30907.101 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoConferenceProxyFilter", "VideoConferenceProxyFilter.vcxproj", "{AC2857B4-103D-4D6D-9740-926EBF785042}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "VideoConferenceShared", "..\VideoConferenceShared\VideoConferenceShared.vcxproj", "{459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Version", "..\..\..\common\version\version.vcxproj", "{CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Win32 = Debug|Win32 - Debug|x64 = Debug|x64 - Release|Win32 = Release|Win32 - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|Win32.ActiveCfg = Debug|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|Win32.Build.0 = Debug|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|x64.ActiveCfg = Debug|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Debug|x64.Build.0 = Debug|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|Win32.ActiveCfg = Release|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|Win32.Build.0 = Release|Win32 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|x64.ActiveCfg = Release|x64 - {AC2857B4-103D-4D6D-9740-926EBF785042}.Release|x64.Build.0 = Release|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|Win32.ActiveCfg = Debug|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|Win32.Build.0 = Debug|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|x64.ActiveCfg = Debug|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Debug|x64.Build.0 = Debug|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|Win32.ActiveCfg = Release|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|Win32.Build.0 = Release|Win32 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|x64.ActiveCfg = Release|x64 - {459E0768-7EBD-4C41-BBA1-6DB3B3815E0A}.Release|x64.Build.0 = Release|x64 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|Win32.ActiveCfg = Debug|Win32 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|Win32.Build.0 = Debug|Win32 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x64.ActiveCfg = Debug|x64 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Debug|x64.Build.0 = Debug|x64 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|Win32.ActiveCfg = Release|Win32 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|Win32.Build.0 = Release|Win32 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x64.ActiveCfg = Release|x64 - {CC6E41AC-8174-4E8A-8D22-85DD7F4851DF}.Release|x64.Build.0 = Release|x64 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {0E41348C-22CB-45A4-8A16-8D7BEA070BB2} - EndGlobalSection -EndGlobal diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/build_vcm_x86.cmd b/src/modules/videoconference/VideoConferenceProxyFilter/build_vcm_x86.cmd deleted file mode 100644 index 9b85078623..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/build_vcm_x86.cmd +++ /dev/null @@ -1,3 +0,0 @@ -msbuild VideoConferenceProxyFilterx86.sln -p:Configuration="Release" -p:Platform="Win32" - -exit 0 \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/dllmain.cpp b/src/modules/videoconference/VideoConferenceProxyFilter/dllmain.cpp deleted file mode 100644 index 61133572c8..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/dllmain.cpp +++ /dev/null @@ -1,242 +0,0 @@ -#include "VideoCaptureProxyFilter.h" - -#include - -#include -#include - -namespace -{ -#if defined(_WIN64) - class __declspec(uuid("{31AD75E9-8C3A-49C8-B9ED-5880D6B4A764}")) GUID_DECL_POWERTOYS_VCM; -#elif defined(_WIN32) - class __declspec(uuid("{31AD75E9-8C3A-49C8-B9ED-5880D6B4A732}")) GUID_DECL_POWERTOYS_VCM; -#endif - const GUID CLSID_POWERTOYS_VCM = __uuidof(GUID_DECL_POWERTOYS_VCM); - - const REGPINTYPES MEDIA_TYPES = { &MEDIATYPE_Video, &MEDIASUBTYPE_MJPG }; - - const wchar_t FILTER_NAME[] = L"Output"; - const REGFILTERPINS PINS_REGISTRATION = { - (wchar_t*)FILTER_NAME, - false, - true, - false, - false, - &CLSID_NULL, - nullptr, - 1, - &MEDIA_TYPES - }; - - HINSTANCE DLLInstance{}; -} - -struct __declspec(uuid("9DCAF869-9C13-4BDF-BD0D-3592C5579DD6")) VideoCaptureProxyFilterFactory : winrt::implements -{ - HRESULT STDMETHODCALLTYPE CreateInstance(IUnknown*, REFIID riid, void** ppvObject) noexcept override - { - try - { - return winrt::make()->QueryInterface(riid, ppvObject); - } - catch (...) - { - return winrt::to_hresult(); - } - } - - HRESULT STDMETHODCALLTYPE LockServer(BOOL fLock) noexcept override - { - if (fLock) - { - ++winrt::get_module_lock(); - } - else - { - --winrt::get_module_lock(); - } - - return S_OK; - } -}; - -HRESULT STDMETHODCALLTYPE DllCanUnloadNow() -{ - if (winrt::get_module_lock()) - { - return S_FALSE; - } - - winrt::clear_factory_cache(); - return S_OK; -} - -HRESULT STDMETHODCALLTYPE DllGetClassObject(GUID const& clsid, GUID const& iid, void** result) -{ - if (!result) - { - return E_POINTER; - } - - if (iid != IID_IClassFactory && iid != IID_IUnknown) - { - return E_NOINTERFACE; - } - - if (clsid != CLSID_POWERTOYS_VCM) - { - return E_INVALIDARG; - } - - try - { - *result = nullptr; - - auto factory = winrt::make(); - factory->AddRef(); - *result = static_cast(factory.get()); - return S_OK; - } - catch (...) - { - return winrt::to_hresult(); - } -} - -std::wstring RegistryPath() -{ - std::wstring registryPath; - registryPath.resize(CHARS_IN_GUID, L'\0'); - - StringFromGUID2(CLSID_POWERTOYS_VCM, registryPath.data(), CHARS_IN_GUID); - registryPath.resize(registryPath.size() - 1); - registryPath = L"CLSID\\" + registryPath; - return registryPath; -} - -bool RegisterServer() -{ - std::wstring dllPath; - dllPath.resize(MAX_PATH, L'\0'); - if (auto length = GetModuleFileNameW(DLLInstance, dllPath.data(), MAX_PATH); length != 0) - { - dllPath.resize(length); - } - else - { - return false; - } - - wil::unique_hkey key; - wil::unique_hkey subkey; - const auto registryPath = RegistryPath(); - if (RegCreateKeyW(HKEY_CLASSES_ROOT, registryPath.c_str(), &key)) - { - return false; - } - - if (RegSetValueW(key.get(), nullptr, REG_SZ, CAMERA_NAME, sizeof(CAMERA_NAME))) - { - return false; - } - - if (RegCreateKeyW(key.get(), L"InprocServer32", &subkey)) - { - return false; - } - - if (RegSetValueW(subkey.get(), nullptr, REG_SZ, dllPath.c_str(), static_cast((dllPath.length() + 1) * sizeof(wchar_t)))) - { - return false; - } - const wchar_t THREADING_MODEL[] = L"Both"; - RegSetValueExW(subkey.get(), L"ThreadingModel", 0, REG_SZ, (const BYTE*)THREADING_MODEL, sizeof(THREADING_MODEL)); - - return true; -} - -bool UnregisterServer() -{ - const auto registryPath = RegistryPath(); - return !RegDeleteTreeW(HKEY_CLASSES_ROOT, registryPath.c_str()); -} - -bool RegisterFilter() -{ - auto filterMapper = wil::CoCreateInstanceNoThrow(CLSID_FilterMapper2); - if (!filterMapper) - { - return false; - } - - REGFILTER2 regFilter{ .dwVersion = 1, .dwMerit = MERIT_DO_NOT_USE, .cPins = 1, .rgPins = &PINS_REGISTRATION }; - - wil::com_ptr_nothrow moniker; - - return SUCCEEDED(filterMapper->RegisterFilter( - CLSID_POWERTOYS_VCM, CAMERA_NAME, &moniker, &CLSID_VideoInputDeviceCategory, nullptr, ®Filter)); -} - -bool UnregisterFilter() -{ - auto filterMapper = wil::CoCreateInstanceNoThrow(CLSID_FilterMapper2); - if (!filterMapper) - { - return false; - } - - return SUCCEEDED(filterMapper->UnregisterFilter(&CLSID_VideoInputDeviceCategory, nullptr, CLSID_POWERTOYS_VCM)); -} - -HRESULT STDMETHODCALLTYPE DllRegisterServer() -{ - if (!RegisterServer()) - { - UnregisterServer(); - return E_FAIL; - } - - auto COMContext = wil::CoInitializeEx(COINIT_APARTMENTTHREADED); - - if (!RegisterFilter()) - { - UnregisterFilter(); - UnregisterServer(); - return E_FAIL; - } - - return S_OK; -} - -HRESULT STDMETHODCALLTYPE DllUnregisterServer() -{ - auto COMContext = wil::CoInitializeEx(COINIT_APARTMENTTHREADED); - - UnregisterFilter(); - UnregisterServer(); - - return S_OK; -} - -HRESULT STDMETHODCALLTYPE DllInstall(BOOL install, LPCWSTR) -{ - if (install) - { - return DllRegisterServer(); - } - else - { - return DllUnregisterServer(); - } -} - -BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID) -{ - if (fdwReason == DLL_PROCESS_ATTACH) - { - DLLInstance = hinstDLL; - } - - return true; -} diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/module.def b/src/modules/videoconference/VideoConferenceProxyFilter/module.def deleted file mode 100644 index c4fcbcc661..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/module.def +++ /dev/null @@ -1,7 +0,0 @@ -EXPORTS - DllMain PRIVATE - DllGetClassObject PRIVATE - DllCanUnloadNow PRIVATE - DllRegisterServer PRIVATE - DllUnregisterServer PRIVATE - DllInstall PRIVATE diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/packages.config b/src/modules/videoconference/VideoConferenceProxyFilter/packages.config deleted file mode 100644 index 6199e2345c..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/resource.h b/src/modules/videoconference/VideoConferenceProxyFilter/resource.h deleted file mode 100644 index fbba969645..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/resource.h +++ /dev/null @@ -1,11 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by VideoConferenceProxyFilter.rc - -////////////////////////////// -// Non-localizable - -#define FILE_DESCRIPTION "PowerToys VideoConferenceProxyFilter" -#define INTERNAL_NAME "PowerToys.VideoConferenceProxyFilter" -#define ORIGINAL_FILENAME "PowerToys.VideoConferenceProxyFilter_x64.dll" - diff --git a/src/modules/videoconference/VideoConferenceProxyFilter/resource.x86.h b/src/modules/videoconference/VideoConferenceProxyFilter/resource.x86.h deleted file mode 100644 index fe511d0929..0000000000 --- a/src/modules/videoconference/VideoConferenceProxyFilter/resource.x86.h +++ /dev/null @@ -1,11 +0,0 @@ -//{{NO_DEPENDENCIES}} -// Microsoft Visual C++ generated include file. -// Used by VideoConferenceProxyFilter.rc - -////////////////////////////// -// Non-localizable - -#define FILE_DESCRIPTION "PowerToys VideoConferenceProxyFilter" -#define INTERNAL_NAME "PowerToys.VideoConferenceProxyFilter" -#define ORIGINAL_FILENAME "PowerToys.VideoConferenceProxyFilter_x86.dll" - diff --git a/src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.cpp b/src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.cpp deleted file mode 100644 index 534428531b..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.cpp +++ /dev/null @@ -1,15 +0,0 @@ -#include "CameraStateUpdateChannels.h" - -#include "naming.h" - -std::wstring_view CameraOverlayImageChannel::endpoint() -{ - static const std::wstring endpoint = ObtainStableGlobalNameForKernelObject(L"PowerToysVideoConferenceCameraOverlayImageChannelSharedMemory", true); - return endpoint; -} - -std::wstring_view CameraSettingsUpdateChannel::endpoint() -{ - static const std::wstring endpoint = ObtainStableGlobalNameForKernelObject(L"PowerToysVideoConferenceSettingsChannelSharedMemory", true); - return endpoint; -} diff --git a/src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.h b/src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.h deleted file mode 100644 index 02ec542f7a..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/CameraStateUpdateChannels.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once - -#include -#include -#include - -struct alignas(16) CameraSettingsUpdateChannel -{ - bool useOverlayImage = false; - bool cameraInUse = false; - - std::optional overlayImageSize; - std::optional> sourceCameraName; - - bool newOverlayImagePosted = false; - - static std::wstring_view endpoint(); -}; - -namespace CameraOverlayImageChannel -{ - std::wstring_view endpoint(); -} diff --git a/src/modules/videoconference/VideoConferenceShared/DLLProviderHelpers.h b/src/modules/videoconference/VideoConferenceShared/DLLProviderHelpers.h deleted file mode 100644 index 73c29cf08b..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/DLLProviderHelpers.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#define WIN32_LEAN_AND_MEAN -#include - -#include -#include -#include - -#define DECLARE_DLL_FUNCTION(NAME) \ - std::function NAME = (std::add_pointer_t)GetProcAddress(_library_handle, #NAME); - -#define DECLARE_DLL_PROVIDER_BEGIN(DLL_NAME) \ - class DLL_NAME##APIProvider final \ - { \ - HMODULE _library_handle; \ - DLL_NAME##APIProvider(HMODULE h) : _library_handle{ h } {} \ - \ - public: \ - ~DLL_NAME##APIProvider() { FreeLibrary(_library_handle); } \ - static std::optional create() \ - { \ - HMODULE h = LoadLibraryA(#DLL_NAME ".dll"); \ - std::optional result; \ - if (!h) \ - return result; \ - result.emplace(DLL_NAME##APIProvider{ h }); \ - return result; \ - } - -#define DECLARE_DLL_PROVIDER_END \ - } \ - ; diff --git a/src/modules/videoconference/VideoConferenceShared/Logging.cpp b/src/modules/videoconference/VideoConferenceShared/Logging.cpp deleted file mode 100644 index faeab04bb5..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/Logging.cpp +++ /dev/null @@ -1,202 +0,0 @@ -#include "Logging.h" - -#include -#include -#include -#include -#include -#include - -#include -#include - -#pragma warning(disable : 4127) - -static std::mutex logMutex; -constexpr inline size_t maxLogSizeMegabytes = 10; -constexpr inline bool alwaysLogVerbose = true; - -void LogToFile(std::wstring what, const bool verbose) -{ - std::error_code _; - const auto tempPath = std::filesystem::temp_directory_path(_); - if (verbose) - { - const bool verboseIndicatorFilePresent = std::filesystem::exists(tempPath / L"PowerToysVideoConferenceVerbose.flag", _); - if (!alwaysLogVerbose && !verboseIndicatorFilePresent) - { - return; - } - } - time_t now = std::chrono::system_clock::to_time_t(std::chrono::system_clock::now()); - std::tm tm; - localtime_s(&tm, &now); - char prefix[64]; - const auto pid = GetCurrentProcessId(); - const auto iter = prefix + sprintf_s(prefix, "[%ld]", pid); - std::strftime(iter, sizeof(prefix) - (prefix - iter), "[%d.%m %H:%M:%S] ", &tm); - - std::lock_guard lock{ logMutex }; - std::wstring logFilePath = tempPath; -#if defined(_WIN64) - logFilePath += L"\\PowerToysVideoConference_x64.log"; -#elif defined(_WIN32) - logFilePath += L"\\PowerToysVideoConference_x86.log"; -#endif - size_t logSizeMBs = 0; - try - { - logSizeMBs = static_cast(std::filesystem::file_size(logFilePath) >> 20); - } - catch (...) - { - } - if (logSizeMBs > maxLogSizeMegabytes) - { - std::error_code __; - // Truncate the log file to zero - std::filesystem::resize_file(logFilePath, 0, __); - } - std::wofstream myfile; - myfile.open(logFilePath, std::fstream::app); - - static const auto newLaunch = [&] { - myfile << prefix << "\n\n<<>"; - return 0; - }(); - - myfile << prefix << what << "\n"; - myfile.close(); -} - -void LogToFile(std::string what, const bool verbose) -{ - std::wstring native{ begin(what), end(what) }; - LogToFile(std::move(native), verbose); -} - -std::string toMediaTypeString(GUID subtype) -{ - if (subtype == MFVideoFormat_YUY2) - return "MFVideoFormat_YUY2"; - else if (subtype == MFVideoFormat_RGB32) - return "MFVideoFormat_RGB32"; - else if (subtype == MFVideoFormat_RGB24) - return "MFVideoFormat_RGB24"; - else if (subtype == MFVideoFormat_ARGB32) - return "MFVideoFormat_ARGB32"; - else if (subtype == MFVideoFormat_RGB555) - return "MFVideoFormat_RGB555"; - else if (subtype == MFVideoFormat_RGB565) - return "MFVideoFormat_RGB565"; - else if (subtype == MFVideoFormat_RGB8) - return "MFVideoFormat_RGB8"; - else if (subtype == MFVideoFormat_L8) - return "MFVideoFormat_L8"; - else if (subtype == MFVideoFormat_L16) - return "MFVideoFormat_L16"; - else if (subtype == MFVideoFormat_D16) - return "MFVideoFormat_D16"; - else if (subtype == MFVideoFormat_AYUV) - return "MFVideoFormat_AYUV"; - else if (subtype == MFVideoFormat_YVYU) - return "MFVideoFormat_YVYU"; - else if (subtype == MFVideoFormat_YVU9) - return "MFVideoFormat_YVU9"; - else if (subtype == MFVideoFormat_UYVY) - return "MFVideoFormat_UYVY"; - else if (subtype == MFVideoFormat_NV11) - return "MFVideoFormat_NV11"; - else if (subtype == MFVideoFormat_NV12) - return "MFVideoFormat_NV12"; - else if (subtype == MFVideoFormat_YV12) - return "MFVideoFormat_YV12"; - else if (subtype == MFVideoFormat_I420) - return "MFVideoFormat_I420"; - else if (subtype == MFVideoFormat_IYUV) - return "MFVideoFormat_IYUV"; - else if (subtype == MFVideoFormat_Y210) - return "MFVideoFormat_Y210"; - else if (subtype == MFVideoFormat_Y216) - return "MFVideoFormat_Y216"; - else if (subtype == MFVideoFormat_Y410) - return "MFVideoFormat_Y410"; - else if (subtype == MFVideoFormat_Y416) - return "MFVideoFormat_Y416"; - else if (subtype == MFVideoFormat_Y41P) - return "MFVideoFormat_Y41P"; - else if (subtype == MFVideoFormat_Y41T) - return "MFVideoFormat_Y41T"; - else if (subtype == MFVideoFormat_Y42T) - return "MFVideoFormat_Y42T"; - else if (subtype == MFVideoFormat_P210) - return "MFVideoFormat_P210"; - else if (subtype == MFVideoFormat_P216) - return "MFVideoFormat_P216"; - else if (subtype == MFVideoFormat_P010) - return "MFVideoFormat_P010"; - else if (subtype == MFVideoFormat_P016) - return "MFVideoFormat_P016"; - else if (subtype == MFVideoFormat_v210) - return "MFVideoFormat_v210"; - else if (subtype == MFVideoFormat_v216) - return "MFVideoFormat_v216"; - else if (subtype == MFVideoFormat_v410) - return "MFVideoFormat_v410"; - else if (subtype == MFVideoFormat_MP43) - return "MFVideoFormat_MP43"; - else if (subtype == MFVideoFormat_MP4S) - return "MFVideoFormat_MP4S"; - else if (subtype == MFVideoFormat_M4S2) - return "MFVideoFormat_M4S2"; - else if (subtype == MFVideoFormat_MP4V) - return "MFVideoFormat_MP4V"; - else if (subtype == MFVideoFormat_WMV1) - return "MFVideoFormat_WMV1"; - else if (subtype == MFVideoFormat_WMV2) - return "MFVideoFormat_WMV2"; - else if (subtype == MFVideoFormat_WMV3) - return "MFVideoFormat_WMV3"; - else if (subtype == MFVideoFormat_WVC1) - return "MFVideoFormat_WVC1"; - else if (subtype == MFVideoFormat_MSS1) - return "MFVideoFormat_MSS1"; - else if (subtype == MFVideoFormat_MSS2) - return "MFVideoFormat_MSS2"; - else if (subtype == MFVideoFormat_MPG1) - return "MFVideoFormat_MPG1"; - else if (subtype == MFVideoFormat_DVSL) - return "MFVideoFormat_DVSL"; - else if (subtype == MFVideoFormat_DVSD) - return "MFVideoFormat_DVSD"; - else if (subtype == MFVideoFormat_DVHD) - return "MFVideoFormat_DVHD"; - else if (subtype == MFVideoFormat_DV25) - return "MFVideoFormat_DV25"; - else if (subtype == MFVideoFormat_DV50) - return "MFVideoFormat_DV50"; - else if (subtype == MFVideoFormat_DVH1) - return "MFVideoFormat_DVH1"; - else if (subtype == MFVideoFormat_DVC) - return "MFVideoFormat_DVC"; - else if (subtype == MFVideoFormat_H264) - return "MFVideoFormat_H264"; - else if (subtype == MFVideoFormat_H265) - return "MFVideoFormat_H265"; - else if (subtype == MFVideoFormat_MJPG) - return "MFVideoFormat_MJPG"; - else if (subtype == MFVideoFormat_420O) - return "MFVideoFormat_420O"; - else if (subtype == MFVideoFormat_HEVC) - return "MFVideoFormat_HEVC"; - else if (subtype == MFVideoFormat_HEVC_ES) - return "MFVideoFormat_HEVC_ES"; - else if (subtype == MFVideoFormat_VP80) - return "MFVideoFormat_VP80"; - else if (subtype == MFVideoFormat_VP90) - return "MFVideoFormat_VP90"; - else if (subtype == MFVideoFormat_ORAW) - return "MFVideoFormat_ORAW"; - else - return "Other VideoFormat"; -} \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceShared/Logging.h b/src/modules/videoconference/VideoConferenceShared/Logging.h deleted file mode 100644 index e585759229..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/Logging.h +++ /dev/null @@ -1,62 +0,0 @@ -#pragma once - -#include -#include -#include - -#include -#include - -void LogToFile(std::string what, const bool verbose = false); -void LogToFile(std::wstring what, const bool verbose = false); -std::string toMediaTypeString(GUID subtype); - -#define RETURN_IF_FAILED_WITH_LOGGING(val) \ - hr = (val); \ - if (FAILED(hr)) \ - { \ - LogToFile(std::string(__FUNCTION__ "() ") + #val + ": " + std::system_category().message(hr)); \ - return hr; \ - } - -#define RETURN_NULLPTR_IF_FAILED_WITH_LOGGING(val) \ - hr = val; \ - if (FAILED(hr)) \ - { \ - LogToFile(std::string(__FUNCTION__ "() ") + #val + ": " + std::system_category().message(hr)); \ - return nullptr; \ - } - -#define VERBOSE_LOG \ - std::string functionNameTMPVAR = __FUNCTION__; \ - LogToFile(std::string(functionNameTMPVAR + " enter"), true); \ - auto verboseLogOnScopeEnd = wil::scope_exit([&] { \ - LogToFile(std::string(functionNameTMPVAR + " exit"), true); \ - }); - -#if defined(PowerToysInterop) -#undef LOG -#define LOG(...) -#else -#define LOG(str) LogToFile(str, false); -#endif - -constexpr inline bool failed(HRESULT hr) -{ - return hr != S_OK; -} - -constexpr inline bool failed(bool val) -{ - return val == false; -} - -template -inline bool failed(wil::com_ptr_nothrow& ptr) -{ - return ptr == nullptr; -} - -#define OK_OR_BAIL(expr) \ - if (failed(expr)) \ - return {}; diff --git a/src/modules/videoconference/VideoConferenceShared/MediaFoundationAPIProvider.h b/src/modules/videoconference/VideoConferenceShared/MediaFoundationAPIProvider.h deleted file mode 100644 index e3d6fcec09..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/MediaFoundationAPIProvider.h +++ /dev/null @@ -1,14 +0,0 @@ -#pragma once - -#include -#include - -#include "DLLProviderHelpers.h" - -DECLARE_DLL_PROVIDER_BEGIN(mfplat) -DECLARE_DLL_FUNCTION(MFCreateAttributes) -DECLARE_DLL_PROVIDER_END - -DECLARE_DLL_PROVIDER_BEGIN(mf) -DECLARE_DLL_FUNCTION(MFEnumDeviceSources) -DECLARE_DLL_PROVIDER_END diff --git a/src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.cpp b/src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.cpp deleted file mode 100644 index f8e6f00a80..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.cpp +++ /dev/null @@ -1,154 +0,0 @@ -#include "pch.h" -#include "MicrophoneDevice.h" - -#include "Logging.h" - -#include - -MicrophoneDevice::MicrophoneDevice(wil::com_ptr_nothrow device, wil::com_ptr_nothrow endpoint) : - _device{ std::move(device) }, - _endpoint{ std::move(endpoint) } -{ - if (!_device || !_endpoint) - { - throw std::logic_error("MicrophoneDevice was initialized with null objects"); - } - _device->GetId(&_id); - wil::com_ptr_nothrow props; - _device->OpenPropertyStore( - STGM_READ, &props); - if (props) - { - props->GetValue(PKEY_Device_FriendlyName, &_friendly_name); - } - else - { - LOG("MicrophoneDevice::MicrophoneDevice couldn't open property store"); - } -} - -MicrophoneDevice::~MicrophoneDevice() -{ - if (_notifier) - { - _endpoint->UnregisterControlChangeNotify(_notifier.get()); - } -} - -bool MicrophoneDevice::active() const noexcept -{ - DWORD state = 0; - _device->GetState(&state); - return state == DEVICE_STATE_ACTIVE; -} - -void MicrophoneDevice::set_muted(const bool muted) noexcept -{ - _endpoint->SetMute(muted, nullptr); -} - -bool MicrophoneDevice::muted() const noexcept -{ - BOOL muted = FALSE; - _endpoint->GetMute(&muted); - return muted; -} - -std::wstring_view MicrophoneDevice::id() const noexcept -{ - return _id ? _id.get() : FALLBACK_ID; -} - -std::wstring_view MicrophoneDevice::name() const noexcept -{ - return _friendly_name.pwszVal ? _friendly_name.pwszVal : FALLBACK_NAME; -} - -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(this); - - _endpoint->RegisterControlChangeNotify(_notifier.get()); -} - -std::unique_ptr MicrophoneDevice::getDefault() -{ - auto deviceEnumerator = wil::CoCreateInstanceNoThrow(); - if (!deviceEnumerator) - { - LOG("MicrophoneDevice::getDefault MMDeviceEnumerator returned null"); - return nullptr; - } - wil::com_ptr_nothrow captureDevice; - deviceEnumerator->GetDefaultAudioEndpoint(eCapture, eCommunications, &captureDevice); - if (!captureDevice) - { - LOG("MicrophoneDevice::getDefault captureDevice is null"); - return nullptr; - } - wil::com_ptr_nothrow microphoneEndpoint; - captureDevice->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, nullptr, reinterpret_cast(µphoneEndpoint)); - if (!microphoneEndpoint) - { - LOG("MicrophoneDevice::getDefault captureDevice is null"); - return nullptr; - } - return std::make_unique(std::move(captureDevice), std::move(microphoneEndpoint)); -} - -std::vector> MicrophoneDevice::getAllActive() -{ - std::vector> microphoneDevices; - auto deviceEnumerator = wil::CoCreateInstanceNoThrow(); - if (!deviceEnumerator) - { - LOG("MicrophoneDevice::getAllActive MMDeviceEnumerator returned null"); - return microphoneDevices; - } - - wil::com_ptr_nothrow captureDevices; - deviceEnumerator->EnumAudioEndpoints(eCapture, DEVICE_STATE_ACTIVE, &captureDevices); - if (!captureDevices) - { - LOG("MicrophoneDevice::getAllActive EnumAudioEndpoints returned null"); - return microphoneDevices; - } - UINT nDevices = 0; - captureDevices->GetCount(&nDevices); - microphoneDevices.reserve(nDevices); - for (UINT i = 0; i < nDevices; ++i) - { - wil::com_ptr_nothrow device; - captureDevices->Item(i, &device); - if (!device) - { - continue; - } - wil::com_ptr_nothrow microphoneEndpoint; - device->Activate(__uuidof(IAudioEndpointVolume), CLSCTX_INPROC_SERVER, nullptr, reinterpret_cast(µphoneEndpoint)); - if (!microphoneEndpoint) - { - continue; - } - microphoneDevices.push_back(std::make_unique(std::move(device), std::move(microphoneEndpoint))); - } - return microphoneDevices; -} - -MicrophoneDevice::VolumeNotifier::VolumeNotifier(MicrophoneDevice* subscribedDevice) : - _subscribedDevice{ subscribedDevice } -{ -} - -HRESULT __stdcall MicrophoneDevice::VolumeNotifier::OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA data) -{ - if (_subscribedDevice && _subscribedDevice->_mute_changed_callback) - _subscribedDevice->_mute_changed_callback(data->bMuted); - - return S_OK; -} diff --git a/src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.h b/src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.h deleted file mode 100644 index 6a40fb5d54..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/MicrophoneDevice.h +++ /dev/null @@ -1,64 +0,0 @@ -#pragma once -#define NOMINMAX - -#include -#include - -#include -#include - -#include -#include - -#include - -#include -#include -#include - -#include -#include - -class MicrophoneDevice -{ -public: - using mute_changed_cb_t = std::function; - -private: - friend struct VolumeNotifier; - - struct VolumeNotifier : winrt::implements - { - MicrophoneDevice* _subscribedDevice = nullptr; - VolumeNotifier(MicrophoneDevice* subscribedDevice); - - virtual HRESULT __stdcall OnNotify(PAUDIO_VOLUME_NOTIFICATION_DATA data) override; - }; - - wil::unique_cotaskmem_string _id; - wil::unique_prop_variant _friendly_name; - mute_changed_cb_t _mute_changed_callback; - winrt::com_ptr _notifier; - wil::com_ptr_nothrow _endpoint; - wil::com_ptr_nothrow _device; - - constexpr static inline std::wstring_view FALLBACK_NAME = L"Unknown device"; - constexpr static inline std::wstring_view FALLBACK_ID = L"UNKNOWN_ID"; - -public: - MicrophoneDevice(MicrophoneDevice&&) noexcept = delete; - MicrophoneDevice(const MicrophoneDevice&) noexcept = delete; - MicrophoneDevice(wil::com_ptr_nothrow device, wil::com_ptr_nothrow endpoint); - ~MicrophoneDevice(); - - bool active() const noexcept; - void set_muted(const bool muted) noexcept; - bool muted() const noexcept; - - std::wstring_view id() const noexcept; - std::wstring_view name() const noexcept; - void set_mute_changed_callback(mute_changed_cb_t callback) noexcept; - - static std::unique_ptr getDefault(); - static std::vector> getAllActive(); -}; diff --git a/src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.cpp b/src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.cpp deleted file mode 100644 index a7620e7741..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.cpp +++ /dev/null @@ -1,190 +0,0 @@ -#include "SerializedSharedMemory.h" -#ifdef _M_ARM64 -#define _mm_pause() __yield(); -#endif -inline char* SerializedSharedMemory::lock_flag_addr() noexcept -{ - return reinterpret_cast(_memory._data + _memory._size); -} - -inline void SerializedSharedMemory::lock() noexcept -{ - if (_read_only) - { - return; - } - while (LOCKED == _InterlockedCompareExchange8(lock_flag_addr(), LOCKED, !LOCKED)) - { - while (*lock_flag_addr() == LOCKED) - { - _mm_pause(); - } - } -} - -inline void SerializedSharedMemory::unlock() noexcept -{ - if (_read_only) - { - return; - } - _InterlockedExchange8(lock_flag_addr(), !LOCKED); -} - -SerializedSharedMemory::SerializedSharedMemory(std::array handles, - memory_t memory, - const bool readonly) noexcept - : - _handles{ std::move(handles) }, _memory{ std::move(memory) }, _read_only(readonly) -{ -} - -SerializedSharedMemory::~SerializedSharedMemory() noexcept -{ - if (_memory._data) - { - UnmapViewOfFile(_memory._data); - } -} - -SerializedSharedMemory::SerializedSharedMemory(SerializedSharedMemory&& rhs) noexcept -{ - *this = std::move(rhs); -} - -SerializedSharedMemory& SerializedSharedMemory::operator=(SerializedSharedMemory&& rhs) noexcept -{ - _handles = {}; - _handles.swap(rhs._handles); - _memory = std::move(rhs._memory); - rhs._memory = {}; - _read_only = rhs._read_only; - rhs._read_only = true; - - return *this; -} - -std::optional SerializedSharedMemory::create(const std::wstring_view object_name, - const size_t size, - const bool read_only, - SECURITY_ATTRIBUTES* maybe_attributes) noexcept -{ - SECURITY_DESCRIPTOR sd; - SECURITY_ATTRIBUTES sa = { sizeof SECURITY_ATTRIBUTES }; - if (!maybe_attributes) - { - sa.lpSecurityDescriptor = &sd; - sa.bInheritHandle = false; - if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) || - !SetSecurityDescriptorDacl(&sd, true, nullptr, false)) - { - return std::nullopt; - } - } - - // We need an extra byte for locking if it's not readonly - const ULARGE_INTEGER UISize{ .QuadPart = static_cast(size) + !read_only }; - - wil::unique_handle hMapFile{ CreateFileMappingW(INVALID_HANDLE_VALUE, - maybe_attributes ? maybe_attributes : &sa, - read_only ? PAGE_READONLY : PAGE_READWRITE, - UISize.HighPart, - UISize.LowPart, - object_name.data()) }; - if (!hMapFile) - { - return std::nullopt; - } - auto shmem = static_cast( - MapViewOfFile(hMapFile.get(), read_only ? FILE_MAP_READ : FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, static_cast(UISize.QuadPart))); - if (!shmem) - { - return std::nullopt; - } - std::array handles = { std::move(hMapFile), {} }; - return SerializedSharedMemory{ std::move(handles), memory_t{ shmem, size }, read_only }; -} - -std::optional SerializedSharedMemory::open(const std::wstring_view object_name, - const size_t size, - const bool read_only) noexcept -{ - wil::unique_handle hMapFile{ OpenFileMappingW(FILE_MAP_READ | FILE_MAP_WRITE, FALSE, object_name.data()) }; - if (!hMapFile) - { - return std::nullopt; - } - - auto shmem = static_cast( - MapViewOfFile(hMapFile.get(), read_only ? FILE_MAP_READ : FILE_MAP_READ | FILE_MAP_WRITE, 0, 0, size + !read_only)); - - if (!shmem) - { - return std::nullopt; - } - std::array handles = { std::move(hMapFile), {} }; - return SerializedSharedMemory{ std::move(handles), memory_t{ shmem, size }, read_only }; -} - -std::optional SerializedSharedMemory::create_readonly( - const std::wstring_view object_name, - const std::wstring_view file_path, - SECURITY_ATTRIBUTES* maybe_attributes) noexcept -{ - SECURITY_DESCRIPTOR sd; - SECURITY_ATTRIBUTES sa = { sizeof SECURITY_ATTRIBUTES }; - if (!maybe_attributes) - { - sa.lpSecurityDescriptor = &sd; - sa.bInheritHandle = false; - if (!InitializeSecurityDescriptor(&sd, SECURITY_DESCRIPTOR_REVISION) || - !SetSecurityDescriptorDacl(&sd, true, nullptr, false)) - { - return std::nullopt; - } - } - wil::unique_handle hFile{ CreateFileW(file_path.data(), - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE, - maybe_attributes ? maybe_attributes : &sa, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - nullptr) }; - - if (!hFile) - { - return std::nullopt; - } - - LARGE_INTEGER fileSize; - if (!GetFileSizeEx(hFile.get(), &fileSize)) - { - return std::nullopt; - } - wil::unique_handle hMapFile{ CreateFileMappingW(hFile.get(), - maybe_attributes ? maybe_attributes : &sa, - PAGE_READONLY, - fileSize.HighPart, - fileSize.LowPart, - object_name.data()) }; - if (!hMapFile) - { - return std::nullopt; - } - - auto shmem = static_cast(MapViewOfFile(nullptr, FILE_MAP_READ, 0, 0, static_cast(fileSize.QuadPart))); - if (shmem) - { - return std::nullopt; - } - std::array handles = { std::move(hMapFile), std::move(hFile) }; - - return SerializedSharedMemory{ std::move(handles), memory_t{ shmem, static_cast(fileSize.QuadPart) }, true }; -} - -void SerializedSharedMemory::access(std::function access_routine) noexcept -{ - lock(); - access_routine(_memory); - unlock(); -} \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.h b/src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.h deleted file mode 100644 index 15f1052746..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/SerializedSharedMemory.h +++ /dev/null @@ -1,54 +0,0 @@ -#pragma once -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif - -#include -#include -#include -#include -#include -#include - -// Wrapper class allowing sharing readonly/writable memory with a serialized access via atomic locking. -// Note that it doesn't protect against a 3rd party concurrently modifying physical file contents. -class SerializedSharedMemory -{ -public: - struct memory_t - { - uint8_t * _data = nullptr; - size_t _size = 0; - }; - - static std::optional create(const std::wstring_view object_name, - const size_t size, - const bool read_only, - SECURITY_ATTRIBUTES* maybe_attributes = nullptr) noexcept; - static std::optional create_readonly( - const std::wstring_view object_name, - const std::wstring_view file_path, - SECURITY_ATTRIBUTES* maybe_attributes = nullptr) noexcept; - static std::optional open(const std::wstring_view object_name, - const size_t size, - const bool read_only) noexcept; - - void access(std::function access_routine) noexcept; - inline size_t size() const noexcept { return _memory._size; } - - ~SerializedSharedMemory() noexcept; - SerializedSharedMemory(SerializedSharedMemory&&) noexcept; - SerializedSharedMemory& operator=(SerializedSharedMemory&&) noexcept; - -private: - std::array _handles; - memory_t _memory; - bool _read_only = true; - constexpr static inline int64_t LOCKED = 1; - - char* lock_flag_addr() noexcept; - void lock() noexcept; - void unlock() noexcept; - - SerializedSharedMemory(std::array handles, memory_t memory, const bool readonly) noexcept; -}; \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.cpp b/src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.cpp deleted file mode 100644 index ba710a0453..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.cpp +++ /dev/null @@ -1,107 +0,0 @@ -#include "pch.h" -#include "VideoCaptureDeviceList.h" -#include "Logging.h" -#include "MediaFoundationAPIProvider.h" -#include -#include - -#include -#include - -void VideoCaptureDeviceList::Clear() -{ - for (UINT32 i = 0; i < m_numberDevices; i++) - { - CoTaskMemFree(m_deviceFriendlyNames[i]); - if (m_ppDevices[i]) - { - m_ppDevices[i]->Release(); - } - } - CoTaskMemFree(m_ppDevices); - m_ppDevices = nullptr; - if (m_deviceFriendlyNames) - { - delete[] m_deviceFriendlyNames; - } - - m_deviceFriendlyNames = nullptr; - m_numberDevices = 0; -} - -HRESULT VideoCaptureDeviceList::EnumerateDevices() -{ - HRESULT hr = S_OK; - wil::com_ptr pAttributes; - Clear(); - auto mfplatAPI = mfplatAPIProvider::create(); - auto mfAPI = mfAPIProvider::create(); - if (!mfplatAPI || !mfAPI) - { - return ERROR_FILE_NOT_FOUND; - } - - // Initialize an attribute store. We will use this to - // specify the enumeration parameters. - - hr = mfplatAPI->MFCreateAttributes(&pAttributes, 1); - - // Ask for source type = video capture devices - if (SUCCEEDED(hr)) - { - hr = pAttributes->SetGUID( - MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, - MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); - } - else - { - LOG("VideoCaptureDeviceList::EnumerateDevices(): Couldn't MFCreateAttributes"); - } - // Enumerate devices. - if (SUCCEEDED(hr)) - { - hr = mfAPI->MFEnumDeviceSources(pAttributes.get(), &m_ppDevices, &m_numberDevices); - } - else - { - LOG("VideoCaptureDeviceList::EnumerateDevices(): Couldn't SetGUID"); - } - - if (FAILED(hr)) - { - LOG("VideoCaptureDeviceList::EnumerateDevices(): MFEnumDeviceSources failed"); - return hr; - } - - m_deviceFriendlyNames = new (std::nothrow) wchar_t*[m_numberDevices]; - for (UINT32 i = 0; i < m_numberDevices; i++) - { - UINT32 nameLength = 0; - m_ppDevices[i]->GetAllocatedString(MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME, &m_deviceFriendlyNames[i], &nameLength); - } - - return hr; -} - -HRESULT VideoCaptureDeviceList::GetDevice(UINT32 index, IMFActivate** ppActivate) -{ - if (index >= Count()) - { - return E_INVALIDARG; - } - - *ppActivate = m_ppDevices[index]; - (*ppActivate)->AddRef(); - - return S_OK; -} - -std::wstring_view VideoCaptureDeviceList::GetDeviceName(UINT32 index) -{ - if (index >= Count()) - { - return {}; - } - - return m_deviceFriendlyNames[index]; -} diff --git a/src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.h b/src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.h deleted file mode 100644 index eb0bf4afd4..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/VideoCaptureDeviceList.h +++ /dev/null @@ -1,33 +0,0 @@ -#pragma once - -#ifndef WIN32_LEAN_AND_MEAN -#define WIN32_LEAN_AND_MEAN -#endif -#include -#include -#include - -class VideoCaptureDeviceList -{ - UINT32 m_numberDevices; - // TODO: use wil - IMFActivate** m_ppDevices = nullptr; - wchar_t** m_deviceFriendlyNames = nullptr; - -public: - VideoCaptureDeviceList() : - m_ppDevices(NULL), m_numberDevices(0) - { - } - ~VideoCaptureDeviceList() - { - Clear(); - } - - UINT32 Count() const { return m_numberDevices; } - - void Clear(); - HRESULT EnumerateDevices(); - HRESULT GetDevice(UINT32 index, IMFActivate** ppActivate); - std::wstring_view GetDeviceName(UINT32 index); -}; diff --git a/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj b/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj deleted file mode 100644 index a888f90877..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/VideoConferenceShared.vcxproj +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - Debug - Win32 - - - Debug - x64 - - - Debug - ARM64 - - - Release - Win32 - - - Release - x64 - - - Release - ARM64 - - - - - mfplat.lib;Mfsensorgroup.lib;Mf.lib;Shlwapi.lib;Strmiids.lib;%(AdditionalDependencies); - - - - 16.0 - Win32Proj - {459e0768-7ebd-4c41-bba1-6db3b3815e0a} - VideoConferenceShared - - - - StaticLibrary - true - v143 - Unicode - - - - - - - - - - - - ..\..\..\..\$(Platform)\$(Configuration)\ - - - ..\..\..\..\x86\$(Configuration)\ - - - true - - - - NotUsing - - - - - Level4 - true - _DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreadedDebug - true - $(SolutionDir)\src\; - - - Console - true - - - true - - - - - Level4 - true - true - true - NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - MultiThreaded - true - $(SolutionDir)\src\;%(AdditionalIncludeDirectories) - ProgramDatabase - - - Console - true - true - true - - - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. - - - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceShared/naming.cpp b/src/modules/videoconference/VideoConferenceShared/naming.cpp deleted file mode 100644 index b93088cd00..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/naming.cpp +++ /dev/null @@ -1,19 +0,0 @@ -#include "naming.h" - -#include "username.h" - -std::wstring ObtainStableGlobalNameForKernelObject(const std::wstring_view name, const bool restricted) -{ - static const std::optional username = ObtainActiveUserName(); - std::wstring result = L"Global\\"; - if (restricted) - { - result += L"Restricted\\"; - } - if (username) - { - result += *username; - } - result += name; - return result; -} diff --git a/src/modules/videoconference/VideoConferenceShared/naming.h b/src/modules/videoconference/VideoConferenceShared/naming.h deleted file mode 100644 index 8d127b0623..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/naming.h +++ /dev/null @@ -1,5 +0,0 @@ -#pragma once -#include -#include - -std::wstring ObtainStableGlobalNameForKernelObject(const std::wstring_view name, const bool restricted); \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceShared/packages.config b/src/modules/videoconference/VideoConferenceShared/packages.config deleted file mode 100644 index ff4b059648..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/src/modules/videoconference/VideoConferenceShared/pch.h b/src/modules/videoconference/VideoConferenceShared/pch.h deleted file mode 100644 index 128bb3589f..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/pch.h +++ /dev/null @@ -1,2 +0,0 @@ -#pragma once -// Dummy file to allow compiling VideoCaptureDeviceList.h and MicrophoneDevice.h in this project, since it's also used in PowerToys.Interop.vcxproj, which has a pch. diff --git a/src/modules/videoconference/VideoConferenceShared/username.cpp b/src/modules/videoconference/VideoConferenceShared/username.cpp deleted file mode 100644 index d8b99e8dd5..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/username.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "username.h" - -#include -#include - -std::optional ObtainActiveUserName() -{ - const DWORD sessionId = WTSGetActiveConsoleSessionId(); - WCHAR* pUserName; - DWORD _ = 0; - - if (!WTSQuerySessionInformationW(WTS_CURRENT_SERVER_HANDLE, sessionId, WTSUserName, &pUserName, &_)) - { - return std::nullopt; - } - WTSGetActiveConsoleSessionId(); - std::wstring result{ pUserName }; - WTSFreeMemory(pUserName); - return result; -} diff --git a/src/modules/videoconference/VideoConferenceShared/username.h b/src/modules/videoconference/VideoConferenceShared/username.h deleted file mode 100644 index dcbefec38b..0000000000 --- a/src/modules/videoconference/VideoConferenceShared/username.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once - -#include -#include -#include - -std::optional ObtainActiveUserName(); - -std::wstring ObtainStableGlobalNameForKernelObject(const std::wstring_view name, const bool restricted); \ No newline at end of file diff --git a/src/modules/videoconference/make_cab.ddf b/src/modules/videoconference/make_cab.ddf deleted file mode 100644 index 0c75024114..0000000000 --- a/src/modules/videoconference/make_cab.ddf +++ /dev/null @@ -1,20 +0,0 @@ -; Disable default limits -.option EXPLICIT -.set CabinetFileCountThreshold=0 -.set FolderFileCountThreshold=0 -.set FolderSizeThreshold=0 -.set MaxCabinetSize=0 -.set MaxDiskFileCount=0 -.set MaxDiskSize=0 - -.set GenerateInf=ON -.set Compress=OFF -.set Cabinet=ON -.set CabinetNameTemplate=driver.cab -.set DestinationDir=cab_output -.set DiskDirectoryTemplate=driver - -VideoConferenceCustomMediaSource.dll -videoconferencevirtualdriver.cat -VideoConferenceVirtualDriver.dll -VideoConferenceVirtualDriver.inf \ No newline at end of file diff --git a/src/runner/main.cpp b/src/runner/main.cpp index ba893678c1..81a94c5e6c 100644 --- a/src/runner/main.cpp +++ b/src/runner/main.cpp @@ -25,6 +25,7 @@ #include #include #include +#include #include "UpdateUtils.h" #include "ActionRunnerUtils.h" @@ -132,6 +133,15 @@ int runner(bool isProcessElevated, bool openSettings, std::string settingsWindow } }.detach(); chdir_current_executable(); + + // We deprecated a utility called Video Conference Mute, which registered itself as a video input device. + // When running elevated, we try to clean up the device registration from previous installations. + // This is done here too because a user-scope installer won't be able to remove the driver registration due to lack of permissions. + if (isProcessElevated) + { + clean_video_conference(); + } + // Load PowerToys DLLs std::vector knownModules = { @@ -164,12 +174,6 @@ int runner(bool isProcessElevated, bool openSettings, std::string settingsWindow L"PowerToys.CmdNotFoundModuleInterface.dll", L"PowerToys.WorkspacesModuleInterface.dll", }; - const auto VCM_PATH = L"PowerToys.VideoConferenceModule.dll"; - if (const auto mf = LoadLibraryA("mf.dll")) - { - FreeLibrary(mf); - knownModules.emplace_back(VCM_PATH); - } for (auto moduleSubdir : knownModules) { diff --git a/src/runner/settings_window.cpp b/src/runner/settings_window.cpp index 4c2787194e..8a5c2fcf40 100644 --- a/src/runner/settings_window.cpp +++ b/src/runner/settings_window.cpp @@ -674,8 +674,6 @@ std::string ESettingsWindowNames_to_string(ESettingsWindowNames value) return "FileExplorer"; case ESettingsWindowNames::ShortcutGuide: return "ShortcutGuide"; - case ESettingsWindowNames::VideoConference: - return "VideoConference"; case ESettingsWindowNames::Hosts: return "Hosts"; case ESettingsWindowNames::MeasureTool: @@ -751,10 +749,6 @@ ESettingsWindowNames ESettingsWindowNames_from_string(std::string value) { return ESettingsWindowNames::ShortcutGuide; } - else if (value == "VideoConference") - { - return ESettingsWindowNames::VideoConference; - } else if (value == "Hosts") { return ESettingsWindowNames::Hosts; diff --git a/src/runner/settings_window.h b/src/runner/settings_window.h index 6fd5afca0f..4d2a4595ae 100644 --- a/src/runner/settings_window.h +++ b/src/runner/settings_window.h @@ -16,7 +16,6 @@ enum class ESettingsWindowNames PowerRename, FileExplorer, ShortcutGuide, - VideoConference, Hosts, MeasureTool, PowerOCR, diff --git a/src/settings-ui/Settings.UI.Library/EnabledModules.cs b/src/settings-ui/Settings.UI.Library/EnabledModules.cs index 604b4c46ab..e38db5eeb4 100644 --- a/src/settings-ui/Settings.UI.Library/EnabledModules.cs +++ b/src/settings-ui/Settings.UI.Library/EnabledModules.cs @@ -88,22 +88,6 @@ namespace Microsoft.PowerToys.Settings.UI.Library } } - private bool videoConference; // defaulting to off https://github.com/microsoft/PowerToys/issues/14507 - - [JsonPropertyName("Video Conference")] - public bool VideoConference - { - get => this.videoConference; - set - { - if (this.videoConference != value) - { - LogTelemetryEvent(value); - this.videoConference = value; - } - } - } - private bool powerRename = true; public bool PowerRename diff --git a/src/settings-ui/Settings.UI.Library/SndVideoConferenceSettings.cs b/src/settings-ui/Settings.UI.Library/SndVideoConferenceSettings.cs deleted file mode 100644 index b16c79de79..0000000000 --- a/src/settings-ui/Settings.UI.Library/SndVideoConferenceSettings.cs +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Microsoft.PowerToys.Settings.UI.Library -{ - public class SndVideoConferenceSettings - { - [JsonPropertyName("Video Conference")] - public VideoConferenceSettings VideoConference { get; set; } - - public SndVideoConferenceSettings(VideoConferenceSettings settings) - { - VideoConference = settings; - } - - public string ToJsonString() - { - return JsonSerializer.Serialize(this); - } - } -} diff --git a/src/settings-ui/Settings.UI.Library/VideoConferenceConfigProperties.cs b/src/settings-ui/Settings.UI.Library/VideoConferenceConfigProperties.cs deleted file mode 100644 index 9c7b33f804..0000000000 --- a/src/settings-ui/Settings.UI.Library/VideoConferenceConfigProperties.cs +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Text.Json; -using System.Text.Json.Serialization; - -using Settings.UI.Library.Attributes; - -namespace Microsoft.PowerToys.Settings.UI.Library -{ - public class VideoConferenceConfigProperties - { - [CmdConfigureIgnoreAttribute] - public HotkeySettings DefaultMuteCameraAndMicrophoneHotkey => new HotkeySettings() - { - Win = true, - Ctrl = false, - Alt = false, - Shift = true, - Key = "Q", - Code = 81, - }; - - [CmdConfigureIgnoreAttribute] - public HotkeySettings DefaultMuteMicrophoneHotkey => new HotkeySettings() - { - Win = true, - Ctrl = false, - Alt = false, - Shift = true, - Key = "A", - Code = 65, - }; - - [CmdConfigureIgnoreAttribute] - public HotkeySettings DefaultPushToTalkMicrophoneHotkey => new HotkeySettings() - { - Win = true, - Ctrl = false, - Alt = false, - Shift = true, - Key = "I", - Code = 73, - }; - - [CmdConfigureIgnoreAttribute] - public HotkeySettings DefaultMuteCameraHotkey => new HotkeySettings() - { - Win = true, - Ctrl = false, - Alt = false, - Shift = true, - Key = "O", - Code = 79, - }; - - public VideoConferenceConfigProperties() - { - MuteCameraAndMicrophoneHotkey = new KeyboardKeysProperty(DefaultMuteCameraAndMicrophoneHotkey); - MuteMicrophoneHotkey = new KeyboardKeysProperty(DefaultMuteMicrophoneHotkey); - PushToTalkMicrophoneHotkey = new KeyboardKeysProperty(DefaultPushToTalkMicrophoneHotkey); - MuteCameraHotkey = new KeyboardKeysProperty(DefaultMuteCameraHotkey); - - PushToReverseEnabled = new BoolProperty(false); - } - - [JsonPropertyName("mute_camera_and_microphone_hotkey")] - public KeyboardKeysProperty MuteCameraAndMicrophoneHotkey { get; set; } - - [JsonPropertyName("mute_microphone_hotkey")] - public KeyboardKeysProperty MuteMicrophoneHotkey { get; set; } - - [JsonPropertyName("push_to_talk_microphone_hotkey")] - public KeyboardKeysProperty PushToTalkMicrophoneHotkey { get; set; } - - [JsonPropertyName("push_to_reverse_enabled")] - public BoolProperty PushToReverseEnabled { get; set; } - - [JsonPropertyName("mute_camera_hotkey")] - public KeyboardKeysProperty MuteCameraHotkey { get; set; } - - [JsonPropertyName("selected_camera")] - public StringProperty SelectedCamera { get; set; } = string.Empty; - - [JsonPropertyName("selected_mic")] - public StringProperty SelectedMicrophone { get; set; } = string.Empty; - - [JsonPropertyName("toolbar_position")] - public StringProperty ToolbarPosition { get; set; } = "Top right corner"; - - [JsonPropertyName("toolbar_monitor")] - public StringProperty ToolbarMonitor { get; set; } = "Main monitor"; - - [JsonPropertyName("camera_overlay_image_path")] - public StringProperty CameraOverlayImagePath { get; set; } = string.Empty; - - [JsonPropertyName("theme")] - public StringProperty Theme { get; set; } - - [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() - { - return JsonSerializer.Serialize(this); - } - } -} diff --git a/src/settings-ui/Settings.UI.Library/VideoConferenceSettings.cs b/src/settings-ui/Settings.UI.Library/VideoConferenceSettings.cs deleted file mode 100644 index c33bcdaaa6..0000000000 --- a/src/settings-ui/Settings.UI.Library/VideoConferenceSettings.cs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Text.Json.Serialization; - -using Microsoft.PowerToys.Settings.UI.Library.Interfaces; - -namespace Microsoft.PowerToys.Settings.UI.Library -{ - public class VideoConferenceSettings : BasePTModuleSettings, ISettingsConfig - { - public const string ModuleName = "Video Conference"; - - public VideoConferenceSettings() - { - Version = "1"; - Name = ModuleName; - Properties = new VideoConferenceConfigProperties(); - } - - [JsonPropertyName("properties")] - public VideoConferenceConfigProperties Properties { get; set; } - - public string GetModuleName() - { - return Name; - } - - public bool UpgradeSettingsConfiguration() - { - return false; - } - } -} diff --git a/src/settings-ui/Settings.UI.Library/VideoConferenceSettingsIPCMessage.cs b/src/settings-ui/Settings.UI.Library/VideoConferenceSettingsIPCMessage.cs deleted file mode 100644 index 1fdc7f489e..0000000000 --- a/src/settings-ui/Settings.UI.Library/VideoConferenceSettingsIPCMessage.cs +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright (c) Microsoft Corporation -// The Microsoft Corporation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -using System.Text.Json; -using System.Text.Json.Serialization; - -namespace Microsoft.PowerToys.Settings.UI.Library -{ - public class VideoConferenceSettingsIPCMessage - { - [JsonPropertyName("powertoys")] - public SndVideoConferenceSettings Powertoys { get; set; } - - public VideoConferenceSettingsIPCMessage() - { - } - - public VideoConferenceSettingsIPCMessage(SndVideoConferenceSettings settings) - { - this.Powertoys = settings; - } - - public string ToJsonString() - { - return JsonSerializer.Serialize(this); - } - } -} diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Icons/VideoConferenceMute.png b/src/settings-ui/Settings.UI/Assets/Settings/Icons/VideoConferenceMute.png deleted file mode 100644 index 22a39baf64ce97fb1b44d21c8d4e6a6db118af18..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1155 zcmV-}1bq96P)<(^q zt|FpLoj&9EAHVtPJ%GIrIFQlN(Gv`MhoYwgqrhRnoQx1`5mhjTBuUt?eqF=IXnQ<@ zh@hf~3MzuAqM-&VBmxr}QII;C#7vzriz(BlQ?NNUZ`wHL>8GCL(yMPgET1ntWR#P_ zSQ)^`-N0pDkY*^b*0O2idRDDiMwH7T&f!G77nio;Q1>;5I!DdHxLRf=+gL4SlJOn< zXZkdbIN>x({bd&ZG57F`uD;=z{SH3t(yf~}0}!rDMU+~5WLXhUr(UnqSOHNK;jG1q zAPp~#JQ9aE@ggEGDCfzgA|#UM+KC^zNapZb{{K8Wum`D$s7_RUEMf{4r{_#mitJ&;`wBB{@_xMfWt&D@0=6<1|}8RpmAG^T6Jd^4FkuO@WxB*2O#!-v1!4q3 z(n8i$o{c9E=p361w3-)pD(WfKMfpf)Ga{CX#5n0iM|$VDPD1KEXj6bOCWsL27+a_d z>U}0GC&Cno{qePoV#j!ZcHE0x5EP2OxswzlrekETO(u|XPEZZ?;02fYUX6Pg7y|@B z5+3{79G4YDdr}Fxc8^m#uDL)+JaHS@EEnkzhu^0|5P+Z<(ljMa60Eg>N|S~s6`J8( zR~$%Euh&SDGJt=kjqKR*5-@ez%$di#IPM|HM11W35|2E>hU*NRqGvEIG=buhkxqQiKrE=wOmCi2; zi|cC>GB%oGR7qXJ@TAH7f7iXJR>xcDx?Z5B=S#NjyjM@9($|MNA=Q-rfq}jE+IL?R z{lK~O15r6a;RyqK10>|0Yzx}7Vf`zWO5e`qN_kgfECYiB^bPcTa(JSh?;Y)W+R|ft zScdWSwQE-YnJ<+n7E7e{1mII(AA=qsYSz@WxV|lDWc$_^#zsfh3=R%oP$(4(E=?sg z1bQ~7RSU$rg#nYz~v0RRqL VC2A3^L%RR~002ovPDHLkV1nXQA+`Vj diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Modules/OOBE/VideoConferenceMute.png b/src/settings-ui/Settings.UI/Assets/Settings/Modules/OOBE/VideoConferenceMute.png deleted file mode 100644 index 722ee5ca1d3a214b07253bd4f2f1f02fd70515c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56878 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 JPDHLkV1in#Dck@6 diff --git a/src/settings-ui/Settings.UI/Assets/Settings/Modules/VideoConference.png b/src/settings-ui/Settings.UI/Assets/Settings/Modules/VideoConference.png deleted file mode 100644 index 028d98889c62c79590220b7e7aeacfd46ced6fac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55499 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 diff --git a/src/settings-ui/Settings.UI/OOBE/Enums/PowerToysModules.cs b/src/settings-ui/Settings.UI/OOBE/Enums/PowerToysModules.cs index 14646c6647..98e5beb107 100644 --- a/src/settings-ui/Settings.UI/OOBE/Enums/PowerToysModules.cs +++ b/src/settings-ui/Settings.UI/OOBE/Enums/PowerToysModules.cs @@ -27,7 +27,6 @@ namespace Microsoft.PowerToys.Settings.UI.OOBE.Enums QuickAccent, ShortcutGuide, TextExtractor, - VideoConference, MeasureTool, Hosts, Workspaces, diff --git a/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs b/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs index 3b6b3a7681..24910afc6c 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs +++ b/src/settings-ui/Settings.UI/SettingsXAML/App.xaml.cs @@ -440,7 +440,6 @@ namespace Microsoft.PowerToys.Settings.UI case "FileExplorer": return typeof(PowerPreviewPage); case "ShortcutGuide": return typeof(ShortcutGuidePage); case "PowerOcr": return typeof(PowerOcrPage); - case "VideoConference": return typeof(VideoConferencePage); case "MeasureTool": return typeof(MeasureToolPage); case "Hosts": return typeof(HostsPage); case "RegistryPreview": return typeof(RegistryPreviewPage); diff --git a/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeShellPage.xaml b/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeShellPage.xaml index b765b7d963..6c37ec15ea 100644 --- a/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeShellPage.xaml +++ b/src/settings-ui/Settings.UI/SettingsXAML/OOBE/Views/OobeShellPage.xaml @@ -157,10 +157,6 @@ x:Uid="Shell_TextExtractor" Icon="{ui:BitmapIcon Source=/Assets/Settings/Icons/TextExtractor.png}" Tag="TextExtractor" /> - - - - - - - - - - - - - - - - - -