Multi-track + shaped/raw recording (per-peer split tracks) — held for next release

Recording Settings gains two per-profile toggles (Ed's request):
 * "Split recording into separate tracks" — each recording becomes a folder with one file per
   connected peer (their received audio only) plus one for your own send.
 * "Bypass pan and EQ when recording" — record the RAW audio (before pan/EQ) instead of the
   shaped audio you hear; applies to single and split.

Engine: a per-peer record tap in SessionPlayout hands each peer's block to the recorder RAW
(before pan/EQ) or SHAPED (after) per the bypass flag; PlayoutEngine propagates the tap to all
sessions (+ inherits on reconnect) and fires OnRecordBlockComplete each render; AudioReceiver
exposes SetPeerRecordTap / OnRecordBlockComplete. AudioRecorder now accepts an explicit path and
exposes ExtensionFor. RecordingController composes one AudioRecorder per track: multi-track =
a recorder per connected peer + a "me" recorder; single-track shaped = the existing mixed tap;
single-track raw (bypass) = sum each peer's raw block per render, flushed on the block boundary.

Naming (Ed's scheme, sortable): <recordings>/<yyyy-MM-dd>/ then, single-track, "<HH-mm-ss>
RemSound recording.<ext>"; multi-track, a folder "<HH-mm-ss> RemSound recording multi track/"
containing "<machine name> <HH-mm-ss>.<ext>" per peer (name or IP) and for your own send.

Known edge (noted): a peer using sender-side BothIndependent (two lanes) records both lanes to
one file in a split recording; single-track bypass sums per render in the Mixed path. Off by
default (both toggles unticked = today's behaviour). Builds clean; pending Ed's hands-on test.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
Ednunp
2026-07-06 10:05:00 +01:00
co-authored by Claude Opus 4.8
parent 703e6a022d
commit de55230048
8 changed files with 294 additions and 29 deletions
+12
View File
@@ -100,6 +100,16 @@ public sealed class RecordingSettings
/// machine, the recorder falls back to the default and notes it in the diagnostics.</summary>
public string? Folder { get; set; }
/// <summary>When true, a recording is written as a FOLDER of separate tracks instead of one mixed
/// file: one file per connected peer (only that peer's received audio) plus one file for your own
/// sent audio. Off by default. (Ed's multi-track request.)</summary>
public bool SplitTracks { get; set; }
/// <summary>When true, per-peer pan and EQ are BYPASSED for the recording — it captures the raw,
/// unshaped audio even though you still hear the shaped version live. When false (default), your
/// pan/EQ are baked into the recording (and on a split recording, into each peer's own track).</summary>
public bool BypassShaping { get; set; }
public RecordingSettings Clone() => new()
{
Source = Source,
@@ -111,6 +121,8 @@ public sealed class RecordingSettings
FlacBitsPerSample = FlacBitsPerSample,
FlacCompressionLevel = FlacCompressionLevel,
Folder = Folder,
SplitTracks = SplitTracks,
BypassShaping = BypassShaping,
};
/// <summary>Default folder path used when <see cref="Folder"/> is blank. Computed at