[pulseaudio-discuss] [PATCH v5 5/7] bluetooth: Auto recover if profile is 'off'

Tanu Kaskinen tanuk at iki.fi
Sat May 6 16:20:09 UTC 2017


On Fri, 2017-05-05 at 16:41 +0300, Luiz Augusto von Dentz wrote:
> Hi Tanu,
> 
> On Thu, May 4, 2017 at 3:29 PM, Tanu Kaskinen <tanuk at iki.fi> wrote:
> > On Thu, 2017-05-04 at 12:58 +0300, Luiz Augusto von Dentz wrote:
> > > From: Luiz Augusto von Dentz <luiz.von.dentz at intel.com>
> > > 
> > > This means something went wrong, which in case of ofono backend it is
> > > probably due to the profile not connecting immediately, but it can be
> > > safely restored in that case the transport is playing which means the
> > > profile has recovered connectivity.
> > > ---
> > >  src/modules/bluetooth/module-bluez5-device.c | 8 +++++++-
> > >  1 file changed, 7 insertions(+), 1 deletion(-)
> > > 
> > > diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
> > > index a96da17..2f0ec97 100644
> > > --- a/src/modules/bluetooth/module-bluez5-device.c
> > > +++ b/src/modules/bluetooth/module-bluez5-device.c
> > > @@ -2060,8 +2060,14 @@ static pa_hook_result_t transport_state_changed_cb(pa_bluetooth_discovery *y, pa
> > >      if (t == u->transport && t->state <= PA_BLUETOOTH_TRANSPORT_STATE_DISCONNECTED)
> > >          pa_assert_se(pa_card_set_profile(u->card, pa_hashmap_get(u->card->profiles, "off"), false) >= 0);
> > > 
> > > -    if (t->device == u->device)
> > > +    if (t->device == u->device) {
> > > +        /* Auto recover from errors causing the profile to be set to off */
> > > +        if (u->profile == PA_BLUETOOTH_PROFILE_OFF && t->state == PA_BLUETOOTH_TRANSPORT_STATE_PLAYING) {
> > > +            pa_log_debug("Switching to profile %s", pa_bluetooth_profile_to_string(t->profile));
> > > +            pa_assert_se(pa_card_set_profile(u->card, pa_hashmap_get(u->card->profiles, pa_bluetooth_profile_to_string(t->profile)), false) >= 0);
> > 
> > Regarding the assertion, how do you know that the card profile switch
> > will always succeed? Is there no IO involved? If you somehow know that
> > it will always succeed, there should be a comment explaining how you
> > know that.
> 
> The playing state should guarantee the fd is available, so there
> shouldn't be any problem in this regard.

At least start_thread() can fail, and that will make the profile change
fail.

> > I know there are already assertions when switching to the off profile,
> > but that's a special profile - activating it should never fail.
> > 
> > This change seems dubious in another way too. So far we've kept all
> > automatic profile switch code out of module-bluez5-device (apart from
> > switches to "off" when things fail). Automatic switching is handled by
> > module-bluetooth-policy instead. If I understood correctly, this is a
> > fix for a situation where we already tried to switch to a profile, but
> > it failed first. The code is lacking any checks that would do the
> > profile change only if there really was a prior profile switch attempt.
> 
> It is exactly to counter the profiles switching 'off' which is done in
> the device itself, we could of course move this to policy as well
> though. Note that in most cases it is better to switch to a working
> profile than 'off' since that for sure won't render anything.

If we try to switch to some profile and it fails and as a result the
profile gets set to "off", then I think it's fine to fix that problem
in module-bluez5-device, but as I said, there's nothing in this patch
that would ensure that this is done *only* when this situation occurs.
If there was no problem earlier, then module-bluez5-device shouldn't
automatically change its profile, that kind of stuff belongs to module-
bluetooth-policy.

Georg told me that this patch isn't needed anyway, after the "bluez5-
device: Correctly handle suspend/resume cyle for audio gateway role of
ofono backend" patch. If that's true, then can we just revert this?

-- 
Tanu

https://www.patreon.com/tanuk


More information about the pulseaudio-discuss mailing list