Bump to v1.2.0: recording, sound cues, drift compensation, diagnostics

New user-facing features:

* Recording. Dedicated Record menu (Alt+O — moved from Alt+R to
  avoid clashing with the Receive audio checkbox), Start/Stop on
  Ctrl+R, settings dialog, per-profile source / format / bit-depth /
  channel-mode / folder. Three source modes (received only, sent
  only, both). Files are crash-resilient — a process crash
  mid-recording leaves a playable file containing everything up to
  the last header refresh (~5 seconds).

* Four output formats, all functional:
    - WAV: 16/24-bit PCM or 32-bit float, custom writer with
      periodic RIFF re-patching.
    - MP3: LAME 128–320 kbps CBR (via NAudio.Lame).
    - OGG-Opus: 96–256 kbps VBR (via Concentus.Oggfile, reusing the
      Concentus encoder from the wire path).
    - FLAC: 16/24-bit lossless (via CUETools.Codecs.FLAKE — pure
      managed, no native DLL).

* Recording start/stop sound cues. record start.wav and
  record stop.wav play around the recording transition. Played via
  System.Media.SoundPlayer to the default Windows output, separate
  from the recording pipeline so a normal recording does not contain
  the cue.

* Per-cue Preferences. The old single "Mute connect/disconnect
  sounds" checkbox is replaced by a CheckedListBox: Connect /
  Disconnect / Recording start / Recording stop. Old profiles with
  the legacy MuteConnectionCues=true are honoured on first load via
  a migration path in the new Load* helpers.

* Receiver-side drift compensation switched from discrete
  single-frame splices to a continuous WdlResampler at a smoothed
  rate ratio. SessionPlayout.cs rewrite.

Diagnostics (only active with Enable logs ticked):

* Per-stage discontinuity probes — sender raw capture (per backend,
  PushModeWasapi + Asio both wired), sender pre-encode (now per
  lane in BothIndependent, fixing a cross-stream artefact), receiver
  post-decode, post-ring, post-resampler.

* Wire-level packet sequence tracking on each PCM stream — in-order
  / missed / reordered / duplicated counts in the diag log.

* Clipped-sample delta in the diag log.

* New AudioStepProbe in RemSound.Core with per-channel scan helper.

UI changes:

* Record menu uses Alt+O (Rec&ord). Inside the menu, item mnemonics
  unchanged (S / T / O / C).

* Auto-tune interval combo label is mode-aware: "Auto-tune latency
  interval" in classic modes, "Auto-tune interval — WASAPI and ASIO"
  in BothIndependent. The combo's Enabled state now follows EITHER
  lane's auto-tune checkbox (was only the WASAPI one — bug).

Wire format and audio pipeline unchanged from v1.1 — v1.1 and v1.2
peers interoperate.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
Ednunp
2026-05-15 12:40:01 +01:00
co-authored by Claude Opus 4.7
parent a0fe8070ed
commit c59e413c1f
27 changed files with 3348 additions and 350 deletions
+68
View File
@@ -20,6 +20,74 @@ internal sealed class AboutDialog : Form
/// updates" path.</summary>
private const string ReleaseNotes =
"""
RemSound v1.2
Recording, sound cues, and receiver-side drift compensation.
This release is mostly about features that sit on top of the
v1.1 transport the wire format and audio pipeline are
unchanged, so v1.1 and v1.2 peers interoperate.
What's new:
* Recording. New Record menu (Alt+O) Start / Stop with
Ctrl+R, dedicated settings dialog, per-profile choice of
source (received only, sent only, or both), file format
(WAV, MP3, OGG-Opus, FLAC), bit depth or bitrate, mono or
stereo, and recordings folder. Files are crash-resilient:
WAV re-patches its RIFF header every 5 seconds, MP3 / FLAC
/ OGG-Opus all produce well-formed truncated files if the
app crashes mid-recording.
* OGG-Opus and FLAC encoders now wired up they were stubs
in earlier builds. OGG-Opus reuses the same Concentus
encoder as the wire path; FLAC uses pure-managed CUETools
FLAKE (no native DLL).
* Recording start / stop sound cues. Plays a short ding
when recording transitions on or off. Played via the
default Windows output device, separate from the
recording pipeline, so a normal recording does not include
the cue.
* Sound-cue Preferences. The old single "Mute connect /
disconnect sounds" checkbox is replaced by a per-cue
CheckedListBox: Connect / Disconnect / Recording start /
Recording stop, each independently toggleable. Old profile
settings that had the legacy mute on are honoured on first
load.
* Receiver-side drift compensation switched from discrete
single-frame splices to a continuous WdlResampler running
at a slowly-updated rate ratio. Smooths out long-session
clock drift between sender and receiver without the
occasional 21 µs splice the v1.1 corrector emitted.
UI changes:
* Record menu moved to Alt+O (Rec&ord). The old Alt+R chord
conflicted with the Receive audio checkbox on the main
form. Inside the menu the item mnemonics are unchanged
(S / T / O / C for Start, settings, Open folder, Change
folder).
* Auto-tune interval combo label and accessible name are now
mode-aware. In BothIndependent mode it reads "Auto-tune
interval WASAPI and ASIO" so it's clear the same combo
drives ticks for both lanes; each lane still independently
tunes to its own target latency. Earlier builds also had
a bug where ticking ASIO auto-tune alone left this combo
greyed out fixed.
Diagnostics (only active with Enable logs ticked):
* Per-stage discontinuity probes sender raw capture,
sender pre-encode (now per lane in BothIndependent),
receiver post-decode, receiver post-ring, receiver
post-resampler. Lets a log inspection localise where a
click was introduced (capture / wire / decode / playout).
* Wire-level sequence tracking on each PCM stream:
in-order / missed / reordered / duplicated packet counts
in the diag log. Healthy LAN should show all-zero except
in-order; non-zero on the others points to transport
issues rather than software.
* Clipped-sample delta in the diag log.
Bug fixes:
* Auto-tune interval combo no longer greys out when only
ASIO auto-tune is ticked in BothIndependent.
RemSound v1.1
Priority and performance hardening, plus always-on network