[pulseaudio-discuss] Expand the simple API?

David Henningsson david.henningsson at canonical.com
Tue Mar 19 06:27:45 PDT 2013


On 03/19/2013 10:56 AM, Tanu Kaskinen wrote:
> On Tue, 2013-03-19 at 09:40 +0100, David Henningsson wrote:
>> 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?
>
> I'd be OK with adding pa_simple_writable/readable_size(). I believe the
> multi-threading aspect of adding the write/read callbacks unavoidably
> makes writing applications not-simple, so the simple API probably
> shouldn't have those callbacks.

Hmm, just found something when looking at readable_size(). In case of 
stream holes, _readable_size() would return more than can actually be 
read by simple_read() without blocking.

Do you think this limitation is acceptable? If not, do you think 
pa_simple_readable_size should just return the length of the first 
memblock like this:

   for (;;) {
     pa_stream_peek(&data, &length);
     if (data)
       return length;
     pa_stream_drop(length);
   }


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


More information about the pulseaudio-discuss mailing list