[pulseaudio-discuss] [PATCH v4] Make module loopback honor requested latency

Georg Chini georg at chini.tk
Mon Feb 23 09:56:54 PST 2015


On 23.02.2015 08:02, Georg Chini wrote:
> On 22.02.2015 23:25, Alexander E. Patrakov wrote:
>
>> Anyway, the original submission (i.e. the patch that I am replying 
>> to) has a bug: it crashes PulseAudio in the Bluetooth A2DP -> HDA 
>> test if one changes the sink profile from Stereo Output to 2.1 
>> Surround Output while the loopback is active. Before the patch, there 
>> was no such crash.
>>
>
> I do not think that is a bug in the module. It looks like the sink has 
> already changed when
> pa_sink_input_may_move_to_cb() is called and that should definitely 
> not be the case.
> The original version does not show that problem because it never 
> resets the rate when source
> or sink changes.
>
> Not too sure, but maybe this code in card_set_profile in 
> module_alsa_card.c, line 223 already frees
> the sink before it should?
>
>             sink_inputs = pa_sink_move_all_start(am->sink, sink_inputs);
>             pa_alsa_sink_free(am->sink);
>             am->sink = NULL;
>
>
I have looked into this somewhat more, and it seems like the 
may_move_to() function of the
sink input cannot hold what it promises. In sink-input.h the description is:

     /* If non-NULL this function is called before this sink input is
      * move to a sink and if it returns false the move will not
      * be allowed */
     bool (*may_move_to) (pa_sink_input *i, pa_sink *s); /* may be NULL */

When the profile changes, the old sink does no longer exist when 
may_move_to() is called,
because it must be destroyed to create a new sink with the different 
profile. So it is obviously
too late to cancel the move here (and module-loopback cannot reset the 
rate).
Unfortunately in this situation there is also no way to call 
may_move_to() before the old sink is
destroyed because the new sink is not known before it is created.

So my question: Should there be a function may_move() that is called 
before anything is done?

     /* If non-NULL this function is called before this sink input is
      * moved anywhere and if it returns false the move will not
      * be allowed */
      bool (*may_move) (pa_sink_input *i); /* may be NULL */

The call to this function could be added to pa_sink_input_may_move().

The same probably applies for the source output.

Regards
             Georg




More information about the pulseaudio-discuss mailing list