Support for multiple audio devices. such as when using voicemeeter

improved display name and icon support
fixed issues with games like halo master chief collection, which threw exceptions when getting the display name
This commit is contained in:
2023-09-30 19:54:35 -06:00
parent 2b10b6d7a6
commit 4c1ccd9025
13 changed files with 602 additions and 182 deletions

View File

@ -6,14 +6,16 @@
xmlns:local="clr-namespace:SoundBrowser"
mc:Ignorable="d"
Title="MainWindow" Height="800" Width="800">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<ScrollViewer>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<TextBlock x:Name="_tf" Grid.Row="0">current</TextBlock>
<TextBlock x:Name="_tf2" Grid.Row="1">list</TextBlock>
<TextBlock x:Name="_tf" Grid.Row="0">current</TextBlock>
<TextBlock x:Name="_tf2" Grid.Row="1">list</TextBlock>
</Grid>
</Grid>
</ScrollViewer>
</Window>

View File

@ -1,5 +1,6 @@
using CoreAudio;
using FocusVolumeControl;
using FocusVolumeControl;
using FocusVolumeControl.AudioHelpers;
using FocusVolumeControl.AudioSessions;
using System;
using System.Diagnostics;
using System.Text;
@ -56,18 +57,11 @@ public partial class MainWindow : Window
foreach (var p in processes)
{
var (displayName, _) = (new NameAndIconHelper()).GetProcessInfo(p);
sb.AppendLine($"pid: {p.Id}");
sb.AppendLine($"\tprocessName: {p.ProcessName}");
try
{
sb.AppendLine($"\tFileDescription: {p!.MainModule!.FileVersionInfo.FileDescription}");
}
catch
{
sb.AppendLine("\tFileDescription: ##ERROR##");
}
sb.AppendLine($"\tDisplayName: {displayName}");
}
@ -93,26 +87,39 @@ public partial class MainWindow : Window
var sb = new StringBuilder();
sb.AppendLine("-------------------------------------------------------------------------------");
var deviceEnumerator = new MMDeviceEnumerator(Guid.NewGuid());
var deviceEnumerator = (IMMDeviceEnumerator)new MMDeviceEnumerator();
using var device = deviceEnumerator.GetDefaultAudioEndpoint(DataFlow.Render, Role.Multimedia);
using var manager = device.AudioSessionManager2;
deviceEnumerator.EnumAudioEndpoints(DataFlow.Render, DeviceState.Active, out var deviceCollection);
deviceCollection.GetCount(out var num);
var sessions = manager!.Sessions;
foreach (var session in sessions!)
for(int i = 0; i < num; i++)
{
var audioProcess = Process.GetProcessById((int)session.ProcessID);
deviceCollection.Item(i, out var device);
//todo: put the device name in the output
sb.AppendLine("----");
var displayName = audioProcess!.MainModule!.FileVersionInfo.FileDescription;
Guid iid = typeof(IAudioSessionManager2).GUID;
device.Activate(ref iid, 0, IntPtr.Zero, out var m);
var manager = (IAudioSessionManager2)m;
sb.AppendLine($"pid: {audioProcess.Id}");
sb.AppendLine($"\tprocessName: {audioProcess.ProcessName}");
sb.AppendLine($"\tsession: {displayName}");
manager.GetSessionEnumerator(out var sessionEnumerator);
sessionEnumerator.GetCount(out var count);
for (int s = 0; s < count; s++)
{
sessionEnumerator.GetSession(s, out var session);
session.GetProcessId(out var processId);
var audioProcess = Process.GetProcessById(processId);
var (displayName, _) = (new NameAndIconHelper()).GetProcessInfo(audioProcess);
sb.AppendLine($"pid: {audioProcess.Id}\t\t processName: {displayName}");
}
_tf2.Text = sb.ToString();
}
_tf2.Text = sb.ToString();
}
}

View File

@ -7,10 +7,6 @@
<UseWPF>true</UseWPF>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="CoreAudio" Version="1.27.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\FocusVolumeControl\FocusVolumeControl.csproj" />
</ItemGroup>