forked from pion/mediadevices
/
manager.go
107 lines (89 loc) · 2.51 KB
/
manager.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
102
103
104
105
106
107
package driver
import "fmt"
// FilterFn is being used to decide if a driver should be included in the
// query result.
type FilterFn func(Driver) bool
// FilterVideoRecorder return a filter function to get a list of registered VideoRecorders
func FilterVideoRecorder() FilterFn {
return func(d Driver) bool {
_, ok := d.(VideoRecorder)
return ok
}
}
// FilterAudioRecorder return a filter function to get a list of registered AudioRecorders
func FilterAudioRecorder() FilterFn {
return func(d Driver) bool {
_, ok := d.(AudioRecorder)
return ok
}
}
// FilterID return a filter function to get registered drivers which have given ID
func FilterID(id string) FilterFn {
return func(d Driver) bool {
return d.ID() == id
}
}
// FilterDeviceType returns a filter function to get registered drivers which matches t type
func FilterDeviceType(t DeviceType) FilterFn {
return func(d Driver) bool {
return d.Info().DeviceType == t
}
}
// FilterAnd returns a filter function to take logical conjunction of given filters.
func FilterAnd(filters ...FilterFn) FilterFn {
return func(d Driver) bool {
for _, f := range filters {
if !f(d) {
return false
}
}
return true
}
}
// FilterNot returns a filter function to take logical inverse of the given filter.
func FilterNot(filter FilterFn) FilterFn {
return func(d Driver) bool {
return !filter(d)
}
}
// Manager is a singleton to manage multiple drivers and their states
type Manager struct {
drivers map[string]Driver
}
var manager = &Manager{
drivers: make(map[string]Driver),
}
// GetManager gets manager singleton instance
func GetManager() *Manager {
return manager
}
// Register registers adapter to be discoverable by Query
func (m *Manager) Register(a Adapter, info Info) error {
d := wrapAdapter(a, info)
m.drivers[d.ID()] = d
return nil
}
// Query queries by using f to filter drivers, and simply return the filtered results.
func (m *Manager) Query(f FilterFn) []Driver {
results := make([]Driver, 0)
for _, d := range m.drivers {
if ok := f(d); ok {
results = append(results, d)
}
}
return results
}
func Pause(m *Manager, trackId string) {
fmt.Println("PAUSING ______________________________________")
fmt.Println(m.drivers[trackId])
driver := m.drivers[trackId]
fmt.Println(driver.Pause())
// m.drivers[0].Screen
}
func Resume(m *Manager, trackId string) {
fmt.Println("RESUMING ______________________________________")
fmt.Println(m.drivers[trackId])
driver := m.drivers[trackId]
fmt.Println(driver.Resume())
// m.drivers[0].Screen
}