123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- package main
- import (
- "fmt"
- "log"
- "os/exec"
-
- "github.com/hypebeast/go-osc/osc"
- )
- type Media struct {
- active bool
- cmd *exec.Cmd
- args []string
- }
- type MediaPlayer interface {
- play()
- stop()
- }
- func run(name string, args ...string) *exec.Cmd {
-
-
-
-
-
-
-
-
- cmd := exec.Command(name, args...)
- if err := cmd.Run(); err != nil {
- log.Print(err)
- return nil
- }
- return cmd
- }
- func (player *Media) run(name string, args ...string) {
- player.cmd = exec.Command(name, args...)
- if err := player.cmd.Run(); err != nil {
- log.Print(err)
- }
- }
- func (player *Media) play(msg *osc.Message) {
- if player.active {
- log.Print("please stop current player before playing another")
- log.Print(player.cmd)
- return
- }
- uri := getOSC[string](msg)
- osc.PrintMessage(msg)
- if uri == "" {
- log.Print("player won't play without uri")
- return
- }
- player.active = true
-
-
- args := append(player.args, uri)
- player.run(args[0], args[1:]...)
- player.active = false
- }
- func (player *Media) stop(msg *osc.Message) {
- player.quit()
- }
- func (player *Media) volume(msg *osc.Message) {
- level := getOSC[float32](msg)
- run("amixer", "-q", "sset", "Master", fmt.Sprintf("%.2f%%", level*100.0))
- }
- func (player *Media) quit() {
- if !player.active {
- log.Print("can't kill player if it ain't running")
- return
- }
- if err := player.cmd.Process.Kill(); err != nil {
- log.Print("failed to kill process: ", err)
- }
- player.active = false
- }
- func NewMPV() *Media {
- media := new(Media)
- media.args = []string{"mpv", "-fs"}
- return media
- }
- func NewXLEmulator() *Media {
- media := new(Media)
- media.args = []string{"atari800", "-stretch", "3"}
- return media
- }
|