From e86df221fa8f9d6796fb7fe59020767d7c806fac Mon Sep 17 00:00:00 2001
From: Ariver <shanghai3168@gmail.com>
Date: Sun, 14 Jun 2026 20:57:40 +0800
Subject: [PATCH] Fix X-ASR hold pre-capture

---
 privatevoice.src/internal/engine/engine_darwin_test.go |   34 ++++++++++++++++++++++++++++++++++
 1 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/privatevoice.src/internal/engine/engine_darwin_test.go b/privatevoice.src/internal/engine/engine_darwin_test.go
index a46bcea..f2db4e4 100644
--- a/privatevoice.src/internal/engine/engine_darwin_test.go
+++ b/privatevoice.src/internal/engine/engine_darwin_test.go
@@ -164,6 +164,28 @@
 	}
 }
 
+func TestXASRHeadPaddingPreparesInitialContext(t *testing.T) {
+	if xasrHeadPaddingSamples != 4000 {
+		t.Fatalf("head padding samples = %d, want 4000", xasrHeadPaddingSamples)
+	}
+	input := []float32{0.1, -0.2, 0.3}
+	got := xasrSamplesWithHeadPadding(input)
+
+	if len(got) != xasrHeadPaddingSamples+len(input) {
+		t.Fatalf("padded len = %d, want %d", len(got), xasrHeadPaddingSamples+len(input))
+	}
+	for i := 0; i < xasrHeadPaddingSamples; i++ {
+		if got[i] != 0 {
+			t.Fatalf("head padding sample %d = %v, want 0", i, got[i])
+		}
+	}
+	for i, want := range input {
+		if got[xasrHeadPaddingSamples+i] != want {
+			t.Fatalf("payload sample %d = %v, want %v", i, got[xasrHeadPaddingSamples+i], want)
+		}
+	}
+}
+
 func TestXASRRequestsReleaseTailCaptureDelay(t *testing.T) {
 	got := (&xasrStreamingEngine{}).ReleaseTailCaptureDelay()
 	if got != 300*time.Millisecond {
@@ -171,12 +193,24 @@
 	}
 }
 
+func TestXASREnablesHoldPreCapture(t *testing.T) {
+	if !(&xasrStreamingEngine{}).HoldPreCaptureEnabled() {
+		t.Fatal("X-ASR should enable hold pre-capture")
+	}
+}
+
 func TestOfflineSherpaDoesNotRequestReleaseTailCapture(t *testing.T) {
 	if _, ok := any(&sherpaEngine{}).(ReleaseTailCaptureEngine); ok {
 		t.Fatal("offline sherpa engine should not request release tail capture")
 	}
 }
 
+func TestOfflineSherpaDoesNotEnableHoldPreCapture(t *testing.T) {
+	if _, ok := any(&sherpaEngine{}).(HoldPreCaptureEngine); ok {
+		t.Fatal("offline sherpa engine should not enable hold pre-capture")
+	}
+}
+
 func TestXASRRealModelSmoke(t *testing.T) {
 	if os.Getenv("PRIVATEVOICE_XASR_SMOKE") != "1" {
 		t.Skip("set PRIVATEVOICE_XASR_SMOKE=1 to run the real X-ASR model smoke test")

--
Gitblit v1.9.3