0

PulseAudio DBUS API 页面说 LoadModule 的参数是

参数:名称:字符串,参数:{String -> 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 类型键。D-Bus 的 GNU 使用页面上,以防万一。我会尝试并发布结果。

4

1 回答 1

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 条目,每个条目都包含一个字符串键(“源”或“接收器”)和一个字符串值(“设备名称”)。请注意,字符串值不是我最初怀疑的设备的 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);
于 2014-04-29T13:16:43.557 回答