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 }