package main import ( "context" "fmt" "io" "gitea.neitzel.de/konrad/funknetz/audio" "gitea.neitzel.de/konrad/funknetz/station" ) // App is the window's view of the station. type App struct { cancel context.CancelFunc station *station.Station } func (a *App) startup(ctx context.Context) { runCtx, cancel := context.WithCancel(ctx) a.cancel = cancel if err := audio.Start(runCtx, a.station.WriteMicrophone, a.station.TakePlayback); err != nil { a.station.Fail("could not open the audio device") return } go func() { _ = a.station.Run(runCtx) }() // Run returns when the window closes. } func (a *App) shutdown(context.Context) { if a.cancel != nil { a.cancel() } } // State returns the station state the page renders. func (a *App) State() station.State { return a.station.State() } // HoldButton reports that the on-screen button is held. func (a *App) HoldButton() { a.station.HoldButton() } // ReleaseButton reports that the on-screen button was released. func (a *App) ReleaseButton() { a.station.ReleaseButton() } // HoldSpace reports that Space is held. func (a *App) HoldSpace() { a.station.HoldSpace() } // ReleaseSpace reports that Space was released. func (a *App) ReleaseSpace() { a.station.ReleaseSpace() } func openStation(args []string) (*station.Station, error) { path, err := resolveConfigPath(args) if err != nil { return nil, err } return station.New(station.Options{ConfigPath: path}) } // openStationReported opens the station from args. A flag or config failure is // one line on stderr and the returned error. The window is not opened. func openStationReported(args []string, stderr io.Writer) (*station.Station, error) { st, err := openStation(args) if err != nil { // The returned error is the failure. A write error does not replace it. _, _ = fmt.Fprintln(stderr, err.Error()) return nil, err } return st, nil }