58 lines
1.5 KiB
Go
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
|
|
}
|