fix(18): stop ends everything — pills clear, pump/prep failures roll the session back
Creator ruling 2026-09-01 (stuck REC pill after the failed first recording): - StopStream clears RecordPillOn + OnAirPillOn — intent resets with reality. - OnFramePumpFailed: dispatcher-marshalled FULL rollback via StopStream (was: toast + Error-status only when live — record-only sessions zombied with IsRecording=true over a dead encoder; the 20:34 attempt proved it). Toast copy says 'Recording stopped' vs 'stream pipeline stopped'. - Same zombie class in the three go-live prep failure branches: StreamStatus.Error limbo replaced by StopStream() (audio loop + recording + pills unwind; a created broadcast still gets the close-out). - AudioMixer.StopLive made explicitly idempotent (Stop() twice, rollback paths that never reached StartLive). - Seams: OnFramePumpFailed + IsRecording setter internal (InternalsVisibleTo; test pattern mirrors LayoutPathOverride). ONE integration test: SessionTeardownTests (real window + temp DB: pump death with lit pill -> no zombie, no End button, Offline). AudioPipelineTests confirmed to hang STANDALONE (pre-existing, the declared-known audio class) — ai.md test-count paragraph corrected to stop claiming a suite total that cannot currently be measured.
This commit is contained in:
@@ -107,11 +107,13 @@ public partial class MainViewModel : ViewModelBase
|
||||
public bool CanToggleOnAir => IsConnected;
|
||||
|
||||
/// <summary>Whether the session is actively recording — the REC status light
|
||||
/// turns green only when this is true (the pill is intent, this is reality).</summary>
|
||||
/// turns green only when this is true (the pill is intent, this is reality).
|
||||
/// Internal setter is a test seam (same pattern as LayoutPathOverride) so the
|
||||
/// failure-rollback path can be exercised without running the real pipeline.</summary>
|
||||
public bool IsRecording
|
||||
{
|
||||
get => _isRecording;
|
||||
private set
|
||||
internal set
|
||||
{
|
||||
if (!SetProperty(ref _isRecording, value)) return;
|
||||
OnPropertyChanged(nameof(RecDotBrush));
|
||||
|
||||
Reference in New Issue
Block a user