Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 6 additions & 6 deletions src/Earmark.App/Hosting/HostBuilderExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -47,13 +47,13 @@ public static HostApplicationBuilder ConfigureEarmark(this HostApplicationBuilde

builder.Services.AddSingleton<MainWindow>();
builder.Services.AddSingleton<ShellViewModel>();
builder.Services.AddTransient<RulesViewModel>();
builder.Services.AddTransient<SessionsViewModel>();
builder.Services.AddTransient<SettingsViewModel>();
builder.Services.AddSingleton<RulesViewModel>();
builder.Services.AddSingleton<SessionsViewModel>();
builder.Services.AddSingleton<SettingsViewModel>();

builder.Services.AddTransient<RulesPage>();
builder.Services.AddTransient<SessionsPage>();
builder.Services.AddTransient<SettingsPage>();
builder.Services.AddSingleton<RulesPage>();
builder.Services.AddSingleton<SessionsPage>();
builder.Services.AddSingleton<SettingsPage>();

return builder;
}
Expand Down
4 changes: 4 additions & 0 deletions src/Earmark.Audio/Services/AudioEndpointService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -188,6 +188,10 @@ private List<AudioEndpoint> BuildList(DataFlow dataFlow)
{
_logger.LogWarning(ex, "Failed to map endpoint {Id}", device.ID);
}
finally
{
device.Dispose();
}
}

return list;
Expand Down
45 changes: 43 additions & 2 deletions src/Earmark.Audio/Services/AudioSessionService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -112,16 +112,27 @@ private List<AudioSession> BuildSnapshot()
for (var i = 0; i < sessions.Count; i++)
{
var session = sessions[i];
if (TryMap(session, device.ID, out var mapped))
try
{
results.Add(mapped);
if (TryMap(session, device.ID, out var mapped))
{
results.Add(mapped);
}
}
finally
{
session.Dispose();
}
}
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Enumerating sessions on {Id} failed", device.ID);
}
finally
{
device.Dispose();
}
}

return results;
Expand All @@ -142,15 +153,24 @@ private void AttachAll()

foreach (var device in _enumerator.EnumerateAudioEndPoints(DataFlow.Render, DeviceState.Active))
{
var attached = false;
try
{
var watcher = new SessionWatcher(device, this);
_watchers[device.ID] = watcher;
attached = true;
}
catch (Exception ex)
{
_logger.LogWarning(ex, "Failed to attach session watcher to {Id}", device.ID);
}
finally
{
if (!attached)
{
device.Dispose();
}
}
}
}

Expand Down Expand Up @@ -264,8 +284,10 @@ private sealed class SessionWatcher : IAudioSessionEventsHandler, IDisposable
private readonly MMDevice _device;
private readonly AudioSessionService _owner;
private readonly NotificationClient _notify;
private readonly System.Collections.Concurrent.ConcurrentBag<AudioSessionControl> _registeredControls = new();

private readonly string _deviceId;
private bool _disposed;

public SessionWatcher(MMDevice device, AudioSessionService owner)
{
Expand All @@ -280,10 +302,16 @@ public SessionWatcher(MMDevice device, AudioSessionService owner)

private void OnSessionCreated(object sender, IAudioSessionControl newSession)
{
if (_disposed)
{
return;
}

try
{
var control = new AudioSessionControl(newSession);
control.RegisterEventClient(this);
_registeredControls.Add(control);
if (_owner.TryMap(control, _deviceId, out var mapped))
{
_owner._logger.LogInformation(
Expand All @@ -310,6 +338,13 @@ public void OnGroupingParamChanged(ref Guid groupingId) { }

public void Dispose()
{
if (_disposed)
{
return;
}

_disposed = true;

try
{
_device.AudioSessionManager.OnSessionCreated -= OnSessionCreated;
Expand All @@ -319,6 +354,12 @@ public void Dispose()
// Ignore.
}

while (_registeredControls.TryTake(out var control))
{
try { control.UnRegisterEventClient(this); } catch { }
try { control.Dispose(); } catch { }
}

_device.Dispose();
_ = _notify;
}
Expand Down
Loading