On Tue, Jun 08, 2021 at 08:17:00PM -0700, Peter Meilstrup wrote:
> Hello pulseaudio list,
> 
> I am wondering if it is possible to have a command be executed when a
> sink is suspended or resumed (via module-suspend-on-idle).
> Specifically I want to switch my amplifier on and off automatically
> via home automation. Is this supported in pulseaudio?

I realize this is a reply to a pretty old message, but in case you or
others are still wondering about this:

It's pretty straightforward to do this with a custom pulseaudio client
application. I took a quick stab at it with the "pulsectl" python
library. Example script attached, just modify the sink.name line to
match your target device.

--Sean

#!/usr/bin/python3

import pulsectl

with pulsectl.Pulse('event-printer') as pulse:
        sink_idx = None
        sink_was_suspended = False

        # Get the desired sink.
        for sink in pulse.sink_list():
                if sink.name == 
"alsa_output.usb-Focusrite_Scarlett_Solo_USB-00.analog-stereo":
                        sink_idx = sink.index
                        sink_old_state = (sink.state == 'suspended')

        def print_events(ev):
                #print('Pulse event:', ev)
                if sink_idx == ev.index:
                        raise pulsectl.PulseLoopStop # Break out of the 
event_listen to process the event in the main app.

        pulse.event_mask_set('sink')
        pulse.event_callback_set(print_events)

        while True:
                pulse.event_listen()

                sink = pulse.sink_list()[sink_idx]
                sink_new_state = (sink.state == 'suspended')
                #print(sink_new_state, sink.state)

                if sink_new_state != sink_old_state:
                        print("Sink has changed state")
                        if sink.state == 'suspended':
                                print("Now suspended.")
                                # <<< TAKE ACTION HERE >>>
                        elif sink.state == 'idle' or sink.state == 'running':
                                print("Now active.")
                                # <<< TAKE ACTION HERE >>>
                        sink_old_state = sink_new_state

Reply via email to