словарь — C ++: как загрузить модуль PulseAudio через DBUS API?

PulseAudio Страница API DBUS говорит, что аргументы LoadModule

Аргументы: name: String, аргументы: {String -> String}

В нем также говорится, что {String -> String} является словарем с ключом String и значением String.

Как я могу отправить это через API C ++? Обычно я бы сделал что-то вроде этого:

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 Использование страницы D-Bus, на случай, если это поможет. Я попробую это и опубликую результаты.

0

Решение

Как говорилось в моем обновлении, запись dict должна быть в массиве, но она не должна быть единственным элементом в массиве. Например, петлевой модуль 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);
0

Другие решения


По вопросам рекламы [email protected]