Attempt to make audio and speech discovery more robust.
This commit is contained in:
1 parent
a27f274099
commit
dc945ff392
21 files changed
+1314
-60
No files matched your search
+20
-6
@@ -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
|
||||
|
||||
Reference in new issue
Block a user