You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
110 lines
2.4 KiB
Go
110 lines
2.4 KiB
Go
package pulseaudio
|
|
|
|
import "io"
|
|
|
|
//Source contains information about a source in pulseaudio, e.g. a microphone
|
|
type Source 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 deserialized a PA source packet
|
|
func (s *Source) 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
|
|
}
|
|
|
|
// Sources queries pulseaudio for a list of all it's sources and returns an array of them
|
|
func (c *Client) Sources() ([]Source, error) {
|
|
b, err := c.request(commandGetSourceInfoList)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
var sources []Source
|
|
for b.Len() > 0 {
|
|
var source Source
|
|
err = bread(b, &source)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
sources = append(sources, source)
|
|
}
|
|
return sources, nil
|
|
}
|