Skip to content

Commit 8da80ed

Browse files
committed
Merge branch 'dev'
2 parents 634ac2a + a980a7b commit 8da80ed

4 files changed

Lines changed: 111 additions & 72 deletions

File tree

Source/SystemMicControlLite/Private/SystemMicControlLiteBPLibrary.cpp

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,11 @@ FString USystemMicControlLiteBPLibrary::GetMicDefaultDeviceName()
2121
return FSystemMicLiteManager::Get()->GetDefaultDeviceName();
2222
}
2323

24+
FString USystemMicControlLiteBPLibrary::GetMicDefaultDeviceId()
25+
{
26+
return FSystemMicLiteManager::Get()->GetDefaultDeviceId();
27+
}
28+
2429
void USystemMicControlLiteBPLibrary::GetMicDeviceIdFromName(const FString& InDeviceName, FString& OutDeviceId)
2530
{
2631
OutDeviceId = FSystemMicLiteManager::Get()->GetDeviceIdFromName(InDeviceName);
@@ -41,14 +46,26 @@ void USystemMicControlLiteBPLibrary::SetMicVolumeForDeviceId(const FString& Devi
4146
FSystemMicLiteManager::Get()->SetVolume(Volume, DeviceId);
4247
}
4348

49+
void USystemMicControlLiteBPLibrary::SetMicVolumeForDeviceName(const FString& DeviceName, float Volume)
50+
{
51+
const FString DeviceId = FSystemMicLiteManager::Get()->GetDeviceIdFromName(DeviceName);
52+
FSystemMicLiteManager::Get()->SetVolume(Volume, DeviceId);
53+
}
54+
4455
float USystemMicControlLiteBPLibrary::GetMicVolume()
4556
{
4657
return FSystemMicLiteManager::Get()->GetVolume();
4758
}
4859

49-
float USystemMicControlLiteBPLibrary::GetMicVolumeForDeviceId(const FString& DeviceId)
60+
void USystemMicControlLiteBPLibrary::GetMicVolumeForDeviceId(const FString& InDeviceId, float& OutVolume)
61+
{
62+
OutVolume = FSystemMicLiteManager::Get()->GetVolume(InDeviceId);
63+
}
64+
65+
void USystemMicControlLiteBPLibrary::GetMicVolumeForDeviceName(const FString& InDeviceName, float& OutVolume)
5066
{
51-
return FSystemMicLiteManager::Get()->GetVolume(DeviceId);
67+
const FString DeviceId = FSystemMicLiteManager::Get()->GetDeviceIdFromName(InDeviceName);
68+
OutVolume = FSystemMicLiteManager::Get()->GetVolume(DeviceId);
5269
}
5370

5471
TMap<FString, FString> USystemMicControlLiteBPLibrary::GetMicActiveDevices()

Source/SystemMicControlLite/Private/SystemMicLiteManager.cpp

Lines changed: 66 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -66,46 +66,25 @@ void FSystemMicLiteManager::DestroyInstance()
6666
}
6767
}
6868

69-
FString FSystemMicLiteManager::GetDefaultDeviceName()
69+
FString FSystemMicLiteManager::GetDefaultDeviceName() const
7070
{
71-
return GetDeviceNameFromId(GetDefaultDeviceId());
71+
#if PLATFORM_WINDOWS
72+
return GetDeviceName(GetDevice());
73+
#else
74+
return FString(TEXT(""));
75+
#endif
7276
}
7377

74-
FString FSystemMicLiteManager::GetDefaultDeviceId()
78+
FString FSystemMicLiteManager::GetDefaultDeviceId() const
7579
{
76-
FString DeviceIdStr;
77-
7880
#if PLATFORM_WINDOWS
79-
TComPtr<IMMDevice> Device = GetDevice();
80-
if (!Device.IsValid())
81-
{
82-
return FString(TEXT(""));
83-
}
84-
85-
// https://msdn.microsoft.com/en-us/library/windows/desktop/dd371405(v=vs.85).aspx, see Return value!
86-
TComPtr<IAudioEndpointVolume> AudioEndpointVolume = GetAudioEndpointVolume(Device);
87-
if (!AudioEndpointVolume.IsValid())
88-
{
89-
return FString(TEXT(""));
90-
}
91-
92-
WCHAR* swDeviceId = TCHAR_TO_WCHAR(TEXT(""));
93-
HRESULT Result = Device->GetId(&swDeviceId);
94-
if (Result != S_OK)
95-
{
96-
UE_LOG(LogSystemMicLiteManager, Warning, TEXT("Result != S_OK, Device->GetId, [%s], line: %d"), ANSI_TO_TCHAR(__FUNCTION__), __LINE__);
97-
return FString(TEXT(""));
98-
}
99-
DeviceIdStr = FString(WCHAR_TO_TCHAR(swDeviceId));
100-
101-
CoTaskMemFree(swDeviceId);
102-
swDeviceId = nullptr;
81+
return GetDeviceId(GetDevice());
82+
#else
83+
return FString(TEXT(""));
10384
#endif
104-
105-
return DeviceIdStr;
10685
}
10786

108-
FString FSystemMicLiteManager::GetDeviceIdFromName(const FString& DeviceName)
87+
FString FSystemMicLiteManager::GetDeviceIdFromName(const FString& DeviceName) const
10988
{
11089
FString DeviceId;
11190

@@ -121,7 +100,7 @@ FString FSystemMicLiteManager::GetDeviceIdFromName(const FString& DeviceName)
121100
return DeviceId;
122101
}
123102

124-
FString FSystemMicLiteManager::GetDeviceNameFromId(const FString& DeviceId)
103+
FString FSystemMicLiteManager::GetDeviceNameFromId(const FString& DeviceId) const
125104
{
126105
FString DeviceName;
127106

@@ -137,7 +116,7 @@ FString FSystemMicLiteManager::GetDeviceNameFromId(const FString& DeviceId)
137116
return DeviceName;
138117
}
139118

140-
TMap<FString, FString> FSystemMicLiteManager::GetActiveDevices()
119+
TMap<FString, FString> FSystemMicLiteManager::GetActiveDevices() const
141120
{
142121
TMap<FString, FString> ActiveDevices;
143122

@@ -162,24 +141,12 @@ TMap<FString, FString> FSystemMicLiteManager::GetActiveDevices()
162141
for (UINT i = 0; i < CountActiveDevices; i++)
163142
{
164143
TComPtr<IMMDevice> Device;
165-
TComPtr<IPropertyStore> PropertyStore;
166-
LPWSTR pwszID = nullptr;
167-
168144
DevicesCollection->Item(i, &Device);
169-
Device->GetId(&pwszID);
170-
Device->OpenPropertyStore(STGM_READ, &PropertyStore);
171-
172-
PROPVARIANT nameDevice;
173-
PropVariantInit(&nameDevice);
174-
PropertyStore->GetValue(PKEY_Device_FriendlyName, &nameDevice);
175145

176-
ActiveDevices.Add(FString(WCHAR_TO_TCHAR(pwszID)));
177-
ActiveDevices[FString(WCHAR_TO_TCHAR(pwszID))] = FString(WCHAR_TO_TCHAR(nameDevice.pwszVal));
146+
const FString DeviceId = GetDeviceId(Device);
147+
const FString DeviceName = GetDeviceName(Device);
178148

179-
PropVariantClear(&nameDevice);
180-
181-
CoTaskMemFree(pwszID);
182-
pwszID = nullptr;
149+
ActiveDevices.Add(DeviceId, DeviceName);
183150
}
184151
#endif
185152

@@ -212,7 +179,7 @@ void FSystemMicLiteManager::SetVolume(float Value, const FString& DeviceId)
212179
#endif
213180
}
214181

215-
float FSystemMicLiteManager::GetVolume(const FString& DeviceId)
182+
float FSystemMicLiteManager::GetVolume(const FString& DeviceId) const
216183
{
217184
float MicVolume = 0.0f;
218185

@@ -234,18 +201,18 @@ float FSystemMicLiteManager::GetVolume(const FString& DeviceId)
234201
return GetValueFromScalar(MicVolume);
235202
}
236203

237-
float FSystemMicLiteManager::GetScalarFromValue(int32 Value)
204+
float FSystemMicLiteManager::GetScalarFromValue(int32 Value) const
238205
{
239206
return FMath::Abs(Value) >= 100.0f ? 1.0f : Value / 100.0f;
240207
}
241208

242-
float FSystemMicLiteManager::GetValueFromScalar(float Value)
209+
float FSystemMicLiteManager::GetValueFromScalar(float Value) const
243210
{
244211
return FMath::RoundToFloat(FMath::Abs(Value) > 0.0f ? Value * 100.0f : 0.0f);
245212
}
246213

247214
#if PLATFORM_WINDOWS
248-
TComPtr<IMMDevice> FSystemMicLiteManager::GetDevice(const FString& DeviceId)
215+
TComPtr<IMMDevice> FSystemMicLiteManager::GetDevice(const FString& DeviceId) const
249216
{
250217
TComPtr<IMMDevice> Device;
251218
HRESULT Result = S_OK;
@@ -272,7 +239,51 @@ TComPtr<IMMDevice> FSystemMicLiteManager::GetDevice(const FString& DeviceId)
272239
return Device;
273240
}
274241

275-
TComPtr<IAudioEndpointVolume> FSystemMicLiteManager::GetAudioEndpointVolume(const TComPtr<IMMDevice>& Device)
242+
FString FSystemMicLiteManager::GetDeviceName(const TComPtr<IMMDevice>& Device) const
243+
{
244+
if (!Device.IsValid())
245+
{
246+
return FString(TEXT(""));
247+
}
248+
249+
TComPtr<IPropertyStore> PropertyStore;
250+
Device->OpenPropertyStore(STGM_READ, &PropertyStore);
251+
252+
PROPVARIANT nameDevice;
253+
PropVariantInit(&nameDevice);
254+
PropertyStore->GetValue(PKEY_Device_FriendlyName, &nameDevice);
255+
256+
const FString DeviceName = FString(WCHAR_TO_TCHAR(nameDevice.pwszVal));
257+
258+
PropVariantClear(&nameDevice);
259+
260+
return DeviceName;
261+
}
262+
263+
FString FSystemMicLiteManager::GetDeviceId(const TComPtr<IMMDevice>& Device) const
264+
{
265+
if (!Device.IsValid())
266+
{
267+
return FString(TEXT(""));
268+
}
269+
270+
WCHAR* swDeviceId = TCHAR_TO_WCHAR(TEXT(""));
271+
HRESULT Result = Device->GetId(&swDeviceId);
272+
if (Result != S_OK)
273+
{
274+
UE_LOG(LogSystemMicLiteManager, Warning, TEXT("Result != S_OK, Device->GetId, [%s], line: %d"), ANSI_TO_TCHAR(__FUNCTION__), __LINE__);
275+
return FString(TEXT(""));
276+
}
277+
278+
const FString DeviceId = FString(WCHAR_TO_TCHAR(swDeviceId));
279+
280+
CoTaskMemFree(swDeviceId);
281+
swDeviceId = nullptr;
282+
283+
return DeviceId;
284+
}
285+
286+
TComPtr<IAudioEndpointVolume> FSystemMicLiteManager::GetAudioEndpointVolume(const TComPtr<IMMDevice>& Device) const
276287
{
277288
if (!Device.IsValid())
278289
{
@@ -290,7 +301,7 @@ TComPtr<IAudioEndpointVolume> FSystemMicLiteManager::GetAudioEndpointVolume(cons
290301
return AudioEndpointVolume;
291302
}
292303

293-
TComPtr<IAudioEndpointVolume> FSystemMicLiteManager::GetAudioEndpointVolume(const FString& DeviceId)
304+
TComPtr<IAudioEndpointVolume> FSystemMicLiteManager::GetAudioEndpointVolume(const FString& DeviceId) const
294305
{
295306
TComPtr<IMMDevice> Device = GetDevice(DeviceId);
296307
if (!Device.IsValid())

Source/SystemMicControlLite/Public/SystemMicControlLiteBPLibrary.h

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ class SYSTEMMICCONTROLLITE_API USystemMicControlLiteBPLibrary : public UBlueprin
1717
UFUNCTION(BlueprintPure, Category = "SystemMicControlLite", DisplayName = "Get System Mic Default Device Name")
1818
static FString GetMicDefaultDeviceName();
1919

20+
UFUNCTION(BlueprintPure, Category = "SystemMicControlLite", DisplayName = "Get System Mic Default Device Id")
21+
static FString GetMicDefaultDeviceId();
22+
2023
UFUNCTION(BlueprintCallable, Category = "SystemMicControlLite", DisplayName = "Get System Mic Device Id From Name")
2124
static void GetMicDeviceIdFromName(const FString& InDeviceName, FString& OutDeviceId);
2225

@@ -27,16 +30,22 @@ class SYSTEMMICCONTROLLITE_API USystemMicControlLiteBPLibrary : public UBlueprin
2730
static void SetMicVolume(float Value);
2831

2932
/** If DeviceId is empty then it will set Volume value to the default device microphone in the system */
30-
UFUNCTION(BlueprintCallable, Category = "SystemMicControlLite", DisplayName = "Set System Mic Volume For DeviceId")
33+
UFUNCTION(BlueprintCallable, Category = "SystemMicControlLite", DisplayName = "Set System Mic Volume For Device Id")
3134
static void SetMicVolumeForDeviceId(const FString& DeviceId, float Volume);
3235

36+
UFUNCTION(BlueprintCallable, Category = "SystemMicControlLite", DisplayName = "Set System Mic Volume For Device Name")
37+
static void SetMicVolumeForDeviceName(const FString& DeviceName, float Volume);
38+
3339
UFUNCTION(BlueprintPure, Category = "SystemMicControlLite", DisplayName = "Get System Mic Volume")
3440
static float GetMicVolume();
3541

3642
/** If DeviceId is empty then it will return volume value from the default device microphone in the system */
37-
UFUNCTION(BlueprintPure, Category = "SystemMicControlLite", DisplayName = "Get System Mic Volume For DeviceId")
38-
static float GetMicVolumeForDeviceId(const FString& DeviceId);
39-
43+
UFUNCTION(BlueprintCallable, Category = "SystemMicControlLite", DisplayName = "Get System Mic Volume For Device Id")
44+
static void GetMicVolumeForDeviceId(const FString& InDeviceId, float& OutVolume);
45+
46+
UFUNCTION(BlueprintCallable, Category = "SystemMicControlLite", DisplayName = "Get System Mic Volume For Device Name")
47+
static void GetMicVolumeForDeviceName(const FString& InDeviceName, float& OutVolume);
48+
4049
UFUNCTION(BlueprintPure, Category = "SystemMicControlLite", DisplayName = "Get System Mic Active Devices")
4150
static TMap<FString, FString> GetMicActiveDevices();
4251
};

Source/SystemMicControlLite/Public/SystemMicLiteManager.h

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -40,29 +40,31 @@ class FSystemMicLiteManager
4040

4141
void Init();
4242

43-
FString GetDefaultDeviceName();
43+
FString GetDefaultDeviceName() const;
4444

45-
FString GetDefaultDeviceId();
45+
FString GetDefaultDeviceId() const;
4646

47-
FString GetDeviceIdFromName(const FString& DeviceName);
47+
FString GetDeviceIdFromName(const FString& DeviceName) const;
4848

49-
FString GetDeviceNameFromId(const FString& DeviceId);
49+
FString GetDeviceNameFromId(const FString& DeviceId) const;
5050

51-
TMap<FString, FString> GetActiveDevices();
51+
TMap<FString, FString> GetActiveDevices() const;
5252

5353
void SetVolume(float Value, const FString& DeviceId = FString(TEXT("")));
5454

55-
float GetVolume(const FString& DeviceId = FString(TEXT("")));
55+
float GetVolume(const FString& DeviceId = FString(TEXT(""))) const;
5656

5757
private:
58-
FORCEINLINE float GetScalarFromValue(int32 Value);
58+
FORCEINLINE float GetScalarFromValue(int32 Value) const;
5959

60-
FORCEINLINE float GetValueFromScalar(float Value);
60+
FORCEINLINE float GetValueFromScalar(float Value) const;
6161

6262
#if PLATFORM_WINDOWS
63-
TComPtr<IMMDevice> GetDevice(const FString& DeviceId = FString(TEXT("")));
64-
TComPtr<IAudioEndpointVolume> GetAudioEndpointVolume(const TComPtr<IMMDevice>& Device);
65-
TComPtr<IAudioEndpointVolume> GetAudioEndpointVolume(const FString& DeviceId = FString(TEXT("")));
63+
TComPtr<IMMDevice> GetDevice(const FString& DeviceId = FString(TEXT(""))) const;
64+
FString GetDeviceName(const TComPtr<IMMDevice>& Device) const;
65+
FString GetDeviceId(const TComPtr<IMMDevice>& Device) const;
66+
TComPtr<IAudioEndpointVolume> GetAudioEndpointVolume(const TComPtr<IMMDevice>& Device) const;
67+
TComPtr<IAudioEndpointVolume> GetAudioEndpointVolume(const FString& DeviceId = FString(TEXT(""))) const;
6668
#endif
6769
};
6870

0 commit comments

Comments
 (0)