首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++:如何通过DBUS加载PulseAudio模块?

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

Stack Overflow用户
提问于 2014-04-25 13:54:56
回答 1查看 1.1K关注 0票数 0

PulseAudio DBUS页面说LoadModule的参数是

参数:名称:字符串,参数:{ String -> String}

它还声明{String -> String}是一个具有字符串键和字符串值的字典。

如何通过c++ API发送?通常我会做这样的事情:

代码语言:javascript
运行
复制
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迭代器:

代码语言:javascript
运行
复制
//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})

但是,该函数没有给出答复。我认为我没有正确地创建参数。事实上,我很确定我不是。我见过其他人为不同的方法使用数组,但在这里没有具体说明。是否有办法具体说明某物是一个关键/价值?

更新:

我找到了这一行:字典条目必须是数组的元素,它必须只包含两个元素的键值对,并带有一个基本的D总线类型键。在GNU使用D总线页面,上,以防有帮助。我会试着把结果贴出来。

EN

Stack Overflow用户

回答已采纳

发布于 2014-04-29 13:16:43

正如我的更新所述,dict条目必须位于数组中,但它不一定是数组中的唯一元素。例如,PulseAudio的回环模块接受命令行参数,如下所示:

代码语言:javascript
运行
复制
$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()函数需要一个字符串和两个数据条目,每个条目包含一个字符串键(“源”或“接收器”)和一个字符串值(“设备名称”)。注意,字符串值不是设备的PULSEAUDIO路径,正如我第一次猜测的那样。它与pactl使用的字符串相同。为了创建s{ss}{ss}参数,首先必须将dict条目封装在数组: s{ss}{ss}中。迭代器命令如下:

代码语言:javascript
运行
复制
//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);
票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23295185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档