fix(windows): real native exclude + self-echo removal for screen audio
"All apps except selected" previously captured the complement of a frozen app snapshot in INCLUDE mode (missed late-launched apps and system sounds, wasted captures on silent windows). It now opens a single ProcessLoopbackCapture in EXCLUDE mode (AUDIOCLIENT_PROCESS_LOOPBACK_MODE_EXCLUDE_TARGET_PROCESS_TREE) of the one chosen app — true system-mix-minus-one, dynamic so apps launched after sharing starts are included. The picker enforces single-selection in exclude mode (the activation params take one target PID). Adds an "Exclude VoiceCat's own audio (prevents echo)" checkbox (default on, entire-desktop only) that routes the desktop capture through the same EXCLUDE path targeting our own process id, killing the whole-device self-echo loop. No C++/ABI changes. Updates voice.md and PROGRESS.md. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -640,7 +640,7 @@ public partial class MainForm : Form
|
||||
|
||||
var scope = picker.ChosenScope;
|
||||
|
||||
if (scope is EntireDesktop)
|
||||
if (scope is EntireDesktop { ExcludeSelf: false })
|
||||
{
|
||||
// Existing whole-device WASAPI loopback path — core handles it.
|
||||
var (result, streamId) = _client.StartStream(VcStreamKind.ScreenAudio, "Desktop audio");
|
||||
@@ -654,7 +654,8 @@ public partial class MainForm : Form
|
||||
}
|
||||
else
|
||||
{
|
||||
// Per-app path: suppress core loopback, C# mixer feeds PCM.
|
||||
// External-feed path: suppress core loopback, C# mixer feeds PCM. Covers the
|
||||
// per-app modes and "entire desktop except VoiceCat" (single EXCLUDE of self).
|
||||
var (result, streamId) = _client.StartStreamExternalFeed(VcStreamKind.ScreenAudio, "App audio");
|
||||
if (result != VcResult.Ok)
|
||||
{
|
||||
@@ -664,12 +665,13 @@ public partial class MainForm : Form
|
||||
_screenStreamId = streamId;
|
||||
|
||||
_screenMixer = new ProcessAudioMixer();
|
||||
_screenMixer.Start(scope, _client, streamId, picker.VisibleApps);
|
||||
_screenMixer.Start(scope, _client, streamId);
|
||||
|
||||
string desc = scope switch
|
||||
{
|
||||
EntireDesktop => "entire desktop (excluding VoiceCat)",
|
||||
OnlyApps o => $"only {o.Pids.Count} app(s)",
|
||||
AllExceptApps a => $"all except {a.Pids.Count} app(s)",
|
||||
AllExceptApps a => $"all except {a.Names[0]}",
|
||||
_ => "apps",
|
||||
};
|
||||
AddActivity($"Sharing screen audio: {desc}");
|
||||
|
||||
Reference in New Issue
Block a user