[pulseaudio-discuss] calling pa_stream_update_timing_info in another thread

golden magic.lixin at gmail.com
Wed May 20 00:04:20 PDT 2015


Hi Georg

         static void pa_stream_timing_callback(pa_stream*s, int success, 
void *userdata)
         {
             NCLOGD("pa_stream_timing_callback -");
pa_threaded_mainloop_signal((pa_threaded_mainloop*)userdata, 0);
         }

        int64_t audiostream::getBufferLatencySize()
     {

         pa_threaded_mainloop_lock(m_mainloop);
         pa_operation* o = pa_stream_update_timing_info(s, 
pa_stream_timing_callback, m_mainloop);
         LOGD("enter PA_WAIT_OPEARION2DONE loop");
         if (o != NULL) {
             while (pa_operation_get_state(o) == PA_OPERATION_RUNNING)
             {
                 pa_threaded_mainloop_wait(m_mainloop);
                 NCLOGD("pa_operation_get_state(o) = %d", 
pa_operation_get_state(o));
             }
             pa_operation_unref(o);
             o = NULL;
         } else {
             LOGD("PA_WAIT_OPEARION2DONE operation is NULL");
         }

         NCLOGD("exit PA_WAIT_OPEARION2DONE loop");
         pa_threaded_mainloop_unlock(m_mainloop);


         const pa_timing_info* t = pa_stream_get_timing_info(s);
         if (!t) {
             return -1;
         }
         return t->write_index - t->read_index;

      }

      this is the modified code, still the same problem.
     It feels like if auto timing update is enabled, 
pa_stream_update_timing_info called in
     another thread will be missed, and callback is not notified any more.

     That`s my test result.

BR,
Lixin


在 2015年05月20日 13:49, Georg Chini 写道:
> Dear Lixin,
>
> On 20.05.2015 04:10, golden wrote:
>> Dear PulseAudio forks,
>>
>>
>>      I`m making a function to get the buffer latency of 
>> pa_stream(with PA_STREAM_AUTO_TIMING_UPDATE flag), here is what it 
>> looks like
>
> What type of mainloop are you using?
>
>>
>>
>>      void operation_done_callback(pa_stream* , bool, void*)
>>     {
>>        LOGD("operation_done");
>>     }
>>
>>       int64_t audiostream::getBufferLatencySize()
>>      {
>>         // m_stream is a pointer of pa_stream
>>         pa_operation* o = pa_stream_update_timing_info(m_stream, 
>> operation_done_callback, this);
>>         LOGD("enter PA_WAIT_OPEARION2DONE loop");
>>         if (o != NULL) {
>>             while (sync && pa_operation_get_state(o) != 
>> PA_OPERATION_DONE)
>> ;
>
> Where does sync come from?
> Maybe you try
> while (sync && pa_operation_get_state(o) == PA_OPERATION_RUNNING)
> instead, then at least the function should always return. The way you
> implemented it, the function will never return if 
> pa_operation_get_state()
> returns PA_OPERATION_CANCELLED.
>
>> pa_operation_unref(o);
>>             o = NULL;
>>         } else {
>>             LOGD("PA_WAIT_OPEARION2DONE operation is NULL");
>>         }
>>
>>         LOGD("exit PA_WAIT_OPEARION2DONE loop");
>>
>>        const pa_timing_info* t = pa_stream_get_timing_info(s);
>>         if (!t) {
>>             return -1;
>>         }
>>         return t->write_index - t->read_index;
>> }
>>
>>     I want that the user can get the accurate result when he calls 
>> this function,
>>     so every time if user called getBufferLatencySize, I call 
>> pa_stream_update_timing_info and wait this operation done, and this 
>> function is called in user thread.
>>
>>      Sometimes this operation is never finished, and the operation 
>> done callback is never called.
>>
>>      Don't know what I'm doing wrong, any advice will be appreciated, 
>> Thanks!
>>
>>
>>
>>
>> BR,
>> Lixin
>> _______________________________________________
>> pulseaudio-discuss mailing list
>> pulseaudio-discuss at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss
>
> _______________________________________________
> pulseaudio-discuss mailing list
> pulseaudio-discuss at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/pulseaudio-discuss



More information about the pulseaudio-discuss mailing list