C ++:如何通过DBUS API加载PulseAudio模块?

先生用户

PulseAudio DBUS API页面说到LoadModule的参数是

参数:name:字符串,参数:{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

然后创建一个味精迭代器:

//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使用D-Bus页面使用我将尝试并发布结果。

先生用户

正如我的更新所说,字典条目必须位于数组中,但不必是数组中的唯一元素。例如,PulseAudio的回送模块采用如下命令行参数:

$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 PATH。与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);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章