PulseAudio DBUS API page表示LoadModule的参数是
参数:name:String,arguments:{String - >串}
它还声明{String - > String}是一个带有String键和String值的字典。
如何通过c ++ API发送此信息?通常我会做这样的事情:
msg = dbus_message_new_method_call(
"org.PulseAudio1", //Destination
"/org/pulseaudio/core1", //Object path to call on
interfaceStr, //Interface to call on
method); //Method
然后创建一个msg迭代器:
//append arguments to the LoadModule() method. (String, {String->String})
dbus_message_iter_init_append(msg, &msgIter);
dbus_message_iter_append_basic(&msgIter, DBUS_TYPE_STRING,&moduleName);
//dict entries
dbus_message_iter_open_container(&msgIter, DBUS_TYPE_DICT_ENTRY, NULL, &subIter);
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sourceStr);
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sourcePath);
dbus_message_iter_close_container(&msgIter, &subIter);
dbus_message_iter_open_container(&msgIter, DBUS_TYPE_DICT_ENTRY, NULL, &subIter);
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sinkStr);
dbus_message_iter_append_basic(&subIter, DBUS_TYPE_STRING, &sinkPath);
dbus_message_iter_close_container(&msgIter, &subIter);
这会创建一个像这样的参数列表,我认为:LoadModule(String,{String-> String},{String-> String})
但是,该功能没有给出答复。我不认为我正确地创建了参数。事实上,我很确定我不是。我已经看到其他人使用数组用于不同的方法,但它没有在这里指定。有没有办法明确指出某些东西是关键/值?
更新:
我找到了这一行:字典条目必须是数组的元素,并且它必须只包含两个元素的键值对,并带有基本的D-Bus类型键。 GNU Using of D-Bus Page,如果有帮助的话。我会尝试并发布结果。
答案 0 :(得分:0)
正如我的更新所说,dict条目必须在数组中,但它不一定是数组中唯一的元素。例如,PulseAudio的loopback模块采用如下命令行参数:
$pactl load-module module-loopback source="alsa_input.pci-0000_00_1b.0.analog-stereo" sink="bluez_sink.10_B7_F6_02_1B_4A"
为了通过DBUS发送它,loadModule()函数需要一个字符串和两个dict条目,每个条目包含一个字符串键(“source”或“sink”)和一个字符串值(“device of device”)。请注意,正如我首先怀疑的那样,字符串值不是设备的PULSEAUDIO路径。它与pactl使用的字符串相同。为了创建s {ss} {ss}参数,首先必须将dict条目封装在一个数组中:s [{ss} {ss}]。迭代器命令如下:
//append arguments to the Set() method. (string interface, string property, value)
dbus_message_iter_init_append(msg, &msgIter);
//string
dbus_message_iter_append_basic(&msgIter, DBUS_TYPE_STRING,&moduleName);
//array
dbus_message_iter_open_container(&msgIter,DBUS_TYPE_ARRAY,"{ss}{ss}",&arrayIter);
//dict entry
dbus_message_iter_open_container(&arrayIter, DBUS_TYPE_DICT_ENTRY, NULL, &dictIter1);
//strings
dbus_message_iter_append_basic(&dictIter1, DBUS_TYPE_STRING, &sourceStr);
dbus_message_iter_append_basic(&dictIter1, DBUS_TYPE_STRING, &sourceName);
//close dict entry
dbus_message_iter_close_container(&arrayIter, &dictIter1);
//dict entry
dbus_message_iter_open_container(&arrayIter, DBUS_TYPE_DICT_ENTRY, NULL, &dictIter2);
//strings
dbus_message_iter_append_basic(&dictIter2, DBUS_TYPE_STRING, &sinkStr);
dbus_message_iter_append_basic(&dictIter2, DBUS_TYPE_STRING, &sinkName);
//close dict entry
dbus_message_iter_close_container(&arrayIter, &dictIter2);
//close array
dbus_message_iter_close_container(&msgIter, &arrayIter);