I spent yesterday afternoon writing a small PulseAudio client using the asynchronous API and found that it was a few things to setup; the mainloop, the context, the stream, callbacks etc.

Just to recap, there are three strategies for feeding data to PulseAudio:

 * Blocking:

   pa_simple_write(data, length);

   or:

   while (length > 0) {
       while (pa_stream_writable_size() == 0)
          pa_mainloop_wait();
       pa_stream_write(data, pa_stream_writable_size());
       data += pa_stream_writable_size();
       length -= pa_stream_writable_size();
   }

 * Polling:

   every now and then do:
       pa_stream_write(data, pa_stream_writable_size());


 * Callback:

   pa_stream_set_write_callback(my_write_callback);
   pa_mainloop_run();

   my_write_callback(size_t length) {
       pa_stream_write(data, length);
   }


Looking at the client code, it seems very simple to add pa_simple_writable_size() to the client API, and thus enable the polling scenario for the simple API too.

Even the callback scenario - which is the most efficient one, I would assume - seems not too difficult to implement in the simple API, as long as the user is aware that the callback will be called from a separate thread (as the simple API is based on a threaded mainloop).

Sure, more options makes a simple API less simple, but at least the pa_simple_writable_size API wouldn't hurt to implement IMO. The user-friendliness of providing this outweighs the possible lack of simplicity. Or what do you think?

For recording streams; the same reasoning applies.

--
David Henningsson, Canonical Ltd.
https://launchpad.net/~diwic

_______________________________________________
pulseaudio-discuss mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss

Reply via email to