Files
funknetz/app.go
T
Konrad NeitzelandCursor 6233292931 Pause playback while transmitting and declare microphone use.
macOS refuses capture without a usage string, and queued remote audio was still handed to the speaker after push-to-talk began.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-03 16:32:01 +02:00

65 lines
1.6 KiB
Go

package main
import (
"context"
"fmt"
"os"
"path/filepath"
"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 configPath() (string, error) {
home, err := os.UserHomeDir()
if err != nil {
return "", err
}
return filepath.Join(home, ".funknetz.json"), nil
}
func openStation() (*station.Station, error) {
path, err := configPath()
if err != nil {
return nil, fmt.Errorf("could not be read")
}
return station.New(station.Options{ConfigPath: path})
}