// Fenrir console screen reader. // Copyright (c) 2026 Storm Dragon // SPDX-License-Identifier: GPL-3.0-or-later // // This program is free software: you can redistribute it and/or modify it // under the terms of the GNU General Public License as published by the Free // Software Foundation, either version 3 of the License, or (at your option) // any later version. // // This program is distributed in the hope that it will be useful, but WITHOUT // ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for // more details. // // You should have received a copy of the GNU General Public License along with // this program. If not, see . package sound import ( "fmt" "strings" ) type Options struct { Driver string Device string Volume float64 } type Driver struct { ID, Label string open func(*Service, string) error } // Drivers is the shared startup, validation and form registry. PipeWire uses // its PulseAudio service; explicit selections never switch drivers on failure. func Drivers() []Driver { return []Driver{{ID: "pulse", Label: "PulseAudio", open: open_pulse}, {ID: "alsa", Label: "ALSA", open: open_alsa}} } func Find_driver(id string) (Driver, error) { for _, driver := range Drivers() { if driver.ID == id { return driver, nil } } return Driver{}, fmt.Errorf("unknown sound driver %q", id) } func Validate_selection(driver, device string) error { if _, err := Find_driver(driver); err != nil { return err } if strings.TrimSpace(device) == "" || strings.ContainsAny(device, "\x00\r\n") { return fmt.Errorf("sound device must be a nonempty ALSA PCM name") } return nil }