87 lines
1.8 KiB
Go
87 lines
1.8 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
)
|
|
|
|
type Controller struct {
|
|
Model *Model
|
|
View *View
|
|
}
|
|
|
|
func (c *Controller) LogAndShowError(err error) {
|
|
log.Printf("[ERR ] app: %s", err.Error())
|
|
c.View.PopupError(err)
|
|
}
|
|
|
|
func (c *Controller) DiscoverDevices() {
|
|
go func() {
|
|
devices, err := c.Model.DiscoverDevices()
|
|
if err != nil {
|
|
c.LogAndShowError(fmt.Errorf("error discovering devices %v", err))
|
|
return
|
|
}
|
|
if len(devices) == 0 {
|
|
c.LogAndShowError(errors.New("no devices found"))
|
|
return
|
|
}
|
|
c.View.MainScreen(devices)
|
|
}()
|
|
c.View.LoadingScreen()
|
|
}
|
|
|
|
func (c *Controller) StartCasting(selected string, mediaURL string) {
|
|
|
|
if selected == "" {
|
|
c.LogAndShowError(errors.New("no device selected"))
|
|
return
|
|
}
|
|
|
|
err := c.Model.ConnectToDevice(selected)
|
|
if err != nil {
|
|
c.LogAndShowError(fmt.Errorf("error connecting to device %v", err))
|
|
return
|
|
}
|
|
go func() {
|
|
err = c.Model.StartCast(mediaURL)
|
|
if err != nil {
|
|
c.LogAndShowError(fmt.Errorf("error starting cast %v", err))
|
|
c.DiscoverDevices()
|
|
return
|
|
}
|
|
}()
|
|
c.View.CastingScreen(selected)
|
|
|
|
}
|
|
|
|
// Note: these are app codes, they are NOT related to fcast opcodes!
|
|
const (
|
|
ActionPlay = 0
|
|
ActionPause = 1
|
|
ActionSkipBack = 2
|
|
ActionSkipForward = 3
|
|
ActionStop = 4
|
|
ActionVolumeUp = 5
|
|
ActionVolumeDown = 6
|
|
ArgsActionSeek = 7 // seekTime
|
|
|
|
RespPlaybackUpdate = 0 // videoRuntime, currentTime
|
|
)
|
|
|
|
func (c *Controller) PlayerAction(action int, args ...float32) {
|
|
err := c.Model.PlayerAction(action, args...)
|
|
if err != nil {
|
|
c.LogAndShowError(fmt.Errorf("error performing action %v", err))
|
|
}
|
|
}
|
|
|
|
func (c *Controller) ExitCasting() {
|
|
c.PlayerAction(ActionStop)
|
|
c.DiscoverDevices()
|
|
}
|
|
|
|
func (c *Controller) ReceiverResponse(action int, args ...float32) {
|
|
c.View.UpdateCastingScreen(action, args...)
|
|
}
|