1 // This file is a part of git.thekondor.net/zvuchno.git (mirror: github.com/thekondor/zvuchno)
6 "github.com/godbus/dbus"
7 "github.com/sqp/pulseaudio"
11 type AppSettings struct {
19 deviceEventCh chan struct{}
20 volumeNotification VolumeNotification
25 func (app *App) DeviceVolumeUpdated(path dbus.ObjectPath, values []uint32) {
26 app.lockPulseAudio(true)
27 defer app.lockPulseAudio(false)
29 if values[0] == values[1] {
30 app.volumeNotification.Show(app.settings.Title, app.bar.Update(int(values[0])), app.settings.Timeout)
34 func (app *App) DeviceMuteUpdated(path dbus.ObjectPath, value bool) {
35 app.lockPulseAudio(true)
36 defer app.lockPulseAudio(false)
40 message = app.settings.OnMuteText
42 message = app.settings.OnUnmuteText
45 app.volumeNotification.Show(app.settings.Title, message, app.settings.Timeout)
48 func (app *App) Loop(pa *pulseaudio.Client) {
49 app.lockPulseAudio(false)
54 func (app *App) lockPulseAudio(state bool) {
58 app.deviceEventCh <- struct{}{}
62 func mustPulseAudio() *pulseaudio.Client {
63 pa, err := pulseaudio.New()
65 log.Panicf("Failed to connect to PulseAudio: %s", err)
71 func mustDbus() *dbus.Conn {
72 sessionBus, err := dbus.SessionBus()
74 log.Panicf("Failed to connect to DBUS session bus: %s", err)
81 pa := mustPulseAudio()
82 dbusConn := mustDbus()
86 deviceEventCh: make(chan struct{}, 1),
87 volumeNotification: NewVolumeNotification(dbusConn),
88 bar: NewVolumeBar(config.Appearance.Width,
89 config.Appearance.Format.Full,
90 config.Appearance.Format.Bar),
91 settings: AppSettings{config.Notification.Timeout,
92 config.Appearance.Text.Title,
93 config.Appearance.Text.OnMute,
94 config.Appearance.Text.OnUnmute}}
96 log.Printf("Serving PA events...")