All of lore.kernel.org
 help / color / mirror / Atom feed
From: Marijn Suijten <marijn.suijten@somainline.org>
To: Luiz Augusto von Dentz <luiz.dentz@gmail.com>
Cc: "linux-bluetooth@vger.kernel.org"
	<linux-bluetooth@vger.kernel.org>, Pauli Virtanen <pav@iki.fi>,
	Marek Czerski <ma.czerski@gmail.com>
Subject: Re: [PATCH BlueZ v2] audio/avrcp: Determine Absolute Volume support from feature category 2
Date: Mon, 25 Oct 2021 15:42:01 +0200	[thread overview]
Message-ID: <20211025134201.v3rh4ro4zkskbfjs@SoMainline.org> (raw)
In-Reply-To: <CABBYNZKvicPfaqoun8nomNw=_qxT8k4n0+TiHxALfQOV+Ns2+A@mail.gmail.com>

Hi Luiz,

On 2021-10-19 10:38:55, Luiz Augusto von Dentz wrote:
> Hi Marijn,
> 
> On Tue, Oct 19, 2021 at 2:17 AM Marijn Suijten
> <marijn.suijten@somainline.org> wrote:
> >
> > The AVRCP spec (1.6.2) does not mention anything about a version
> > requirement for Absolute Volume, despite this feature only existing
> > since spec version 1.4.  Android reports a version of 1.3 [1] for its
> > "AVRCP remote" (CT) service and mentions in the comment above it itself
> > relies on feature bits rather than the exposed version.  As it stands
> > BlueZ requires at least version 1.4 making it unable to communicate
> > absolute volume levels with even the most recent Android phones running
> > Fluoride (have not checked the version on Gabeldorsche).
> >
> > The spec states that supporting SetAbsoluteVolume and
> > EVENT_VOLUME_CHANGED are mandatory when feature level 2 is declared,
> > excluded otherwise.  This feature bit is set on Android and, when used
> > by this patch, allows for successfully communicating volume back and
> > forth despite the version theoretically being too low.
> >
> > [1]: https://android.googlesource.com/platform/system/bt/+/android-11.0.0_r28/bta/av/bta_av_main.cc#761
> 
> But I don't think this is valid, if EVENT_VOLUME_CHANGED was
> introduced in 1.4 it should have been a reserved value in 1.3 so it
> cannot be used. So Android should really report 1.4 on its controller
> record, have you tried submitting a patch to Android to change it to
> report the version as 1.4? Anyway I'd only adopt such a change if we
> could identify the remote end is Android otherwise we risk IOP issues
> by reporting a value that is considered reserved with other stacks.

I think that's a fair concern, and it took some time to validate this on
the phones I have lying around here.  On a Sony Xperia 1 II running
stock software, both the target and controller version follow what is
set in the developer menu, and range from v1.4 to v1.6.  On the
contrary, a similar phone running a fresh AOSP build on Android 12 still
suffers from the target using version 1.3.  Only the controller version
follows what is set in developer settings.

This leaves me curious what other Android vendors do here.  I doubt they
all go in and bump this by hand just to make absolute volume work
without breaking certification.

On a similar note, various Bluetooth headphones in use here (such as the
WH-1000XM3's which must surely be certified) have worked fine with an
AOSP build only signaling version 1.3 with the FEATURE_CATEGORY_2 bit
set.  Either they're detecting Android, or they're just not caring about
the version and only about the feature bits.  I wouldn't be surprised if
the extra validation performed by BlueZ here is more than most firmware.

As far as I'm aware AVRCP 1.3 doesn't define FEATURE_CATEGORY_2 either
(but I don't have that spec available to check) so IOP would only find
this if it combines v1.3 with that feature bit and then tries to check
CAP_EVENTS_SUPPORTED.  But if it does that, it should also find that
we're not even checking for the controller supporting FEATURE_CATEGORY_2
in the first place, nor are disallowing the controller to send
SetAbsoluteVolume.  That's something we should add for sure, even if we
don't go ahead with decreasing the minimum version for category-2
features below 1.4.
I can send a preliminary patch enforcing this if you want.

I've previously submitted changes to Android and they almost always get
lost in the noise - and even if they get through most Android phones
won't see that update anyway.  It seems there already is some move in
this direction [1] but that's on AOSP master and doesn't even reach
Android 12 (yet), besides requiringg a strange "enablenewavrcp"
property.

Finally, on the subject of incorrect behaviour and IOP, I found
179ccb936 ("avrcp: Set volume if volume changed event is registered")
which also seems counter-intuitive besides going completely against the
spec.  It doesn't seem to have gone in through the mailing lists nor
discusses the affected device and any potential misbehaviour as a
result.  If you're concerned with this patch, is that something you'd
like to keep as well?

- Marijn

[1]: https://android-review.googlesource.com/c/platform/system/bt/+/1827796

> > ---
> >
> > Changes since v1:
> > - Use block comment instead of single-line comment.
> >
> >  profiles/audio/avrcp.c | 8 ++++++--
> >  1 file changed, 6 insertions(+), 2 deletions(-)
> >
> > diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> > index d3c9cb795..e530eeab4 100644
> > --- a/profiles/audio/avrcp.c
> > +++ b/profiles/audio/avrcp.c
> > @@ -4175,13 +4175,17 @@ static void target_init(struct avrcp *session)
> >                                 (1 << AVRCP_EVENT_TRACK_REACHED_END) |
> >                                 (1 << AVRCP_EVENT_SETTINGS_CHANGED);
> >
> > +       /* Remote device supports receiving volume notifications */
> > +       if (target->features & AVRCP_FEATURE_CATEGORY_2)
> > +               session->supported_events |=
> > +                               (1 << AVRCP_EVENT_VOLUME_CHANGED);
> > +
> >         if (target->version < 0x0104)
> >                 return;
> >
> >         session->supported_events |=
> >                                 (1 << AVRCP_EVENT_ADDRESSED_PLAYER_CHANGED) |
> > -                               (1 << AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED) |
> > -                               (1 << AVRCP_EVENT_VOLUME_CHANGED);
> > +                               (1 << AVRCP_EVENT_AVAILABLE_PLAYERS_CHANGED);
> >
> >         /* Only check capabilities if controller is not supported */
> >         if (session->controller == NULL)
> > --
> > 2.33.1
> >
> 
> 
> -- 
> Luiz Augusto von Dentz

  reply	other threads:[~2021-10-25 13:42 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-10-19  9:16 [PATCH BlueZ v2] audio/avrcp: Determine Absolute Volume support from feature category 2 Marijn Suijten
2021-10-19  9:38 ` [BlueZ,v2] " bluez.test.bot
2021-10-19 17:38 ` [PATCH BlueZ v2] " Luiz Augusto von Dentz
2021-10-25 13:42   ` Marijn Suijten [this message]
2021-10-25 17:48     ` Luiz Augusto von Dentz
2021-10-25 18:37       ` Marijn Suijten
2021-10-25 20:32         ` Luiz Augusto von Dentz
2021-10-25 21:02           ` Marijn Suijten

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211025134201.v3rh4ro4zkskbfjs@SoMainline.org \
    --to=marijn.suijten@somainline.org \
    --cc=linux-bluetooth@vger.kernel.org \
    --cc=luiz.dentz@gmail.com \
    --cc=ma.czerski@gmail.com \
    --cc=pav@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.