-
Notifications
You must be signed in to change notification settings - Fork 0
/
cgo.go
101 lines (81 loc) · 1.9 KB
/
cgo.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//go:build cgo
// +build cgo
package lib
import (
"log"
wrap "github.com/frizinak/libym/backend/mpv"
"github.com/gen2brain/go-mpv"
)
func New(log *log.Logger) *wrap.MPV {
return wrap.New(log, &LibMPV{})
}
type LibMPV struct {
mpv *mpv.Mpv
closing bool
}
func (m *LibMPV) Init(events chan<- wrap.Event) error {
m.mpv = mpv.Create()
if err := m.mpv.SetOption("vid", mpv.FORMAT_FLAG, false); err != nil {
return err
}
_ = m.mpv.SetOption("really-quiet", mpv.FORMAT_FLAG, true)
if err := m.mpv.Initialize(); err != nil {
return err
}
if err := m.mpv.ObserveProperty(0, "pause", mpv.FORMAT_FLAG); err != nil {
return err
}
ev := map[mpv.EventId]wrap.EventID{
mpv.EVENT_END_FILE: wrap.EventEndFile,
mpv.EVENT_START_FILE: wrap.EventStartFile,
mpv.EVENT_PROPERTY_CHANGE: wrap.EventPropertyChange,
}
go func() {
for {
if m.closing {
break
}
e := m.mpv.WaitEvent(1)
if id, ok := ev[e.Event_Id]; ok {
events <- wrap.Event{id}
}
}
}()
return nil
}
func (m *LibMPV) Close() error {
if m.closing {
return nil
}
m.closing = true
m.mpv.TerminateDestroy()
return nil
}
func (m *LibMPV) GetPropertyDouble(n string) (float64, error) {
v, err := m.mpv.GetProperty(n, mpv.FORMAT_DOUBLE)
if err != nil || v == nil {
return 0, err
}
return v.(float64), err
}
func (m *LibMPV) SetPropertyDouble(n string, v float64) error {
return m.mpv.SetProperty(n, mpv.FORMAT_DOUBLE, v)
}
func (m *LibMPV) SetPropertyString(n, v string) error {
return m.mpv.SetPropertyString(n, v)
}
func (m *LibMPV) GetPropertyBool(n string) (bool, error) {
v, err := m.mpv.GetProperty(n, mpv.FORMAT_FLAG)
if err != nil || v == nil {
return false, err
}
return v.(bool), err
}
func (m *LibMPV) SetPropertyBool(n string, v bool) error {
sv := "no"
if v {
sv = "yes"
}
return m.SetPropertyString(n, sv)
}
func (m *LibMPV) Command(cmd ...string) error { return m.mpv.Command(cmd) }