Files

97 lines
2.6 KiB
Go

package main
import (
"context"
"fmt"
"io"
"github.com/wailsapp/wails/v2/pkg/runtime"
"gitea.neitzel.de/konrad/funknetz/audio"
"gitea.neitzel.de/konrad/funknetz/station"
)
// App is the window's view of the station.
type App struct {
ctx context.Context
cancel context.CancelFunc
station *station.Station
quit func(context.Context)
}
func (a *App) startup(ctx context.Context) {
a.ctx = ctx
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() }
// Config returns the Config window form.
func (a *App) Config() station.ConfigState { return a.station.Config() }
// OpenConfig opens the Config window, re-reading the file.
func (a *App) OpenConfig() { a.station.OpenConfig() }
// Save validates and writes the config form.
func (a *App) Save(form station.ConfigForm) error { return a.station.Save(form) }
// CancelConfig discards the form. When no config has loaded, it quits.
func (a *App) CancelConfig() {
if !a.station.Cancel() {
return
}
quit := a.quit
if quit == nil {
quit = runtime.Quit
}
if a.ctx != nil {
quit(a.ctx)
}
}
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 path failure is
// one line on stderr and the returned error. A missing or invalid config still
// returns a station so the window can open.
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
}