[pulseaudio-discuss] Receiving signals from server in C

Greg Knoll gregknoll at gmail.com
Tue Jun 17 04:54:17 PDT 2014


On Tue, Jun 17, 2014 at 10:31 AM, Tanu Kaskinen
<tanu.kaskinen at linux.intel.com> wrote:
> On Fri, 2014-06-13 at 17:17 +0200, Greg Knoll wrote:
>> I think first it would be good to know that I'm correctly registering
>> with ListenForSignal.  First I use
>>
>>    conn = dbus_connection_open(serverAddress, &err);
>>
>> to get a connection to PulseAudio.  Then I call the message:
>>
>>     msg = dbus_message_new_method_call(
>>
>>             "org.PulseAudio1",             //Destination
>>
>>             "/org/pulseaudio/core1",     //Object path to call on
>>
>>             "org.PulseAudio.Core1",     //Interface to call on
>>
>>             "ListenForSignal");             //Method
>>
>>
>>
>>     //Add arguments: s, []
>>
>>     dbus_message_iter_init_append(msg, &msgIter);
>>
>>
>>         //string
>>
>>         dbus_message_iter_append_basic(&msgIter, DBUS_TYPE_STRING,&signalName);
>>
>>
>>         //empty array to listen to all
>>
>>         dbus_message_iter_open_container(&msgIter,DBUS_TYPE_ARRAY,"o",&arrayIter);
>>
>>         dbus_message_iter_close_container(&msgIter, &arrayIter);
>>
>>
>>     //call dbus function
>>
>>     debug_print("   >...Listening for signal %s...\n",signalName);
>>
>>     dbus_connection_send_with_reply_and_block (conn, msg, -1, &err);
>>
>> with signalName = "org.PulseAudio.Core1.NewModule"
>>
>> Is this correct if I want to be notified when all new modules are loaded?
>
> Yes, looks correct.
>
>> If so, I then call dbus_connection_pop_message on the private
>> connection in the main loop.
>
> How do you wait for incoming messages?
>
> Typically you shouldn't call dbus_connection_pop_message() (even the
> documentation of that function says that). If you have a main loop, you
> should integrate the DBusConnection with the main loop. If you don't
> have a main loop in your program, you can use
> dbus_connection_read_write_dispatch().
>
>>Do I need to add a match?
>
> As already discussed in this thread: no, you don't need to add a match.
>
> --
> Tanu
>

Thank you for the reply and I apologize for accidentally top posting again.

I do have a main loop, but not a glib main loop.  I am running a
while() loop in a QtThread. I use
dbus_connection_read_write_dispatch() already in this loop for the
system bus, and successfully use dbus_connection_pop_message() for
system bus messages.  I tried the same method (without using
dbus_connection_pop_message() as you suggested) for the PA connection,
and then used dbus_connection_add_filter() to add a
DBusHandleMessageFunction.  I still get nothing.

What exactly do you mean by integrating the DBusConnection with the
main loop?  Do you mean registering watch functions
(dbus_connection_set_watch_functions()) and object paths
(dbus_connection_register_object_path), etc?

I realize your job isn't to teach me DBUS, so thank you for all your help.


More information about the pulseaudio-discuss mailing list