RemSound is a Windows program for sending live audio between two or more computers with very low delay. You can think of it as a private, peer-to-peer audio link: each machine picks what it wants to capture and what it wants to play out, and audio flows directly between them over UDP.
It was built for music collaboration over the internet (a guitarist on one machine, a vocalist on another, listening to each other in real time), but works just as well for low-latency monitoring across rooms in a house, podcast co-hosting, or any other “send audio from this PC to that PC, fast” use case.
RemSound moves audio from one PC’s microphone or sound card to another PC’s speakers or audio interface, in close-to-real-time, over your network. It’s symmetric: each side runs the same program and chooses independently whether to send, receive, or both.
| Step | What happens |
|---|---|
| 1 | You tick “Send my audio” on the Audio inputs and outputs tab and pick which microphone or audio output you want captured. |
| 2 | Your friend ticks “Receive audio” on the same tab and picks which speakers or headphones to play received audio through. |
| 3 | One of you ticks the other in the Discovered peers list on the Connectivity tab (or types their IP address manually). |
| 4 | Audio starts flowing. The other direction works exactly the same way, independently — both can speak at once. |
There is no central server, no account, nothing in the cloud. Packets go straight from one machine to the other.
Assume you and a friend both have RemSound running and a way to reach each other on the network (same Wi-Fi, same Tailscale account, etc.).
RemSound saves your entire setup — device ticks, send / receive states, codec, packet size, smoothness, latency targets, hotkeys, ASIO driver choice, remembered peers, currently-connected peers — into one JSON file per profile. You pick which profile to load every time you launch the program. Tick a different combination of devices for “morning podcast” vs “evening jam session” and switch between them in two clicks.
When RemSound launches, the first thing you see is the profile selection dialog. It’s a listbox of profile names plus a synthetic (Blank template) entry at the top. The keys are deliberate:
| Key | Action |
|---|---|
| Up / Down | Move between profiles in the list. |
| Enter | Load the highlighted profile (or blank template) and open the main window. |
| OK button | Same as Enter. |
| Del | Delete the highlighted profile, with a yes / no confirmation. |
| Browse… button | Pick a different folder to read profiles from. Useful if you keep your profiles in Dropbox or another sync folder so they roam between machines. The choice is remembered next time RemSound launches. |
| Esc | Deliberately ignored. Picking a profile is required to launch. |
| Alt+F4 | Closes the dialog and exits RemSound — equivalent to “I don’t want to start the program right now.” |
The first profile in the list is highlighted by default, so a fresh install where you only have (Blank template) is just Enter to proceed.
Blank template is a one-shot session with all defaults: nothing ticked in any device list, neither Receive nor Send checked, default codec, no ASIO driver selected, no remembered peers, default hotkeys. You’d pick it for a one-off session you don’t intend to save, or as the starting point for a new profile. The Save and Update button is intentionally hidden when on Blank template — there’s nothing to update, only to save-as-new.
The File menu has two save items:
| Item | What it does |
|---|---|
| File → Save (Ctrl+S) | Overwrites the active profile with the current state. If you’re on Blank template, this falls through to Save as (because there’s no existing profile to overwrite). |
| File → Save as… (Alt+F, A) | Always available. Prompts for a profile name. From Blank template this is how you create the first profile. From an existing profile this forks a copy under a new name and switches to the copy as the active profile. |
The window title bar shows which profile is currently active: RemSound — Active profile: My session name. NVDA reads this on Alt+Tab.
| Action | How |
|---|---|
| Switch to a different profile | File → Open profile (Alt+F, O). Pick a JSON in the file picker. RemSound reloads under that profile. |
| Rename the active profile | File → Rename current profile (Alt+F, R). Prompts for the new name and renames the JSON on disk; window title updates immediately. |
| Delete a profile | File → Open profile, then right-click the entry in the Windows file picker and choose Delete. Hands the action off to Windows Explorer rather than reimplementing it inside RemSound. |
One JSON file per profile. By default, stored at:
<RemSound folder>\profiles\<your machine name>\<profile name>.json
The per-machine subfolder keeps each computer’s profiles separate. If you used the Browse… button on the startup dialog to pick a different folder (e.g. inside Dropbox), profiles are stored directly under that folder — no per-machine subfolder, so two machines pointing at the same shared folder see exactly the same list.
You can also copy a profile JSON between machines: drop it into the other machine’s profile folder and it appears in their startup dialog. If the new machine doesn’t have the same hardware (different sound cards, different ASIO drivers), those device ticks are silently skipped at load time — RemSound won’t error or warn, the relevant lists just won’t have those entries ticked.
A short list of things that intentionally aren’t profile-saved:
remsound.config.json next to the executable.The main window has three things stacked vertically:
| Tab | What it’s for |
|---|---|
| Connectivity | Connected, discovered, and remembered peers. Add a peer by IP. Connection status read-out. |
| Audio inputs and outputs | ASIO driver picker (when an ASIO driver is installed), the Receive audio and Send my audio checkboxes, and all the device-tick lists. Selecting a real driver in the picker brings up the ASIO device lists alongside the WASAPI ones; (none) hides them. |
| Audio profile | Codec, packet size, lock-to-audio-clock, latency, continuous auto-tune, buffer smoothness, artefact sound. Split into Audio send parameters and Audio receive parameters sections so NVDA announces which group you’ve entered as you tab through. |
Press Alt+F to open the menu, then the underlined letter for the item you want, or use the single-press shortcut from the table below.
| Item | Shortcut | What it does |
|---|---|---|
| Open profile… | Alt+F, O | Opens a Windows file picker rooted at the profiles folder. Pick a JSON, RemSound reloads under that profile (window closes and reopens with all its device ticks, peers, and settings restored). To delete a profile from disk, right-click an entry inside the file picker and choose Delete — that hands the action off to Windows Explorer. |
| Save | Ctrl+S | Overwrites the active profile with the current state. If there’s no active profile (you’re on Blank template), this falls through to Save as automatically. |
| Save as… | Alt+F, A | Prompts for a profile name and saves a copy. Use this to fork the current state under a new name, or to save the first time from Blank template. |
| Rename current profile… | Alt+F, R | Renames the JSON file on disk and updates the window title. No-op on Blank template (no profile to rename). |
| Minimise to tray | Alt+F, M | Hides the window to the system tray. Reachable via the File menu chain (Alt+F to open the menu, then M for Minimise). To bring the window back, click the tray icon or use the configurable "Show or hide window" global hotkey (Keyboard shortcuts dialog, default Ctrl+Shift+F10). |
| Keyboard shortcuts… | Ctrl+K | Opens the global hotkey configuration dialog (mute, volume, tray show/hide, remote-control sends). |
| Preferences… | Ctrl+P | Opens the Preferences dialog. Sticky machine-local choices live here: profile folder, mute connect/disconnect sounds, accept remote volume commands, startup behaviour, update-check frequency, manual check-for-updates button, silently install updates, enable logs, write logs now. Esc or the Close button dismisses. |
| Exit | Alt+F, X (or Alt+F4) | Closes RemSound. If there are unsaved profile changes you’ll be prompted first. |
Press Alt+H to open the menu, then the underlined letter for the item you want.
| Item | Shortcut | What it does |
|---|---|---|
| Help | F1 (anywhere), or Alt+H, H | Opens this user manual in your default browser. F1 also works from inside every dialog (Preferences, Keyboard shortcuts, About, Startup behaviour) and from the startup profile picker before the main window has loaded. |
| Check for updates | Alt+H, C | Asks the RemSound GitHub Releases page whether a newer build is available. If yes, you get a confirmation dialog with the release notes and a Yes / No to install. If you’re already on the latest version, an “you are running the latest version” popup confirms it. (For automatic background checks instead of pressing this button by hand, see Updating RemSound.) |
| About RemSound | Alt+H, A | Small modal dialog showing the current version and the latest release notes in a scrollable read-only box. Tab into the box and arrow up/down to read it under NVDA. Close (or Esc) dismisses. |
This is where peers and logging live. Tab order on this tab:
| Control | Shortcut | What it does |
|---|---|---|
| Connected peers | Alt+C | Peers you currently have audio flowing with. Unticking a row disconnects that peer. |
| Discovered peers | Alt+D | Peers RemSound has heard from in the last few seconds — either via LAN broadcast or via direct unicast announcement (which works over Tailscale and any other VPN). Tick to connect. |
| Remembered peers | Alt+R | Peers you’ve previously connected to or manually added. Persists across sessions. Tick to reconnect. |
| Add peer by IP | Alt+A | Opens a small prompt for an IP address or hostname. Adds it to remembered and connects. |
| Connection status | Alt+S | A read-only multi-line text box that summarises everything currently happening — connect uptime, peer count, send/receive packet rates, heartbeat health for each peer. Tab into it and arrow up/down to read it line by line under NVDA. |
This tab controls everything to do with which audio devices are involved. The ASIO driver picker at the top decides whether ASIO is in the pipeline at all; the Receive and Send sides each have their own master checkbox and device lists.
| Control | Shortcut | What it does |
|---|---|---|
| ASIO driver | Alt+D | Listbox starting with (none). Pick (none) and the app runs in WASAPI-only mode; pick a real driver and the ASIO device lists below appear and the Audio profile tab gains a second ASIO-latency row. Arrowing between drivers swaps which interface RemSound talks to. On a machine with no ASIO drivers installed this control is hidden entirely. |
| Receive audio | Alt+R | Master toggle for receiving. When off, no audio plays out regardless of which output devices are ticked. |
| WASAPI outputs for received sound | Alt+3 | Tick which Windows audio outputs (speakers, headsets) should play received audio. Multiple ticks means received audio plays out of all of them simultaneously. |
| ASIO outputs for received sound | Alt+1 | (Visible when an ASIO driver is selected.) Tick ASIO channel pairs to play received audio out of. |
| Set volume for all received audio | Alt+V | Slider: master volume for everything coming in. There is no per-device or per-source volume. |
| Send my audio | Alt+S | Master toggle for sending. |
| WASAPI outputs to send | Alt+4 | Tick which Windows output devices to capture from (system audio loopback — what’s currently playing on those speakers gets sent). |
| WASAPI inputs to send | Alt+5 | Tick which Windows input devices to capture (microphones, line-ins). |
| ASIO inputs to send | Alt+2 | (Visible when an ASIO driver is selected.) Tick ASIO channel pairs to capture and send. |
All device lists are checkable list boxes — arrow up and down to browse, spacebar to toggle a tick. Profiles save device ticks; Blank template starts with everything unticked.
Receiving has two requirements: Receive audio ticked, and at least one output device ticked. Without an output device, even if packets arrive there’s nowhere for them to go.
Tick as many outputs as you like across both the WASAPI and ASIO output lists — the same received audio plays out of all of them. Common combinations:
Sending requires Send my audio ticked, plus at least one capture source ticked across the three send lists.
| List | What it captures | Typical use |
|---|---|---|
| WASAPI outputs to send | System audio loopback — whatever Windows is currently sending out through that output. So picking your “Speakers” device captures whatever you’re hearing. | Sharing music playback, sharing a video call’s audio, anything coming out of your own speakers. |
| WASAPI inputs to send | Direct capture from a microphone or line input. | Your USB microphone, a headset mic, a line-in. |
| ASIO inputs to send | An ASIO channel pair — typically a hardware input on a pro audio interface. | Instrument input on an Audient EVO, microphone preamp on a Focusrite, etc. |
Tick any combination across the three lists. RemSound mixes them into a single stream and sends that to all selected peers. So you can send a mic plus a guitar plus your system audio at once, mixed together, and your friends hear all three.
Everything that shapes the audio quality / latency trade-off lives here. The tab is split into two NVDA-announced groups: Audio send parameters at the top, Audio receive parameters below. As you tab through, NVDA announces which group you’ve entered.
| Control | Shortcut | What it does |
|---|---|---|
| Audio codec | Alt+C | PCM 48k 24-bit, Opus high quality (20 ms), or Opus lower quality (10 ms). See codec choice. |
| Packet size | Alt+P | Standard (default) or Small (LAN only). Smaller packets save a couple of milliseconds of send-side accumulator latency at the cost of doubling the packet rate. |
| Lock to audio clock | Alt+K | Sender-side timing tightener. Locks packet emission to the audio device’s hardware clock instead of a Stopwatch loop. Saves a few milliseconds of jitter; brief clicks possible if the link can’t keep up. The label changes depending on whether ASIO is in the pipeline so it tells you what it actually does in your current setup. |
The shape of this section depends on whether an ASIO driver is selected on the Audio inputs and outputs tab. With no ASIO driver, you see one latency row (the WASAPI one, labelled simply “Audio latency”). With an ASIO driver selected, you see two latency rows — one per lane — each with its own auto-tune toggle. The two lanes are independent: a WASAPI underrun doesn’t pull the ASIO target up, and vice versa.
| Control | Shortcut | What it does |
|---|---|---|
| ASIO latency in milliseconds | Alt+L | (Only when an ASIO driver is selected.) Spinner. Target receive buffer for the ASIO lane. Default 10 ms. ASIO’s native pipeline can sustain very low targets, but values below the platform’s real-world jitter floor (typically 15–25 ms) cause constant micro-corrections that you can hear — pick 25 ms as a safe floor unless you’re on localhost or wired LAN. |
| Continuous auto-tune ASIO latency | Alt+T | (Only when an ASIO driver is selected.) Checkbox. Nudges the ASIO latency target as ASIO-lane jitter changes. Independent of the WASAPI toggle. |
| WASAPI latency in milliseconds (called just “Audio latency” with no ASIO driver) | Alt+W (Alt+L when no ASIO driver) | Spinner. Target receive buffer for the WASAPI lane (or the only lane in WASAPI-only setups). Smaller = less delay, more clicks. Most people want 20–80 ms. |
| Continuous auto-tune WASAPI latency (called “Continuous auto-tune latency” with no ASIO driver) | Alt+Y (Alt+T when no ASIO driver) | Checkbox. When on, RemSound nudges the WASAPI lane latency value automatically as the network changes. The accompanying Auto-tune latency interval (Alt+I) combo sets how often it re-evaluates: 3, 5, 10, 15, or 30 seconds. The interval is shared between the WASAPI and ASIO lanes — one tick rate, one combo. |
| Buffer smoothness | Alt+B | Listbox, 1 to 10. Controls how patient the receiver is with late-arriving audio on either lane. Higher = more click protection, longer steady-state delay. Default 3. |
| Artefact sound type | Alt+A | Listbox. Noise burst (default) replaces an empty-buffer moment with a brief broadband shhh, which blends into music. Click uses raw zero-fill (no concealment) for diagnostic purposes — you hear an obvious click on every buffer underrun. |
Most people only need to pick a codec and a smoothness level and let the rest sit on defaults.
RemSound speaks two audio backends. Which one is in play depends on the ASIO driver (Alt+D) listbox at the top of the Audio inputs and outputs tab.
Windows’ standard audio engine. Every device in your Windows Sound control panel is reachable via WASAPI. Latency from a WASAPI capture or playback is typically 10–30 milliseconds. Anyone running RemSound has WASAPI; no special hardware needed.
A separate audio path used by professional audio interfaces. ASIO drivers bypass the Windows audio engine and talk directly to the hardware, giving sub-5-millisecond hardware latency.
The ASIO driver picker is omitted entirely on a machine with no ASIO drivers installed. Common drivers that do appear:
One control, two outcomes:
| ASIO driver selection | Pipeline | Latency |
|---|---|---|
| (none) | WASAPI captures and plays out directly. No ASIO code in the pipeline at all. | ~10–30 ms WASAPI buffer + WasapiOut. Lowest possible for users without an ASIO driver. |
| Any real driver name | WASAPI and ASIO run as two independent UDP streams alongside each other. Each lane keeps its own native latency — ASIO stays sub-5 ms even when WASAPI is also active. | WASAPI at its WASAPI rate, ASIO at its ASIO rate. No cross-lane tee, no intermediate buffer; each lane has its own latency knob on the Audio profile tab (see Latency). |
Default on a fresh install is (none). If you have an ASIO driver and want to use it, arrow down to it in the picker. To go back to WASAPI-only, arrow back up to (none).
ASIO doesn’t expose “devices” the way Windows does. Instead it gives you a list of channels (typically 2, 4, 6, 8, or more depending on the interface), grouped into stereo pairs. RemSound labels each pair with the driver name, the pair number, and the channel names the driver itself reports. For an Audient EVO 8 you’d see entries like:
Audient USB Audio ASIO Driver — Pair 1 (channels 1/2): Mic | Line | Instrument 1 / Mic | Line 2 Audient USB Audio ASIO Driver — Pair 2 (channels 3/4): Mic | Line 3 / Mic | Line 4 Audient USB Audio ASIO Driver — Pair 3 (channels 5/6): Loop-back 1 (L) / Loop-back 2 (R)
RemSound doesn’t expose a buffer-size control of its own. To change ASIO buffer size, open the audio interface’s own control panel application (NI’s Komplete Audio Control Panel, Audient EVO Control software, etc.) and set it there. The driver remembers its buffer size between sessions; RemSound just uses whatever the driver is configured to do.
RemSound supports this — you can capture from your audio interface and play received audio out of the same interface simultaneously, on the same machine. Most modern pro audio drivers handle this fine.
“Peer” means another machine running RemSound that you want to talk to. Peers are managed on the Connectivity tab. The tab has three lists, all of them checkable:
| List | Contents | What ticking does |
|---|---|---|
| Connected peers | Peers you currently have audio flowing with. | Unticking disconnects. |
| Discovered peers | Peers RemSound has heard from in the last few seconds — either via LAN broadcast, or via direct unicast announcement (which works over Tailscale and any other VPN). | Connects you to that peer. Audio starts flowing both ways. |
| Remembered peers | Peers you’ve connected to before, plus any IPs you’ve manually typed in. Persists across sessions. | Connects to that remembered peer if they’re online (and adds them as a manual connection if discovery hasn’t found them yet). |
Plus the Add peer by IP (Alt+A) button which opens a small prompt for a hostname or IP. Useful for first-time connection over a VPN where discovery hasn’t reached them yet.
Even if a peer is sending audio in your direction, you won’t hear it until you’ve ticked their checkbox. This is deliberate — connecting is a consent step. A peer’s name shows up in Discovered the moment they come online, but they can’t make sound on your speakers until you say yes.
For each connected peer, the status read-out at the bottom of the window shows a small status: their latest round-trip time in milliseconds, or pending, stale, or unreachable if heartbeat replies have stopped. RemSound plays a connect cue (a short sound) when a peer transitions to healthy and a disconnect cue when one becomes unreachable. Both cues can be silenced via Mute connect/disconnect sounds in the Preferences dialog (File → Preferences, or Ctrl+P).
RemSound uses two UDP ports:
| Port | Purpose | Default |
|---|---|---|
| Audio | The actual sound, sent peer-to-peer. Heartbeat packets share this port too — one socket, one firewall rule, one router pinhole. | 47830 |
| Discovery | “I’m here” announcements every 1.5 seconds, so peers can find each other. | 47831 |
One canonical audio port number is used for everything — Tailscale, LAN peer-to-peer, and any relay server. You never need to type a port after a hostname or IP; the default is implied. Both sides of a connection need to use the same audio port number.
Heartbeat packets ride on the same UDP port as audio, so if your audio reaches the peer, your heartbeat does too — one firewall rule covers both.
On a normal home network, discovery and heartbeat both work without configuration. Launch RemSound on two machines and they’ll see each other within a second or two via the discovery broadcast. No firewall changes are usually needed because UDP broadcast is allowed by default.
Direct internet peer-to-peer connections require either:
100.x.y.z range) and they can reach each other directly.UDP broadcast doesn’t traverse a VPN — Tailscale’s virtual interface ignores broadcast packets entirely. RemSound works around this by also sending discovery announcements directly (unicast) to every IP in your Remembered peers list. So:
So the rule is: only one side has to type the other’s IP once. After that, discovery is bidirectional automatically.
| RTT | What you’ll experience |
|---|---|
| 0–2 ms | Localhost (same machine talking to itself). |
| 2–10 ms | Same LAN. Effectively instant. |
| 15–40 ms | Typical Tailscale or modern broadband-to-broadband. Comfortable for conversation. |
| 50–100 ms | Tailscale via a relay, or one end on Wi-Fi from a long way off. Still usable but you start to feel it for music. |
| 100 ms+ | Something is wrong, or you’re across the world. Music collaboration is challenging. |
Five controls together shape the latency / audio-quality trade-off, all on the Audio profile tab:
Plus the codec choice (PCM / Opus 20 ms / Opus 10 ms), also on the Audio profile tab. Most people only need to pick a codec and a smoothness level and let the rest sit on defaults.
The Audio latency spinner tells the receiver how much audio to keep buffered as a cushion against network jitter. Bigger buffer = more delay, fewer clicks. Smaller buffer = less delay, more clicks when the network wobbles.
| Setting | Best for | Trade-off |
|---|---|---|
| 5–10 ms | LAN, localhost. | Crackles on any WAN with even modest jitter. |
| 20–40 ms | Stable Tailscale or wired internet. | Good balance — usually inaudible delay added. |
| 50–80 ms | WAN with some Wi-Fi or jitter. | Noticeable delay; very robust to drops. |
| 100 ms+ | Bad networks; voice-only. | Definitely feels delayed. |
Smaller is better when the network can handle it. If you don’t want to think about this number, switch on continuous auto-tune (below) and leave it.
The Buffer smoothness listbox sets a 1-to-10 scale that controls how patient the receiver is when network jitter spikes. The default is 3.
| Smoothness | Behaviour | Pick when |
|---|---|---|
| 10 — smoothest | Receiver tolerates the largest jitter spikes without dropping audio. Longest steady-state delay. | Bad Wi-Fi, busy ISP, music collaboration where every click is unacceptable. |
| 4–7 | Middle ground. Smooths most everyday internet jitter without much added delay. | Most WAN sessions over Tailscale or direct internet. |
| 3 — default | Moderate protection; brief clicks possible on jitter spikes. | Stable internet or quiet LAN. |
| 1 — tightest delay | Receiver gives up immediately when audio is late. Frequent clicks; lowest delay. | LAN testing, latency-critical experiments. |
Smoothness and the Audio latency spinner work together — smoothness controls how the receiver responds when audio runs late; the latency value controls how big a head-start it builds. Real-world tip: if you can hear clicks, try raising smoothness by one or two before reaching for a bigger latency target.
Two options: Standard (default) and Small. Controls the frame size each network packet carries:
| Packet size | What changes | Pick when |
|---|---|---|
| Standard (5 ms PCM, 10/20 ms Opus) | One audio packet every 5 ms (PCM) or 10/20 ms (Opus, depending on codec choice). | WAN, Tailscale, internet — any time you don’t have a guaranteed-clean LAN. |
| Small (2.5 ms PCM, 5/10 ms Opus, LAN only) | Halves the effective frame size. Saves up to 2.5 ms of accumulator latency at the sender. | Same-house LAN over wired Ethernet, where the network simply isn’t going to drop or jitter. |
The latency win is small — at most a few milliseconds end-to-end. Small packets are useful when you and your collaborator are on the same LAN and want to chase every last millisecond; for any internet path it’s a false economy because doubling the packet rate also doubles your odds of running into jitter at exactly the wrong moment, which translates into clicks.
The Lock to audio clock checkbox locks RemSound’s send timing path to the audio device’s own hardware clock instead of letting Windows’ general thread scheduler set the pace. Off by default. The label tells you what it does in your current setup:
| Current setup | What “Lock to audio clock” does |
|---|---|
| No ASIO driver selected (WASAPI only) | Sender uses the WASAPI capture event for timing instead of a Stopwatch tick. Tightens send-side delay. |
| ASIO driver selected (WASAPI + ASIO running as independent lanes) | Both lanes tighten independently. WASAPI lane uses push-mode (when there is exactly one WASAPI capture source); ASIO lane emits one packet per ASIO callback with no accumulation. Brief clicks possible on either lane if the link can’t keep up. |
The Continuous auto-tune latency checkbox hands the latency value over to RemSound itself. When on, RemSound observes incoming-packet jitter every few seconds and nudges the latency target up if it’s seeing late packets, or down if the network has been calm. The companion Auto-tune latency interval (Alt+I) combo sets how often it re-evaluates — 3, 5, 10, 15, or 30 seconds. Faster values respond quickly to a network change but can also feel “twitchy”. Treat continuous auto-tune as a hands-off way to keep the cushion right-sized as your network mood changes.
If you turn auto-tune off, the latency value stays wherever it last was.
When the playback buffer comes up empty for a moment (an underrun), RemSound has to fill the gap. The Artefact sound type listbox decides what that gap sounds like:
Both Opus modes ship with built-in forward error correction: each packet carries a small redundant copy of the previous packet’s audio, and the receiver uses it to reconstruct any single packet that goes missing in transit. The result is that single-packet losses become inaudible — no click, no glitch — instead of the small pop you’d otherwise hear. Two-packet-in-a-row losses still produce one click; that’s a fundamental Opus limitation, not something configurable.
This is automatic — there’s no switch. PCM mode does not have it.
| Codec | Quality | Bandwidth | Use when |
|---|---|---|---|
| PCM 48k 24-bit | Best | ~2.3 Mbps | LAN, fast WAN connections. |
| Opus high quality (20 ms) | Very good | ~96 kbps | Most WAN connections — the right default. |
| Opus lower quality (10 ms) | Good | ~64 kbps | Slower or less reliable connections; tighter latency. |
PCM gives the absolute best audio with no encoding artefacts but uses about 30× the bandwidth of Opus. Over the open internet, Opus is almost always the right call.
Each tab has its own Alt+letter shortcuts. The same letter can mean different things on different tabs without conflict — mnemonics fire only on the active tab. Move between tabs with Ctrl+Tab and Ctrl+Shift+Tab.
| Key | Action |
|---|---|
| Alt+C | Focus Connected peers list |
| Alt+D | Focus Discovered peers list |
| Alt+R | Focus Remembered peers list |
| Alt+A | Add peer by IP |
| Alt+S | Focus Connection status read-out |
(Logging controls — Enable logs and Write logs now — live in the Preferences dialog; reach them via File → Preferences or Ctrl+P, then Alt+L / Alt+W within the dialog.)
| Key | Action |
|---|---|
| Alt+D | Focus ASIO driver listbox (hidden if no ASIO drivers are installed) |
| Alt+R | Toggle Receive audio |
| Alt+1 | Focus ASIO outputs for received sound |
| Alt+2 | Focus ASIO inputs to send |
| Alt+3 | Focus WASAPI outputs for received sound |
| Alt+4 | Focus WASAPI outputs to send |
| Alt+5 | Focus WASAPI inputs to send |
| Alt+V | Focus volume slider |
| Alt+S | Toggle Send my audio |
Some of these shortcuts shift depending on whether an ASIO driver is selected. When one is selected the ASIO-lane controls take the simpler Alt+L / Alt+T mnemonics; the WASAPI-lane controls move to Alt+W / Alt+Y so they don’t collide.
| Key | Action |
|---|---|
| Alt+C | Focus Audio codec |
| Alt+P | Focus Packet size |
| Alt+K | Toggle Lock to audio clock |
| Alt+L | Focus latency spinner — ASIO lane when an ASIO driver is selected, otherwise the single Audio latency spinner |
| Alt+T | Toggle continuous auto-tune — ASIO lane when an ASIO driver is selected, otherwise the single Continuous auto-tune toggle |
| Alt+W | (Only when an ASIO driver is selected.) Focus the WASAPI-lane latency spinner |
| Alt+Y | (Only when an ASIO driver is selected.) Toggle the WASAPI-lane continuous auto-tune |
| Alt+I | Focus Auto-tune latency interval |
| Alt+B | Focus Buffer smoothness |
| Alt+A | Focus Artefact sound type |
| Key | Action |
|---|---|
| Ctrl+S | Save active profile (or Save as if on Blank template) |
| Ctrl+K | Open Keyboard shortcuts dialog |
| Ctrl+P | Open Preferences dialog |
| Alt+F, O | Open profile |
| Alt+F, A | Save profile as |
| Alt+F, R | Rename current profile |
| Alt+F, M | Minimise to tray |
| Alt+F, X | Exit |
| Key | Action |
|---|---|
| F1 | Open this manual in your default browser. Works anywhere in RemSound — main window, every dialog, the profile picker on first launch. |
| Ctrl+Tab / Ctrl+Shift+Tab | Move to next / previous tab |
| Tab / Shift+Tab | Move between controls within the active tab |
| Spacebar | Toggle a tick in any device list, or toggle the focused checkbox |
| Up / Down | Move between items in any list |
| Alt+F4 | Close (standard Windows) |
Configurable in the Keyboard shortcuts dialog (Ctrl+K, or File → Keyboard shortcuts). The dialog is a single list of every bindable shortcut: arrow up and down to move between rows, press Enter to rebind the highlighted row, press Del to clear it (back to not set), press Escape (or Tab to the Close button) to close. Defaults:
| Hotkey | Action | Default |
|---|---|---|
| Receive mute | Mute / unmute incoming audio (this machine) | Ctrl+Shift+Alt+R |
| Send mute | Mute / unmute outgoing audio (this machine) | Ctrl+Shift+Alt+S |
| Tray toggle | Show / hide the main window | Ctrl+Shift+F10 |
| Volume up / down | Adjust this machine's received-audio volume | Unset |
| Send remote volume up to peers | Tell every connected peer to raise their RemSound app volume slider by 5 points (only honoured by peers that have ticked “Accept remote volume commands”). Doesn't change your own volume. See Remote control. | Unset |
| Send remote volume down to peers | Mirror, lower direction. | Unset |
| Send remote receive mute toggle to peers | Tell every connected peer to toggle their RemSound receive mute. | Unset |
| Send Windows global volume up to peers | Tell every connected peer to nudge their Windows default-output-device volume up by one OS native step (~2%, same as their keyboard volume key). Affects every app on the receiving machine, not just RemSound. Hold the hotkey for bigger jumps. See Remote control. | Unset |
| Send Windows global volume down to peers | Mirror, lower direction. | Unset |
| Send Windows global mute toggle to peers | Tell every connected peer to toggle their Windows default-output-device mute. | Unset |
You can change any of these to whatever combination you prefer. Each accepts modifiers (Ctrl, Shift, Alt) plus one regular key.
The use case: you're on your laptop, listening to audio coming from your desktop, and you've got NVDA Remote open so you can drive the desktop with your laptop's keyboard. Every keystroke you make goes to the desktop — including any local volume hotkey on the laptop, which now never reaches the laptop. There's no way from inside that NVDA Remote session to nudge the laptop's listening volume without breaking out of the session.
RemSound's remote control feature gives you a way: configure a hotkey on the desktop (the machine your keyboard is talking to) that sends a command across the audio link telling the laptop's RemSound to raise / lower / mute its own listening volume. You stay in NVDA Remote; the laptop responds.
You get two independent sets of remote-control hotkeys, both controlled by the same opt-in toggle on the receiver. Pick whichever fits the situation, or bind both:
| Set | What the receiver does | Best for |
|---|---|---|
| RemSound app volume | Adjusts the receiving peer's RemSound in-app volume slider by 5 percentage points per press, or toggles the RemSound receive-mute. Only RemSound's audio is affected. | Fine adjustments while RemSound's slider is in its useful range. Doesn't affect screen-reader volume or any other app. |
| Windows global volume | Nudges the receiving peer's Windows default-output-device master volume up or down by one OS-native step (~2%, exactly the same as pressing the keyboard volume key on the receiver), or toggles its master mute. Affects every app on the receiver, including the screen reader. | Real-world “I need this louder” cases, especially with hearing impairment or when RemSound's slider is already at the top. Hold the hotkey to ramp up over a longer range. |
Both sets target the receiver. Neither changes anything on the sending machine.
The feature is symmetric: both machines can both send and accept. If you configure hotkeys on both ends and tick “Accept remote volume commands” on both ends, either side can drive the other's volume. There is no “controller” / “controllee” designation.
IGNORED entries when an incoming command was rejected because the sender wasn't in your allow-list or because “Accept remote volume commands” was off. Useful for debugging “why isn't my hotkey working” without guessing.
Open the Startup behaviour dialog from File → Preferences → Startup behaviour (or Ctrl+P, then Alt+S). It has three independent toggles, plus a profile picker that appears when the third one is on. Tab cycles between the three checkboxes, the profile list (when visible), and the Close button. Esc closes the dialog. Each tick is saved immediately — there's no OK/Apply button.
| Toggle | What it does |
|---|---|
| Start minimised to tray (Alt+M) | RemSound minimises to the system tray immediately after the main window finishes loading. The window stays accessible via the tray icon and the tray hotkey. Useful when paired with the auto-start option below for a fully unattended “boot the machine, start streaming” flow. |
| Start RemSound automatically when this user logs in (Alt+A) | Adds (or removes) a per-user entry in the Windows registry under HKCU\Software\Microsoft\Windows\CurrentVersion\Run pointing at RemSound.exe. After ticking, Windows launches RemSound the next time you log in. The setting also shows up under Task Manager → Startup, where you can also disable it. Per-user only — doesn't need admin and doesn't affect anyone else who uses the same machine. |
| Start with a specific profile (Alt+P) | When ticked, RemSound skips the startup profile picker and loads the profile you choose in the listbox below. When unticked, the profile picker shows as normal. If you have no saved profiles yet, ticking it shows a one-shot warning and stays unticked — save a profile first, then come back. To restore the picker temporarily without losing the choice, untick the box, launch normally, then re-tick after. |
Profile to start with (Alt+L) — the listbox of saved profiles. Visible only when the third toggle is on. Arrow up/down to pick, the choice is saved as you move; double-click to pick and close the dialog at the same time.
<exe>\remsound.config.json (machine-local, profile-independent). The auto-start toggle lives in the Windows registry only — deleting remsound.config.json will not turn off the auto-start; you toggle it from this dialog or from Task Manager → Startup.
RemSound can check its own GitHub Releases page for a newer build on a schedule you choose, prompt you to install, and either ask first or do it silently. There’s also a one-press “check now” button so you don’t have to wait for the timer.
Open File → Preferences (or Ctrl+P). The update settings sit above the logging row:
| Setting | Shortcut | What it does |
|---|---|---|
| Check for updates (drop-down) | Alt+U | How often RemSound polls GitHub in the background. Options: Never, Every hour, Every 6 hours, Every 24 hours. Default is Every 24 hours. The choice is remembered across launches; if you set it to Never, the only way an update arrives is via the manual button below. |
| Check for updates now (button) | Alt+N | Runs the GitHub check immediately. If you’re already on the latest version you get a small “you are running the latest version” popup. If there’s a newer release, you get a confirmation dialog with the release notes and a Yes / No to install. The same button is in the Help menu (Alt+H, C). |
| Silently install updates when available (checkbox) | Alt+I | When ticked, the background timer’s tick installs any available update without prompting — RemSound downloads, exits briefly, swaps the files, and relaunches itself. Off by default. The manual “Check for updates now” path always prompts regardless of this checkbox. |
RemSound can’t overwrite its own .exe while it’s running, so an install spawns a small one-shot helper that finishes the job after RemSound exits:
RemSound-vX.Y.zip from GitHub into a staging folder next to the running .exe._apply-update.cmd alongside it that watches the RemSound process.RemSound.exe.You’ll see the window close, then reopen on the new version within a second or two. Anything that was unsaved on the old session (a profile in mid-edit, for instance) is lost — RemSound will not auto-save before installing. Save first if you’ve been editing.
The downloader is best-effort: a flaky network, a locked install folder, or a temporarily-unavailable release will pop a MessageBox saying it couldn’t complete and leave the running version untouched. The release page URL is in the popup so you can grab the zip in a browser and install by hand if needed. If you installed RemSound into Program Files without granting your user write permission to the install folder, the install helper’s file-copy step will fail too — either fix the permission or move RemSound to a writable folder (e.g. somewhere under your user profile).
To see what version you’re currently on without checking for updates, open Help → About RemSound (Alt+H, A). The dialog shows the version number and the release notes for the build you’re running, in a scrollable read-only text box you can tab into and arrow through under NVDA. Close (or Esc) dismisses.
If logging is enabled (the Enable logs checkbox in the Preferences dialog — File → Preferences, or Ctrl+P — default on), RemSound writes a tab-separated log file per session into publish\logs\ (relative to wherever RemSound.exe lives). One file per launch, named RemSound-<machine>-<PID>-<date>-<time>.log.
The file contains two kinds of rows:
| Kind | Contents |
|---|---|
| EVT | Event lines — startup, peer selected, capture started, errors, etc. |
| SNAP | One-second snapshots of running stats: codec, latency target, buffered audio milliseconds, packets sent, packets received, underruns, drops, peer heartbeat RTTs. |
The Write logs now button in the Preferences dialog (Alt+W within that dialog) writes a "user requested write logs now" marker into the log so you can find the moment in the file later.
Logs are plain UTF-8 text and openable in any spreadsheet (paste-as-tab-separated) or text editor. Most useful columns when something feels wrong:
pending / unreachable / stale indicate problems.Most likely your ASIO latency target is below the platform’s real-world jitter floor. The receiver fights to hold the buffer at the target by drift-dropping frames and click-trimming — both are audible. Raise ASIO latency in milliseconds (Alt+L) on the Audio profile tab to 25 ms or more and the grain should vanish. Even pure-ASIO setups don’t safely sustain sub-15-ms receive buffers over real networks; aim higher on Wi-Fi.
Heartbeat shares the audio port, so if audio gets through, heartbeat should too. If one side is showing “unreachable” while audio plays, make sure both machines are running the same RemSound build — an older version on either end can speak a different heartbeat dialect.
You probably picked Realtek ASIO. It’s a generic wrapper, not bound to Realtek hardware, and tends to grab whatever Windows’ default audio device is — which is usually the same one NVDA is using. Arrow back to (none) in the ASIO driver picker (or pick a different ASIO driver).
RemSound refreshes its lists every second. If a device has truly been unplugged it should disappear within a few seconds. If it’s lingering, restart RemSound — Windows’ device cache occasionally needs poking.
| Term | Meaning |
|---|---|
| WASAPI | Windows Audio Session API. The standard Windows audio path. Every audio device in your Windows Sound control panel is reachable via WASAPI. Latency around 10–30 ms. |
| ASIO | Audio Stream Input/Output. A different audio path, written by hardware vendors, that bypasses the Windows audio engine. Used by music production software for sub-5 ms latency. Requires a vendor-supplied driver. |
| Loopback capture | Capturing what’s currently being played out of an output device (rather than what’s coming in from a microphone). The “WASAPI outputs to send” list is loopback capture. |
| Channel pair | A stereo pair of channels on an ASIO driver. Pair 1 = channels 1+2, Pair 2 = channels 3+4, etc. |
| UDP | The network protocol RemSound uses for audio. Unlike TCP it doesn’t retransmit lost packets — at audio rates a retransmitted packet is too late to be useful, so we just skip it and keep going. |
| Heartbeat | A small UDP packet exchanged between peers every second to verify they’re still reachable and measure round-trip time. Travels on the audio port (47830 by default). |
| Discovery | The mechanism by which RemSound peers find each other on the network without needing to know each other’s IP addresses up front. |
| Tailscale | A user-friendly VPN that puts your machines on a private virtual network. The easiest way to connect RemSound across the internet without router configuration. |
| Jitter | Variation in the arrival time of network packets. The reason a receive-side buffer is needed. |
| Auto-tune | The receiver’s automatic adjustment of the latency target based on observed network jitter. Off by default; turn on via the Continuous auto-tune checkbox on the Audio profile tab. |
| Profile | A saved snapshot of every RemSound setting and selection — device ticks, send / receive states, codec, latency, peers, hotkeys, ASIO driver choice, the lot. Stored as one JSON file per profile. Picked at startup; switchable mid-session via File → Open profile. |
| Blank template | A startup option in the profile picker that begins a session with all defaults — nothing ticked, no peers, no save name. The starting point for creating a new profile, or for one-off sessions you don’t intend to save. |
| Lock to audio clock | Sender-side timing mode that drives packet emission directly from the audio device’s hardware-clock interrupts instead of from a Windows scheduler tick. Eliminates a few milliseconds of jitter on tight latency targets. Off by default. Toggled via the checkbox of the same name on the Audio profile tab. |
| Concealment | Receiver-side feature that fills brief audio-buffer underruns with a small noise burst (the default) or raw zero-fill / click. Choice lives on the Audio profile tab as the Artefact sound type. Opus has its own packet-loss recovery built into the codec on top of this. |
| AppConfig | A small machine-local JSON file at <exe>\remsound.config.json that stores preferences which should be sticky regardless of which profile is active — today: the profiles folder location, the Startup behaviour choices, and the “do not show me this again” tick on the Save-profile confirmation popup. |
| Remote control | A small RemSound feature that lets one connected peer nudge another peer's listening volume (or toggle their receive mute) via configurable global hotkeys. Two sets of commands: one adjusts the receiver's RemSound app slider, the other adjusts the receiver's Windows default-output-device master volume. Off by default on both ends; the receiver opts in via “Accept remote volume commands from peers” in the Preferences dialog (Ctrl+P), the sender configures hotkeys in the Keyboard shortcuts dialog (Ctrl+K). Designed for the “I'm NVDA-Remote'd into my desktop and want to nudge the laptop's volume” case. See section 15. |
| Control packet | The wire-level message used by the remote-control feature. A 14-byte UDP packet (12-byte header + 2-byte payload) carrying a kind enum (RemSound volume up / down / mute toggle, or Windows system volume up / down / mute toggle) and a signed delta. Travels on the same UDP audio port as everything else. |