Attempt to make audio and speech discovery more robust.

This commit is contained in:
Storm Dragon committed 2026-11-03 13:21:50 -05:00
1 parent a27f274099
commit dc945ff392
21 files changed
+1314 -60

No files matched your search

+20 -6
View File
@@ -26,6 +26,7 @@ import (
"path/filepath"
"time"
"git.stormux.org/storm/fenrir/internal/audio"
"git.stormux.org/storm/fenrir/internal/clipboard"
"git.stormux.org/storm/fenrir/internal/command"
"git.stormux.org/storm/fenrir/internal/config"
@@ -126,26 +127,39 @@ func start(ctx context.Context, settings config.Settings, terminalMode bool, con
var voices Speaker = disabledVoice{}
var effectiveSpeech *config.Speech
if settings.Presentation.Speech.Enabled {
client, selected, err := open_speech(settings.Presentation.Speech)
var client speech.Transport
var selected config.Speech
waitingForSpeech := false
retryContext, cancel := context.WithTimeout(ctx, audio.RecoveryTimeout)
err := audio.Retry(retryContext, func(ctx context.Context) error {
var err error
client, selected, err = open_speech(ctx, settings.Presentation.Speech)
if err != nil && !waitingForSpeech && audio.Temporary(err) {
waitingForSpeech = true
slog.Warn("speech unavailable; waiting before acquiring keyboards", "error", err, "at", time.Now())
}
return err
}, audio.Temporary)
cancel()
effectiveSpeech = &selected
if err != nil {
return err
}
if waitingForSpeech {
slog.Info("speech connection ready", "at", time.Now())
}
voices = speech.New(client)
voices.Configure(speech_parameters(settings))
}
defer voices.Close()
var cues SoundPlayer
var player *sound.Service
var player *sound.Player
if settings.Presentation.Sound.Enabled {
home, err := os.UserHomeDir()
if err != nil {
return err
}
player, err = sound.Open(sound.Theme_paths(home, settings.Presentation.Sound.Theme), sound.Options{Driver: settings.Presentation.Sound.Driver, Device: settings.Presentation.Sound.Device, Volume: settings.Presentation.Sound.Volume})
if err != nil {
slog.Warn("sound unavailable or incomplete", "error", err, "at", time.Now())
}
player = sound.Open_recovering(ctx, sound.Theme_paths(home, settings.Presentation.Sound.Theme), sound.Options{Driver: settings.Presentation.Sound.Driver, Device: settings.Presentation.Sound.Device, Volume: settings.Presentation.Sound.Volume})
if player != nil {
defer player.Close()
cues = player