diff --git a/MANUAL.md b/MANUAL.md index ba81fd1..abf3bdf 100644 --- a/MANUAL.md +++ b/MANUAL.md @@ -262,14 +262,16 @@ Item| Shortcut| What it does ### Options menu -The Options menu gathers everything you might want to configure about the app — recording settings, keyboard shortcuts, startup behaviour, and general preferences. +The Options menu gathers everything you might want to configure about the app — recording settings, keyboard shortcuts, profile passwords, and general preferences. Item| Shortcut| What it does ---|---|--- **Recording settings …**| Alt+O, S| Opens the Recording settings dialog. Up to five lists: _Recording source_ (Alt+S), _File format_ (Alt+F), _Audio format attributes_ (Alt+A), _FLAC compression level_ (Alt+L — only shown when FLAC is chosen), and _Channels_ (Alt+C). The attributes list changes to match the format you pick. OK saves to the current profile; Cancel discards. -**Keyboard shortcuts …**| Ctrl+K, or Alt+O, K| Opens the global hotkey dialog (mute, volume, show/hide window, start/stop recording, remote-control commands). -**Startup behaviour …**| Alt+O, T| Opens the Startup behaviour dialog. Choose whether to launch automatically with Windows, which profile to load by default, and whether to start hidden in the tray. -**Preferences …**| Ctrl+P, or Alt+O, P| Opens the Preferences dialog, organised into four tabs (move between them with Ctrl+Tab, or the arrow keys when the tab names have focus): **General** — the profiles folder, accept remote volume commands, UPnP router opening, and keep-logs / write-logs-now; **Audio cues** — the cue list and its sounds (see Audio cue sounds); **Startup behaviour** — start minimised / with Windows / with a specific profile; and **Update settings** — the update checks and install options. Esc or the Close button dismisses it. +**Keyboard shortcuts …**| Ctrl+K, or Alt+O, K| Opens the global hotkey dialog (mute, volume, show/hide window, start/stop recording, remote-control commands, speak the status line). +**Profile passwords …**| Alt+O, W| Lists every profile alongside its password, so you can view or change any of them in one place. +**Reset the default audio device prompt**| Alt+O, R| Brings back the “use only the default audio device?” question if you previously ticked “Don't ask me this again” on it. See Following the Windows default audio device. +**Enable / Disable Realtek ASIO**| —| Only shown if a Realtek ASIO driver is installed. Lets you reverse the choice RemSound offered about disabling that driver (Realtek's generic ASIO driver tends to grab the wrong device and clash with your screen reader). +**Preferences …**| Ctrl+P, or Alt+O, P| Opens the Preferences dialog, organised into five tabs (move between them with Ctrl+Tab, or the arrow keys when the tab names have focus): **General** — the profiles folder, accept remote volume commands, and UPnP router opening; **Audio cues** — the cue list and its sounds (see Audio cue sounds); **Startup behaviour** — start minimised / with Windows / with a specific profile; **Update settings** — the update checks and install options; and **Logging** — enable logs, write logs now, and the log-folder housekeeping (see Logs and diagnostics). Esc or the Close button dismisses it. ### Help menu @@ -311,6 +313,14 @@ Control| Shortcut| What it does All the device lists are checkable lists — tick or untick an item to include or exclude that device. Profiles save which devices are ticked; a new profile starts with everything unticked. +### Following the Windows default audio device + +At the very top of the **WASAPI outputs for received sound** list and the **WASAPI inputs to send** list there's a special entry: **Use Windows default audio device, follows Windows changes**. Tick it and RemSound uses whatever Windows currently treats as the default — the default speakers for received sound, the default microphone for sending — and, the useful part, it **follows that default on its own**. Make a headset your default and RemSound switches to it; unplug it and RemSound moves back, all without you touching the list. + +It works alongside the specific devices: tick the default entry _and_ particular cards, and the sound plays out of (or is captured from) all of them at once. When you first tick it, RemSound asks whether you'd like to untick the other devices in that list, so you can choose to use only the default — with a “Don't ask me this again” option. If you tick that and later want the question back, use **Options → Reset the default audio device prompt**. + +Unlike the specific device ticks (which start fresh each session), the “use default audio device” choice is remembered between launches. It's safe to remember because it can never point at the wrong card — it always resolves to whatever Windows is using right now. + ### Receiving To receive sound you need two things: **Receive audio** ticked, and at least one output device ticked. Without an output device, even when sound arrives there is nowhere for it to go. @@ -751,7 +761,8 @@ Alt+F, M| Rename the current profile Alt+F, N| Minimise to tray Alt+O, S| Recording settings Alt+O, K| Keyboard shortcuts -Alt+O, T| Startup behaviour +Alt+O, W| Profile passwords +Alt+O, R| Reset the default audio device prompt Alt+O, P| Preferences Alt+F, X| Exit @@ -903,7 +914,7 @@ All of these cues play through your default Windows sound output, which is separ ### The Audio cues tab -Open **File → Preferences** (or Ctrl+P) and go to the **Audio cues** tab. (Preferences is now organised into four tabs — General, Audio cues, Startup behaviour and Update settings — which you move between with Ctrl+Tab, or with the arrow keys when the row of tab names has focus.) +Open **File → Preferences** (or Ctrl+P) and go to the **Audio cues** tab. (Preferences is organised into five tabs — General, Audio cues, Startup behaviour, Update settings and Logging — which you move between with Ctrl+Tab, or with the arrow keys when the row of tab names has focus.) The **Audio cue sounds (Alt+N)** list shows every cue by name. Use the up and down arrow keys to move between them — as you land on each cue, RemSound plays its current sound, so you can hear what's set just by arrowing through. @@ -1004,7 +1015,7 @@ You'll see the window close, then reopen on the new version within a second or t When the install finishes and RemSound reopens, it loads the same profile that was running just before the update — you don't see the profile picker, and your devices, peer list, codec and latency settings all come back exactly as they were. This means a silent update in the middle of a session drops the audio briefly while the install finishes, then your session reconnects on its own. You don't have to be at the computer when it happens. -This is a one-shot, just-after-the-update behaviour. The very next time you launch RemSound manually (from the desktop, the Start menu, or the tray icon), it follows your normal startup choice — the picker if that's how you've set it, or your chosen startup profile if you've picked one in Options → Startup behaviour. +This is a one-shot, just-after-the-update behaviour. The very next time you launch RemSound manually (from the desktop, the Start menu, or the tray icon), it follows your normal startup choice — the picker if that's how you've set it, or your chosen startup profile if you've picked one in Preferences → Startup behaviour. If the profile that was running can't be found after the update (you'd renamed or moved it during the session, for example), RemSound falls back to your normal startup behaviour rather than getting stuck. diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index 85aa77d..b609e81 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,34 +1,29 @@ -# RemSound v4.5 +# RemSound v4.6 -Keyboard shortcuts get easier to manage — and people upgrading from before 4.4 no longer lose theirs. +Follow your Windows default audio device — for both the sound you receive and the mic you send. -## Bring your shortcuts across when you upgrade +## Use the Windows default audio device -In version 4.4, keyboard shortcuts moved from being saved per-profile to one shared set for the whole app. If you're updating **from before 4.4**, RemSound now offers — the first time you run it — to **bring your shortcuts across** from one of your existing profiles: it lists your profiles, you pick the one you set your shortcuts up in, or choose to start fresh. (If you already updated to 4.4, nothing changes for you here.) +Both WASAPI device lists now have a new entry at the very top — **"Use Windows default audio device, follows Windows changes"** — in the outputs for received sound, and in the inputs to send. -## A clearer Keyboard shortcuts dialog +Tick it and RemSound uses whatever Windows currently treats as the default (the default speakers for received sound, the default microphone for sending), and — the useful part — it **follows that default automatically**. Make a headset your default and RemSound switches to it on its own; unplug it and it moves back, all without touching the list. -- A new **Clear this shortcut** button next to Close, so clearing a shortcut is discoverable — you no longer have to know the Del key. -- When you're setting a shortcut, pressing **Delete** in that box now leaves it unassigned. - -## Clearer remote-control labels - -The three remote-control rows that adjust a peer's **RemSound** volume now say so — "Send remote RemSound volume up / down to peers" and "Send remote RemSound receive mute toggle to peers" — so they're easy to tell apart from the "Windows global volume" rows. +It works alongside the specific devices: tick the default entry *and* particular cards, and the sound plays out of (or is captured from) all of them at once. When you first turn it on, RemSound offers to untick the other devices so you use only the default — with a "Don't ask me this again" option. If you hide that question and later want it back, use **Options → Reset the default audio device prompt**. ## Compatibility -**v4.5 talks to v3.3 through v4.4 with no trouble** — the over-the-network format is unchanged, so you don't have to update both ends at once. (Everyone still needs **v3.3 or newer**, where end-to-end encryption came in.) +**v4.6 talks to v3.3 through v4.5 with no trouble** — the over-the-network format is unchanged, so you don't have to update both ends at once. (Everyone still needs **v3.3 or newer**, where end-to-end encryption came in.) ## Install -1. Download `RemSound-v4.5.zip` from this release. +1. Download `RemSound-v4.6.zip` from this release. 2. Close RemSound. 3. Extract the zip **over your existing RemSound folder**, overwriting program files when prompted. The zip is program files only — it won't touch your settings, profiles, logs or recordings. 4. Run `RemSound.exe`. ## Upgrading -**From v3.6 or newer:** Help → Check for updates installs v4.5 with the in-app updater — and if it can't finish, it puts your old version back exactly as it was. +**From v3.6 or newer:** Help → Check for updates installs v4.6 with the in-app updater — and if it can't finish, it puts your old version back exactly as it was. **From v1.9–v3.5:** Check for updates works, but uses your current version's older updater for this one hop. If auto-update has been failing on your machine, install by hand using the steps above. diff --git a/readme.html b/readme.html index 887ea04..2f05030 100644 --- a/readme.html +++ b/readme.html @@ -296,14 +296,16 @@ ul, ol { padding-left: 1.4em; }
The Options menu gathers everything you might want to configure about the app — recording settings, keyboard shortcuts, startup behaviour, and general preferences.
+The Options menu gathers everything you might want to configure about the app — recording settings, keyboard shortcuts, profile passwords, and general preferences.
| Item | Shortcut | What it does |
|---|---|---|
| Recording settings… | Alt+O, S | Opens the Recording settings dialog. Up to five lists: Recording source (Alt+S), File format (Alt+F), Audio format attributes (Alt+A), FLAC compression level (Alt+L — only shown when FLAC is chosen), and Channels (Alt+C). The attributes list changes to match the format you pick. OK saves to the current profile; Cancel discards. |
| Keyboard shortcuts… | Ctrl+K, or Alt+O, K | Opens the global hotkey dialog (mute, volume, show/hide window, start/stop recording, remote-control commands). |
| Startup behaviour… | Alt+O, T | Opens the Startup behaviour dialog. Choose whether to launch automatically with Windows, which profile to load by default, and whether to start hidden in the tray. |
| Preferences… | Ctrl+P, or Alt+O, P | Opens the Preferences dialog, organised into four tabs (move between them with Ctrl+Tab, or the arrow keys when the tab names have focus): General — the profiles folder, accept remote volume commands, UPnP router opening, and keep-logs / write-logs-now; Audio cues — the cue list and its sounds (see Audio cue sounds); Startup behaviour — start minimised / with Windows / with a specific profile; and Update settings — the update checks and install options. Esc or the Close button dismisses it. |
| Keyboard shortcuts… | Ctrl+K, or Alt+O, K | Opens the global hotkey dialog (mute, volume, show/hide window, start/stop recording, remote-control commands, speak the status line). |
| Profile passwords… | Alt+O, W | Lists every profile alongside its password, so you can view or change any of them in one place. |
| Reset the default audio device prompt | Alt+O, R | Brings back the “use only the default audio device?” question if you previously ticked “Don't ask me this again” on it. See Following the Windows default audio device. |
| Enable / Disable Realtek ASIO | — | Only shown if a Realtek ASIO driver is installed. Lets you reverse the choice RemSound offered about disabling that driver (Realtek's generic ASIO driver tends to grab the wrong device and clash with your screen reader). |
| Preferences… | Ctrl+P, or Alt+O, P | Opens the Preferences dialog, organised into five tabs (move between them with Ctrl+Tab, or the arrow keys when the tab names have focus): General — the profiles folder, accept remote volume commands, and UPnP router opening; Audio cues — the cue list and its sounds (see Audio cue sounds); Startup behaviour — start minimised / with Windows / with a specific profile; Update settings — the update checks and install options; and Logging — enable logs, write logs now, and the log-folder housekeeping (see Logs and diagnostics). Esc or the Close button dismisses it. |
All the device lists are checkable lists — tick or untick an item to include or exclude that device. Profiles save which devices are ticked; a new profile starts with everything unticked.
+At the very top of the WASAPI outputs for received sound list and the WASAPI inputs to send list there's a special entry: Use Windows default audio device, follows Windows changes. Tick it and RemSound uses whatever Windows currently treats as the default — the default speakers for received sound, the default microphone for sending — and, the useful part, it follows that default on its own. Make a headset your default and RemSound switches to it; unplug it and RemSound moves back, all without you touching the list.
+ +It works alongside the specific devices: tick the default entry and particular cards, and the sound plays out of (or is captured from) all of them at once. When you first tick it, RemSound asks whether you'd like to untick the other devices in that list, so you can choose to use only the default — with a “Don't ask me this again” option. If you tick that and later want the question back, use Options → Reset the default audio device prompt.
+ +Unlike the specific device ticks (which start fresh each session), the “use default audio device” choice is remembered between launches. It's safe to remember because it can never point at the wrong card — it always resolves to whatever Windows is using right now.
+To receive sound you need two things: Receive audio ticked, and at least one output device ticked. Without an output device, even when sound arrives there is nowhere for it to go.
@@ -792,7 +802,8 @@ Audient USB Audio ASIO Driver — Pair 3 (channels 5/6): Loop-back 1 (L) / LOpen File → Preferences (or Ctrl+P) and go to the Audio cues tab. (Preferences is now organised into four tabs — General, Audio cues, Startup behaviour and Update settings — which you move between with Ctrl+Tab, or with the arrow keys when the row of tab names has focus.)
+Open File → Preferences (or Ctrl+P) and go to the Audio cues tab. (Preferences is organised into five tabs — General, Audio cues, Startup behaviour, Update settings and Logging — which you move between with Ctrl+Tab, or with the arrow keys when the row of tab names has focus.)
The Audio cue sounds (Alt+N) list shows every cue by name. Use the up and down arrow keys to move between them — as you land on each cue, RemSound plays its current sound, so you can hear what's set just by arrowing through.
@@ -1061,7 +1072,7 @@ Use whatever key combinations you prefer (for example Ctrl+Shift+Up / Ctrl+ShiftWhen the install finishes and RemSound reopens, it loads the same profile that was running just before the update — you don't see the profile picker, and your devices, peer list, codec and latency settings all come back exactly as they were. This means a silent update in the middle of a session drops the audio briefly while the install finishes, then your session reconnects on its own. You don't have to be at the computer when it happens.
-This is a one-shot, just-after-the-update behaviour. The very next time you launch RemSound manually (from the desktop, the Start menu, or the tray icon), it follows your normal startup choice — the picker if that's how you've set it, or your chosen startup profile if you've picked one in Options → Startup behaviour.
+This is a one-shot, just-after-the-update behaviour. The very next time you launch RemSound manually (from the desktop, the Start menu, or the tray icon), it follows your normal startup choice — the picker if that's how you've set it, or your chosen startup profile if you've picked one in Preferences → Startup behaviour.
If the profile that was running can't be found after the update (you'd renamed or moved it during the session, for example), RemSound falls back to your normal startup behaviour rather than getting stuck.
diff --git a/src/RemSound.App/AboutDialog.cs b/src/RemSound.App/AboutDialog.cs index d16a940..9ac211a 100644 --- a/src/RemSound.App/AboutDialog.cs +++ b/src/RemSound.App/AboutDialog.cs @@ -20,6 +20,25 @@ internal sealed class AboutDialog : Form /// updates" path. private const string ReleaseNotes = """ + RemSound v4.6 + + Follow your Windows default audio device. + + Both device lists — the outputs for received + sound and the inputs to send — now have a "Use + Windows default audio device, follows Windows + changes" entry at the top. Tick it and RemSound + uses whatever Windows is currently using, and + switches with it on its own: make a headset your + default and RemSound follows, no clicking. You + can still tick specific devices alongside it. + + When you turn it on, RemSound offers to untick + the other devices so you use only the default; + if you hide that question with "Don't ask + again", Options → Reset the default audio device + prompt brings it back. + RemSound v4.5 Keyboard shortcuts get easier to manage. diff --git a/src/RemSound.App/MainForm.cs b/src/RemSound.App/MainForm.cs index 59823f4..1605eec 100644 --- a/src/RemSound.App/MainForm.cs +++ b/src/RemSound.App/MainForm.cs @@ -400,6 +400,20 @@ public sealed class MainForm : Form // wired in the constructor; disposed in FormClosing (which unregisters the COM callback). private AudioDeviceChangeNotifier? deviceChangeNotifier; + // The "Use Windows default ..." follower entries sit at the top of the receive-output and + // send-input lists. Ticked, the current Windows default device is resolved live (and re-resolved + // when Windows' default changes). A synthetic sentinel DeviceId that can never collide + // with a real endpoint id (which looks like "{0.0.0.00000000}.{guid}"). + private static readonly AudioDeviceChoice DefaultOutputFollower = + new("Use Windows default audio device, follows Windows changes", "__use-default-output__", CaptureKind.Loopback) { IsDefaultFollower = true }; + private static readonly AudioDeviceChoice DefaultInputFollower = + new("Use Windows default audio device, follows Windows changes", "__use-default-input__", CaptureKind.Input) { IsDefaultFollower = true }; + // The Windows-default device id we last routed to while following, per direction. A default-device + // change doesn't change the device SET, so the list-sync wouldn't catch it — we compare against + // these to spot it and re-route (see ReapplyIfFollowedDefaultChanged). + private string? lastFollowedDefaultOutputId; + private string? lastFollowedDefaultInputId; + // Receive-output device IDs the user/profile selected — kept even while a device is unplugged, // so a card that returns is silently re-ticked and re-opened (issue #5: recover after USB // unplug). Receive-only: the send lists deliberately don't persist selection (AudioDeviceCatalog). @@ -1042,15 +1056,25 @@ public sealed class MainForm : Form receiveOutputDevicesList.ItemCheck += (_, e) => { if (suppressDeviceCheckChange) return; - // Track the user's intent so a card that's later unplugged is re-ticked + re-opened when - // it returns (issue #5). See ReapplyRememberedReceiveOutputs. - if (receiveOutputDevicesList.Items[e.Index] is AudioDeviceChoice c && c.DeviceId is { } rid) + if (receiveOutputDevicesList.Items[e.Index] is AudioDeviceChoice c) { - if (e.NewValue == CheckState.Checked) rememberedReceiveOutputIds.Add(rid); - else rememberedReceiveOutputIds.Remove(rid); + if (c.IsDefaultFollower) + { + // Machine-wide preference (AppConfig), not part of the profile. + var on = e.NewValue == CheckState.Checked; + PersistUseDefaultDevice(output: true, on); + if (on) BeginInvoke(new Action(() => MaybeUntickOthersForDefault(receiveOutputDevicesList, output: true))); + } + else if (c.DeviceId is { } rid) + { + // Track the user's intent so a card that's later unplugged is re-ticked + re-opened + // when it returns (issue #5). See ReapplyRememberedReceiveOutputs. + if (e.NewValue == CheckState.Checked) rememberedReceiveOutputIds.Add(rid); + else rememberedReceiveOutputIds.Remove(rid); + MarkProfileDirty(); + } } BeginInvoke(ApplyReceiveDevices); - MarkProfileDirty(); }; WireCheckedListAccessibility(sendOutputDevicesList, sendOutputDevicesStatusLabel, "output device"); WireCheckedListAccessibility(sendInputDevicesList, sendInputDevicesStatusLabel, "input device"); @@ -1060,6 +1084,15 @@ public sealed class MainForm : Form if (suppressDeviceCheckChange) return; logFile.Event($"ui: capture (WASAPI mic) '{sendInputDevicesList.Items[args.Index]}' {(args.NewValue == CheckState.Checked ? "ticked" : "unticked")}"); BeginInvoke(ApplyAudioRuntime); + if (sendInputDevicesList.Items[args.Index] is AudioDeviceChoice { IsDefaultFollower: true }) + { + // Machine-wide preference (AppConfig), not part of the profile — and no mic-block check + // (the default mic could be anything; the runtime apply handles a blocked default). + var on = args.NewValue == CheckState.Checked; + PersistUseDefaultDevice(output: false, on); + if (on) BeginInvoke(new Action(() => MaybeUntickOthersForDefault(sendInputDevicesList, output: false))); + return; + } MarkProfileDirty(); // Heads-up when the user ticks a WASAPI mic ON but Windows is blocking desktop-app // microphone access — capture would open but silently send nothing. Deferred so the @@ -1826,6 +1859,15 @@ public sealed class MainForm : Form }; profilePasswordsItem.Click += (_, _) => OpenProfilePasswordManager(); + // Reset the one-time "untick the other devices?" prompt that appears when you turn on a + // "Use Windows default audio device" box — clears the remembered Yes/No so it asks again. + // Mirrors the Realtek toggle's "let the user reverse a one-time decision" pattern. + var resetDefaultDeviceItem = new ToolStripMenuItem("&Reset the default audio device prompt") + { + AccessibleName = "Reset the default audio device prompt", + }; + resetDefaultDeviceItem.Click += (_, _) => ResetDefaultAudioDevicePrompt(); + // Realtek ASIO enable/disable toggle — only present when a Realtek ASIO driver is actually // installed. Lets the user reverse the disable decision (or disable a driver they kept). ToolStripMenuItem? realtekToggle = null; @@ -1844,6 +1886,7 @@ public sealed class MainForm : Form recordingSettingsItem, keyboardItem, profilePasswordsItem, + resetDefaultDeviceItem, }; if (realtekToggle is not null) optionItems.Add(realtekToggle); optionItems.Add(new ToolStripSeparator()); @@ -3932,10 +3975,25 @@ public sealed class MainForm : Form { if (item.DeviceId is { } id) specs.Add(new CaptureSourceSpec(id, CaptureKind.Loopback, item.Name)); } + var addedInputIds = new HashSet