-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathsink.go
129 lines (121 loc) · 2.78 KB
/
sink.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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
package pulseaudio
import "io"
// Sink contains information about a sink in pulseaudio
type Sink struct {
Index uint32
Name string
Description string
SampleSpec sampleSpec
ChannelMap channelMap
ModuleIndex uint32
Cvolume cvolume
Muted bool
MonitorSourceIndex uint32
MonitorSourceName string
Latency uint64
Driver string
Flags uint32
PropList map[string]string
RequestedLatency uint64
BaseVolume uint32
SinkState uint32
NVolumeSteps uint32
CardIndex uint32
Ports []sinkPort
ActivePortName string
Formats []formatInfo
}
// ReadFrom deserializes a sink packet from pulseaudio
func (s *Sink) ReadFrom(r io.Reader) (int64, error) {
var portCount uint32
err := bread(r,
uint32Tag, &s.Index,
stringTag, &s.Name,
stringTag, &s.Description,
&s.SampleSpec,
&s.ChannelMap,
uint32Tag, &s.ModuleIndex,
&s.Cvolume,
&s.Muted,
uint32Tag, &s.MonitorSourceIndex,
stringTag, &s.MonitorSourceName,
usecTag, &s.Latency,
stringTag, &s.Driver,
uint32Tag, &s.Flags,
&s.PropList,
usecTag, &s.RequestedLatency,
volumeTag, &s.BaseVolume,
uint32Tag, &s.SinkState,
uint32Tag, &s.NVolumeSteps,
uint32Tag, &s.CardIndex,
uint32Tag, &portCount)
if err != nil {
return 0, err
}
s.Ports = make([]sinkPort, portCount)
for i := uint32(0); i < portCount; i++ {
err = bread(r, &s.Ports[i])
if err != nil {
return 0, err
}
}
if portCount == 0 {
err = bread(r, stringNullTag)
if err != nil {
return 0, err
}
} else {
err = bread(r, stringTag, &s.ActivePortName)
if err != nil {
return 0, err
}
}
var formatCount uint8
err = bread(r,
uint8Tag, &formatCount)
if err != nil {
return 0, err
}
s.Formats = make([]formatInfo, formatCount)
for i := uint8(0); i < formatCount; i++ {
err = bread(r, &s.Formats[i])
if err != nil {
return 0, err
}
}
return 0, nil
}
// Sinks queries PulseAudio for a list of sinks and returns an array
func (c *Client) Sinks() ([]Sink, error) {
b, err := c.request(commandGetSinkInfoList)
if err != nil {
return nil, err
}
var sinks []Sink
for b.Len() > 0 {
var sink Sink
err = bread(b, &sink)
if err != nil {
return nil, err
}
sinks = append(sinks, sink)
}
return sinks, nil
}
type sinkPort struct {
Name, Description string
Pririty uint32
Available uint32
}
func (p *sinkPort) ReadFrom(r io.Reader) (int64, error) {
return 0, bread(r,
stringTag, &p.Name,
stringTag, &p.Description,
uint32Tag, &p.Pririty,
uint32Tag, &p.Available)
}
func (c *Client) setDefaultSink(sinkName string) error {
_, err := c.request(commandSetDefaultSink,
stringTag, []byte(sinkName), byte(0))
return err
}