// 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 }