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