Skip to content

Commit b2e1de5

Browse files
committed
feat(AudioSwitching): Add support for Windows 11
Fixes #797 Fixes #548
1 parent 718bbe8 commit b2e1de5

File tree

3 files changed

+61
-6
lines changed

3 files changed

+61
-6
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,28 @@
1-
using SoundSwitch.Audio.Manager.Interop.Com.Base;
1+
using System;
2+
using SoundSwitch.Audio.Manager.Interop.Com.Base;
23
using SoundSwitch.Audio.Manager.Interop.Interface.Policy.Extended;
34
using WinRT;
45

56
namespace SoundSwitch.Audio.Manager.Interop.Factory
67
{
78
internal sealed class AudioPolicyConfigFactory
89
{
10+
private const int OS_21H2_VERSION = 21390;
11+
912
public static IAudioPolicyConfigFactory Create()
1013
{
11-
var iid = GuidGenerator.CreateIID(typeof(IAudioPolicyConfigFactory));
1214
using var name = HSTRING.FromString("Windows.Media.Internal.AudioPolicyConfig");
15+
16+
if (Environment.OSVersion.Version.Build >= OS_21H2_VERSION)
17+
{
18+
var iid21H2 = GuidGenerator.CreateIID(typeof(IAudioPolicyConfigFactoryVariant21H2Windows11));
19+
ComBase.RoGetActivationFactory(name, ref iid21H2, out object factory21H2);
20+
return factory21H2.As<IAudioPolicyConfigFactoryVariant21H2Windows11>();
21+
}
22+
23+
var iid = GuidGenerator.CreateIID(typeof(IAudioPolicyConfigFactoryWindows10Pre21H2));
1324
ComBase.RoGetActivationFactory(name, ref iid, out object factory);
14-
return factory.As<IAudioPolicyConfigFactory>();
25+
return factory.As<IAudioPolicyConfigFactoryWindows10Pre21H2>();
1526
}
1627
}
1728
}

SoundSwitch.Audio.Manager/Interop/Interface/Policy/Extended/IAudioPolicyConfigFactory.cs

+46-2
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,51 @@
55

66
namespace SoundSwitch.Audio.Manager.Interop.Interface.Policy.Extended
77
{
8+
public interface IAudioPolicyConfigFactory
9+
{
10+
HRESULT SetPersistedDefaultAudioEndpoint(uint processId, EDataFlow flow, ERole role, HSTRING deviceId);
11+
HRESULT GetPersistedDefaultAudioEndpoint(uint processId, EDataFlow flow, ERole role, [Out, MarshalAs(UnmanagedType.HString)] out HSTRING deviceId);
12+
HRESULT ClearAllPersistedApplicationDefaultEndpoints();
13+
}
14+
15+
[Guid("ab3d4648-e242-459f-b02f-541c70306324")]
16+
[InterfaceType(ComInterfaceType.InterfaceIsIInspectable)]
17+
public interface IAudioPolicyConfigFactoryVariant21H2Windows11 : IAudioPolicyConfigFactory
18+
{
19+
int __incomplete__add_CtxVolumeChange();
20+
int __incomplete__remove_CtxVolumeChanged();
21+
int __incomplete__add_RingerVibrateStateChanged();
22+
int __incomplete__remove_RingerVibrateStateChange();
23+
int __incomplete__SetVolumeGroupGainForId();
24+
int __incomplete__GetVolumeGroupGainForId();
25+
int __incomplete__GetActiveVolumeGroupForEndpointId();
26+
int __incomplete__GetVolumeGroupsForEndpoint();
27+
int __incomplete__GetCurrentVolumeContext();
28+
int __incomplete__SetVolumeGroupMuteForId();
29+
int __incomplete__GetVolumeGroupMuteForId();
30+
int __incomplete__SetRingerVibrateState();
31+
int __incomplete__GetRingerVibrateState();
32+
int __incomplete__SetPreferredChatApplication();
33+
int __incomplete__ResetPreferredChatApplication();
34+
int __incomplete__GetPreferredChatApplication();
35+
int __incomplete__GetCurrentChatApplications();
36+
int __incomplete__add_ChatContextChanged();
37+
int __incomplete__remove_ChatContextChanged();
38+
39+
[PreserveSig]
40+
HRESULT SetPersistedDefaultAudioEndpoint(uint processId, EDataFlow flow, ERole role, HSTRING deviceId);
41+
42+
[PreserveSig]
43+
HRESULT GetPersistedDefaultAudioEndpoint(uint processId, EDataFlow flow, ERole role, [Out, MarshalAs(UnmanagedType.HString)] out HSTRING deviceId);
44+
45+
[PreserveSig]
46+
HRESULT ClearAllPersistedApplicationDefaultEndpoints();
47+
}
48+
849
[Guid("2a59116d-6c4f-45e0-a74f-707e3fef9258")]
9-
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
50+
[InterfaceType(ComInterfaceType.InterfaceIsIInspectable)]
1051
[ComImport]
11-
public interface IAudioPolicyConfigFactory
52+
public interface IAudioPolicyConfigFactoryWindows10Pre21H2 : IAudioPolicyConfigFactory
1253
{
1354
void GetIids(out int iidCount, out IntPtr iids);
1455
void GetRuntimeClassName(out IntPtr className);
@@ -33,10 +74,13 @@ public interface IAudioPolicyConfigFactory
3374
int __incomplete__GetCurrentChatApplications();
3475
int __incomplete__add_ChatContextChanged();
3576
int __incomplete__remove_ChatContextChanged();
77+
3678
[PreserveSig]
3779
HRESULT SetPersistedDefaultAudioEndpoint([In] uint processId, [In] EDataFlow flow, [In] ERole role, [In] HSTRING deviceId);
80+
3881
[PreserveSig]
3982
HRESULT GetPersistedDefaultAudioEndpoint([In] uint processId, [In] EDataFlow flow, [In] ERole role, [Out] out HSTRING deviceId);
83+
4084
[PreserveSig]
4185
HRESULT ClearAllPersistedApplicationDefaultEndpoints();
4286
}

SoundSwitch.Audio.Manager/SoundSwitch.Audio.Manager.csproj

+1-1
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<Configurations>Debug;Release;Nightly</Configurations>
88
<Platforms>AnyCPU</Platforms>
99
<AssemblyTitle>SoundSwitch.Audio.Manager</AssemblyTitle>
10-
<Version>3.2.1</Version>
10+
<Version>4.0.0</Version>
1111
</PropertyGroup>
1212
<ItemGroup>
1313
<PackageReference Include="Microsoft.CSharp" Version="4.7.0" />

0 commit comments

Comments
 (0)