Files

58 lines
1.5 KiB
Go

// Copyright (c) 2026 Storm Dragon
// Authors: Storm Dragon, Angus Kola
// SPDX-License-Identifier: GPL-3.0-or-later
package speech
import (
"bufio"
"context"
"fmt"
"net"
"strconv"
)
// ReadDefaults queries a fresh client, leaving the speaking client's settings
// alone. Unsupported or invalid fields stay nil so preferences can use sensible
// display values. The caller bounds the entire optional query with a deadline.
func ReadDefaults(ctx context.Context, socket string) (Settings, error) {
var defaults Settings
endpoint, err := resolveServerAddress(socket)
if err != nil {
return defaults, err
}
conn, err := (&net.Dialer{Timeout: connectTimeout}).DialContext(ctx, endpoint.network, endpoint.address)
if err != nil {
return defaults, err
}
defer conn.Close()
finish, err := prepareIO(ctx, conn, ioTimeout)
if err != nil {
return defaults, err
}
defer finish()
client := &Client{conn: conn, reader: bufio.NewReader(conn)}
for _, field := range []struct {
name string
target **int
}{
{"RATE", &defaults.Rate}, {"PITCH", &defaults.Pitch}, {"VOLUME", &defaults.Volume},
} {
if _, err := fmt.Fprintf(conn, "GET %s\r\n", field.name); err != nil {
return defaults, err
}
response, err := client.readReply()
if err != nil {
return defaults, err
}
if response.code < 200 || response.code >= 300 || len(response.data) != 1 {
continue
}
value, err := strconv.Atoi(response.data[0])
if err == nil && value >= -100 && value <= 100 {
*field.target = &value
}
}
return defaults, nil
}