[pulseaudio-discuss] calling pa_stream_update_timing_info in another thread

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


   sorry Georg, it`s ok now, my bad, I made a double lock in my calling 
chain ....


在 2015年05月20日 15:04, golden 写道:
> 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