153a5a1b3Sopenharmony_ci#!/usr/bin/env python
253a5a1b3Sopenharmony_ci
353a5a1b3Sopenharmony_ciUSAGE = """
453a5a1b3Sopenharmony_ciUsage:
553a5a1b3Sopenharmony_ci    python ladspa-dbus.py <sinkname> [values]
653a5a1b3Sopenharmony_ci
753a5a1b3Sopenharmony_ciThe "sinkname" parameter is the name of the ladspa sink. The "values"
853a5a1b3Sopenharmony_ciparameter is a comma-separated list of ladspa sink parameter values. A
953a5a1b3Sopenharmony_civalue in the list can be either string "default" or a float.
1053a5a1b3Sopenharmony_ci
1153a5a1b3Sopenharmony_ciExample usage:
1253a5a1b3Sopenharmony_ci
1353a5a1b3Sopenharmony_ci    python ladspa-dbus.py ladspa_1 10.0,default,4.0,0.6,default
1453a5a1b3Sopenharmony_ci
1553a5a1b3Sopenharmony_ciThis command will configure sink "ladspa_1" by setting the first value
1653a5a1b3Sopenharmony_cito 10.0, the second to the default value (specified in the ladspa
1753a5a1b3Sopenharmony_cifilter), the third to 4.0 and so on.
1853a5a1b3Sopenharmony_ci"""
1953a5a1b3Sopenharmony_ci
2053a5a1b3Sopenharmony_ciimport dbus
2153a5a1b3Sopenharmony_ciimport os
2253a5a1b3Sopenharmony_ciimport sys
2353a5a1b3Sopenharmony_ci
2453a5a1b3Sopenharmony_cidef get_ladspa_property_interface(sinkname):
2553a5a1b3Sopenharmony_ci
2653a5a1b3Sopenharmony_ci    # do some D-Bus stuff to get to the real ladspa property object
2753a5a1b3Sopenharmony_ci    session = dbus.SessionBus()
2853a5a1b3Sopenharmony_ci
2953a5a1b3Sopenharmony_ci    # get the private D-Bus socket address from PulseAudio properties
3053a5a1b3Sopenharmony_ci    session_property_iface = dbus.Interface(session.get_object("org.PulseAudio1", "/org/pulseaudio/server_lookup1"), dbus.PROPERTIES_IFACE)
3153a5a1b3Sopenharmony_ci    socket = session_property_iface.Get("org.PulseAudio.ServerLookup1", "Address")
3253a5a1b3Sopenharmony_ci
3353a5a1b3Sopenharmony_ci    # connect to the private PulseAudio D-Bus socket
3453a5a1b3Sopenharmony_ci    connection = dbus.connection.Connection(socket)
3553a5a1b3Sopenharmony_ci
3653a5a1b3Sopenharmony_ci    # core object for listing the sinks
3753a5a1b3Sopenharmony_ci    core = connection.get_object(object_path="/org/pulseaudio/core1")
3853a5a1b3Sopenharmony_ci
3953a5a1b3Sopenharmony_ci    # object path to the ladspa sink
4053a5a1b3Sopenharmony_ci    ladspa_sink_path = core.GetSinkByName(sinkname)
4153a5a1b3Sopenharmony_ci
4253a5a1b3Sopenharmony_ci    # property interface proxy for the sink
4353a5a1b3Sopenharmony_ci    ladspa_sink_property_iface = dbus.Interface(connection.get_object(object_path=ladspa_sink_path), dbus.PROPERTIES_IFACE)
4453a5a1b3Sopenharmony_ci
4553a5a1b3Sopenharmony_ci    return ladspa_sink_property_iface
4653a5a1b3Sopenharmony_ci
4753a5a1b3Sopenharmony_cidef parse_arguments(args):
4853a5a1b3Sopenharmony_ci
4953a5a1b3Sopenharmony_ci    sinkname = None
5053a5a1b3Sopenharmony_ci    arguments = []
5153a5a1b3Sopenharmony_ci    defaults = []
5253a5a1b3Sopenharmony_ci
5353a5a1b3Sopenharmony_ci    if len(args) >= 2:
5453a5a1b3Sopenharmony_ci        sinkname = args[1]
5553a5a1b3Sopenharmony_ci
5653a5a1b3Sopenharmony_ci        if len(args) == 3:
5753a5a1b3Sopenharmony_ci            tokens = args[2].split(",")
5853a5a1b3Sopenharmony_ci
5953a5a1b3Sopenharmony_ci            for token in tokens:
6053a5a1b3Sopenharmony_ci                if token == "default":
6153a5a1b3Sopenharmony_ci                    arguments.append(0.0)
6253a5a1b3Sopenharmony_ci                    defaults.append(True)
6353a5a1b3Sopenharmony_ci                else:
6453a5a1b3Sopenharmony_ci                    arguments.append(float(token))
6553a5a1b3Sopenharmony_ci                    defaults.append(False)
6653a5a1b3Sopenharmony_ci
6753a5a1b3Sopenharmony_ci    """
6853a5a1b3Sopenharmony_ci    print("Input arguments:")
6953a5a1b3Sopenharmony_ci    print("         sink: " + sink)
7053a5a1b3Sopenharmony_ci    print("    arguments: " + str(arguments))
7153a5a1b3Sopenharmony_ci    print("     defaults: " + str(defaults))
7253a5a1b3Sopenharmony_ci    """
7353a5a1b3Sopenharmony_ci
7453a5a1b3Sopenharmony_ci    return sinkname, arguments, defaults
7553a5a1b3Sopenharmony_ci
7653a5a1b3Sopenharmony_cidef print_arguments(arguments, defaults):
7753a5a1b3Sopenharmony_ci    for i in range(len(arguments)):
7853a5a1b3Sopenharmony_ci        default = ""
7953a5a1b3Sopenharmony_ci        if defaults[i]:
8053a5a1b3Sopenharmony_ci            default = "default"
8153a5a1b3Sopenharmony_ci        print(str(i) + " : " + str(arguments[i]) + " \t"  + default)
8253a5a1b3Sopenharmony_ci
8353a5a1b3Sopenharmony_ci
8453a5a1b3Sopenharmony_cisinkname, arguments, defaults = parse_arguments(sys.argv)
8553a5a1b3Sopenharmony_ci
8653a5a1b3Sopenharmony_ciif sinkname == None:
8753a5a1b3Sopenharmony_ci    print(USAGE)
8853a5a1b3Sopenharmony_ci    sys.exit(1)
8953a5a1b3Sopenharmony_ci
9053a5a1b3Sopenharmony_ci# get the D-Bus property interface of the sink
9153a5a1b3Sopenharmony_ciladspa = get_ladspa_property_interface(sinkname)
9253a5a1b3Sopenharmony_ci
9353a5a1b3Sopenharmony_ci# read the current sink arguments from PulseAudio
9453a5a1b3Sopenharmony_cioldarguments, olddefaults = ladspa.Get("org.PulseAudio.Ext.Ladspa1", "AlgorithmParameters")
9553a5a1b3Sopenharmony_ci
9653a5a1b3Sopenharmony_ciprint("Current LADSPA parameters for sink " + sinkname + ":")
9753a5a1b3Sopenharmony_ciprint_arguments(oldarguments, olddefaults)
9853a5a1b3Sopenharmony_ci
9953a5a1b3Sopenharmony_ciif len(arguments) != 0:
10053a5a1b3Sopenharmony_ci    # set new arguments if they were provided on the command line
10153a5a1b3Sopenharmony_ci
10253a5a1b3Sopenharmony_ci    # Set the arguments ...
10353a5a1b3Sopenharmony_ci    ladspa.Set("org.PulseAudio.Ext.Ladspa1", "AlgorithmParameters", (dbus.Array(arguments), dbus.Array(defaults)))
10453a5a1b3Sopenharmony_ci
10553a5a1b3Sopenharmony_ci    # ... and read them back.
10653a5a1b3Sopenharmony_ci    newarguments, newdefaults = ladspa.Get("org.PulseAudio.Ext.Ladspa1", "AlgorithmParameters")
10753a5a1b3Sopenharmony_ci
10853a5a1b3Sopenharmony_ci    print("New LADSPA parameters for sink " + sinkname + ":")
10953a5a1b3Sopenharmony_ci    print_arguments(newarguments, newdefaults)
11053a5a1b3Sopenharmony_ci
11153a5a1b3Sopenharmony_ci# test the GetAll functionality
11253a5a1b3Sopenharmony_ci# print(str(ladspa.GetAll("org.PulseAudio.Ext.Ladspa1")))
113