void PulseAudioControl::openConnection() { //! If the connection already exists, do nothing if ((dbusConnection != NULL) && (dbus_connection_get_is_connected(dbusConnection))) { return; } // Establish a connection to the server char *pa_bus_address = getenv("PULSE_DBUS_SERVER"); QByteArray addressArray; if (pa_bus_address == NULL) { QDBusMessage message = QDBusMessage::createMethodCall("org.pulseaudio.Server", "/org/pulseaudio/server_lookup1", "org.freedesktop.DBus.Properties", "Get"); message.setArguments(QVariantList() << "org.PulseAudio.ServerLookup1" << "Address"); QDBusMessage reply = QDBusConnection::sessionBus().call(message); if (reply.type() == QDBusMessage::ReplyMessage && reply.arguments().count() > 0) { addressArray = reply.arguments().first().value<QDBusVariant>().variant().toString().toAscii(); pa_bus_address = addressArray.data(); } } if (pa_bus_address != NULL) { DBusError dbus_err; dbus_error_init(&dbus_err); dbusConnection = dbus_connection_open(pa_bus_address, &dbus_err); DBUS_ERR_CHECK(dbus_err); } if (dbusConnection != NULL) { dbus_connection_setup_with_g_main(dbusConnection, NULL); dbus_connection_add_filter(dbusConnection, PulseAudioControl::stepsUpdatedSignalHandler, (void *)this, NULL); addSignalMatch(); } }
void VolumeBarLogic::initValues () { DBusMessage *msg; DBusMessage *reply; DBusError error; dbus_error_init (&error); msg = dbus_message_new_method_call (VOLUME_SV, VOLUME_PATH, "org.freedesktop.DBus.Properties", "GetAll"); const char *volume_if = VOLUME_IF; dbus_message_append_args (msg, DBUS_TYPE_STRING, &volume_if, DBUS_TYPE_INVALID); reply = dbus_connection_send_with_reply_and_block ( dbus_conn, msg, -1, &error); DBUS_ERR_CHECK (error); dbus_message_unref (msg); if (reply && (dbus_message_get_type (reply) == DBUS_MESSAGE_TYPE_METHOD_RETURN)) { DBusMessageIter iter; dbus_message_iter_init (reply, &iter); // Recurse into the array [array of dicts] while (dbus_message_iter_get_arg_type (&iter) != DBUS_TYPE_INVALID) { DBusMessageIter dict_entry; dbus_message_iter_recurse (&iter, &dict_entry); // Recurse into the dict [ dict_entry (string, variant(int)) ] while (dbus_message_iter_get_arg_type (&dict_entry) != DBUS_TYPE_INVALID) { DBusMessageIter in_dict; // Recurse into the dict_entry [ string, variant(int) ] dbus_message_iter_recurse (&dict_entry, &in_dict); { char *prop_name = NULL; // Get the string value, "property name" dbus_message_iter_get_basic (&in_dict, &prop_name); dbus_message_iter_next (&in_dict); DBusMessageIter variant; // Recurese into the variant [ variant(int) ] dbus_message_iter_recurse (&in_dict, &variant); quint32 value; // Get the variant value which is uint32 dbus_message_iter_get_basic (&variant, &value); if (prop_name && strcmp (prop_name, "StepCount") == 0) currentmax = value; else if (prop_name && strcmp (prop_name, "CurrentStep") == 0) currentvolume = value; } dbus_message_iter_next (&dict_entry); } dbus_message_iter_next (&iter); } } if (reply) dbus_message_unref (reply); addSignalMatch (); }