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