[pulseaudio-discuss] [patch] avoid fake rewind when setting cork state

Colin Guthrie gmane at colin.guthr.ie
Mon Aug 15 03:08:46 PDT 2011


'Twas brillig, and Colin Guthrie at 13/08/11 12:54 did gyre and gimble:
> 'Twas brillig, and Wang Xingchao at 13/08/11 02:38 did gyre and gimble:
>> Hi Col,
>>
>> 2011/8/13 Colin Guthrie <gmane at colin.guthr.ie>
>>>
>>> 'Twas brillig, and Wang Xingchao at 12/08/11 07:37 did gyre and gimble:
>>>> Hi Col,
>>>>
>>>> Pls find attached updated patch, it works fine on my Meego platform.
>>>> Feel free to let me know if there's any risk.
>>>
>>> This just doesn't feel right.
>>>
>>> Also, it seems that the current state must already be
>>> PA_SINK_INPUT_RUNNING due to the line:
>>>
>>>    corking = state == PA_SINK_INPUT_CORKED && i->thread_info.state ==
>>> PA_SINK_INPUT_RUNNING;
>>>
>>> (assuming that the thread_info.state is not updated in the
>>>> state_changed() callbacks)
>>>
>>> I've checked already when trying to debug this (by putting in an assert
>>> before calling rewind and it was already in the running state, so I
>>> don't think this patch will actually help things (tho' I have not tested
>>> it personally).
>>>
>>
>> state had been changed to "CORKED" by :
>>  i->thread_info.state = state;
> 
> 
> Yeah, but meant after your last patch... but, indeed, the underlying
> problem was that the thread_info.state was not updated when neither
> corking nor uncorking was true.
> 
>> So, need reset it to "RUNNING" before calling pa_sink_input_request_rewind(),
>> otherwise it does not really rewind, that's the bug.
>>
>> Though it's a bit ugly of the change. What about below change?
>>
>> if(!corking)
>>     i->thread_info.state = state;
>>
>>  if (corking) {
>>
>> @@ -1764,9 +1763,11 @@ void
>> pa_sink_input_set_state_within_thread(pa_sink_input *i,
>> pa_sink_input_state
>>          /* This will tell the implementing sink input driver to rewind
>>           * so that the unplayed already mixed data is not lost */
>>          pa_sink_input_request_rewind(i, 0, TRUE, TRUE, FALSE);
>> +    	i->thread_info.state = state;
>>
>>      } else if (uncorking) {
>>
>>          i->thread_info.underrun_for = (uint64_t) -1;
>>          i->thread_info.playing_for = 0;
> 
> I took a very slightly different approach but very similar in that I
> added a final else which just set the state.
> 
> I'll push this shortly after some more testing!

For reference:

http://cgit.freedesktop.org/pulseaudio/pulseaudio/commit/?id=2f55da5baa0323af76510fd07c540f6dafcf1ac0

Hope you agree this is the best way to document the issue, even if there
are less LoC that could achieve the same result.

Col


-- 

Colin Guthrie
gmane(at)colin.guthr.ie
http://colin.guthr.ie/

Day Job:
  Tribalogic Limited [http://www.tribalogic.net/]
Open Source:
  Mageia Contributor [http://www.mageia.org/]
  PulseAudio Hacker [http://www.pulseaudio.org/]
  Trac Hacker [http://trac.edgewall.org/]



More information about the pulseaudio-discuss mailing list