fix: audio silence (idempotent sync-delay configure), webcam gray block, truncated videos
- AudioSyncDelay.Configure reallocated/zeroed its buffer every ~10ms tick
(AudioMixer re-reads the UI setting each mix), so any non-zero sync offset
erased the just-written audio -> total silence. Now early-returns when the
delay samples are unchanged. Regression test proven both ways.
- SceneCompositor.BlitContentRaw defaulted cbW/cbH=0 when CropBounds is null
(regression from ed9d7c1) -> webcam blit to an empty rect = gray block.
Default to src.Width/Height. Regression test proven both ways.
- Truncated recordings: rawvideo mux stamps frames at declared 60fps by
arrival; a scene whose first layer is dynamic (hidden elements still count)
kills the bake cache -> full render ~35ms -> ~27fps submitted -> halved
file length. Static scenes bake once (246ms cold, then <1ms) -> 60fps,
full-length (probe + 13:53 take, 301/300 per 5s, 12.46s file from 12.3s
wall). FramePump.ProbeRender names the hot render path on slow frames.
This commit is contained in:
@@ -29,11 +29,20 @@ public sealed class AudioSyncDelay
|
||||
Configure(0);
|
||||
}
|
||||
|
||||
/// <summary>Sets the delay in whole milliseconds (clamped to 0..500 and
|
||||
/// flushed).</summary>
|
||||
/// <summary>Sets the delay in whole milliseconds (clamped to 0..500). A no-op
|
||||
/// when the delay hasn't actually changed — <see cref="AudioMixer.FillAndMix"/>
|
||||
/// calls this every ~10ms tick (it re-reads the live UI setting each mix), and
|
||||
/// unconditionally reallocating+zeroing the line every tick (the 2026-09-12
|
||||
/// total-silence bug: any non-zero saved offset wiped the ring before its own
|
||||
/// delayed samples could ever be read back — mic/loop meters, sampled BEFORE
|
||||
/// this stage, kept showing real levels while the pipe stayed pure silence)
|
||||
/// discarded the entire buffered history every 10ms. Changing the delay still
|
||||
/// flushes the line (a live slider change clicks rather than smearing).</summary>
|
||||
public void Configure(int delayMs)
|
||||
{
|
||||
_delaySamples = Frames(delayMs);
|
||||
var delaySamples = Frames(delayMs);
|
||||
if (delaySamples == _delaySamples && _buffer.Length > 0) return;
|
||||
_delaySamples = delaySamples;
|
||||
_buffer = new float[(_delaySamples + _sampleRate) * 2 + 1024];
|
||||
_writePos = 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user