fix(audio): NullSink-Verwurf-Zeile im CLI-Pfad sichtbar machen

NewSink bekommt einen optionalen Log-Writer (die CLI übergibt stderr);
zuvor verwarf der null-Sink bei erfolgreicher Synthese stumm — die
sichtbare Zeile kam nur aus dem ErrNoByteOutput-Zweig. Sink-Interface
unverändert; Aufrufstellen ab Task 03 müssen den Writer übergeben.
TestSayArgumentMitNullSink beweist die Zeile jetzt extern auf dem
CLI-Pfad, TestNewSink deckt das Factory-Wiring ab; Live-Beweis mit
espeak-ng dokumentiert ("audio: N Bytes verworfen (null sink)", Exit 0).

Dazu (Minor): "was" aus englishWords entfernt — widersprach dem
Mehrdeutigkeits-Kommentar und dem Report; neuer TestFall
"Was macht er?" → de.
This commit is contained in:
m3ta-chiron committed 2026-10-18 15:46:20 +02:00
1 parent 8306c6b384
commit ae9f3b680e
6 files changed
+31 -10

No files matched your search

+1 -1
View File
@@ -106,7 +106,7 @@ func runSay(args []string, opts *sayOptions, stdin io.Reader, stderr io.Writer)
return exitFailure
}
sink, err := audio.NewSink(cfg.Audio.Sink)
sink, err := audio.NewSink(cfg.Audio.Sink, stderr)
if err != nil {
fmt.Fprintf(stderr, "talk: %v\n", err)
return exitFailure
+6 -1
View File
@@ -52,7 +52,9 @@ cat "`+wav+`"`)
// TestSayArgumentMitNullSink: `talk "Hallo Welt"` läuft mit
// TALK_AUDIO_SINK=null tonlos durch (Abnahmekriterium) — Synthese läuft
// (fake espeak wurde gerufen), die Wiedergabe wird verworfen.
// (fake espeak wurde gerufen), und die Wiedergabe wird mit sichtbarer
// Verwurf-Zeile auf stderr verworfen (extern beobachtbares Verhalten des
// null-Sinks auf dem CLI-Pfad).
func TestSayArgumentMitNullSink(t *testing.T) {
seen := withFakeEspeak(t)
setGetenv(t, map[string]string{"TALK_AUDIO_SINK": "null"})
@@ -65,6 +67,9 @@ func TestSayArgumentMitNullSink(t *testing.T) {
if _, err := os.Stat(seen); err != nil {
t.Errorf("Synthese lief nicht (fake espeak nicht gerufen): %v", err)
}
if !strings.Contains(errBuf.String(), "verworfen (null sink)") {
t.Errorf("stderr = %q, will Verwurf-Zeile des null-Sinks (Synthese war erfolgreich)", errBuf.String())
}
}
// TestSaySubcommandWieDefault: `talk say "Text"` verhält sich wie der