* [PATCH bluez] audio: Don't initialize device volume from media player
@ 2025-08-05 10:21 Myrrh Periwinkle
2025-08-05 12:02 ` [bluez] " bluez.test.bot
` (2 more replies)
0 siblings, 3 replies; 8+ messages in thread
From: Myrrh Periwinkle @ 2025-08-05 10:21 UTC (permalink / raw)
To: Linux Bluetooth
Media player objects may be shared between devices. As a result,
a device without support for hardware volume that is connected after one
that does may end up being erroneously considered hardware
volume-capable.
fa7828bdd ("transport: Fix not being able to initialize volume properly")
introduced btd_device_{get,set}_volume that is used as an alternative in
case no media player objects are present. Therefore, we can remove
media_player_get_device_volume and instead use btd_device_get_volume to
determine the initial volume.
---
profiles/audio/avrcp.c | 2 +-
profiles/audio/media.c | 33 +--------------------------------
profiles/audio/media.h | 1 -
3 files changed, 2 insertions(+), 34 deletions(-)
diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
index e2797112fcd580c3fc56793f933e00b1c61e5205..ec07522e6a34eb1dc5f6f413f48f1087a609df9a 100644
--- a/profiles/audio/avrcp.c
+++ b/profiles/audio/avrcp.c
@@ -4284,7 +4284,7 @@ static void target_init(struct avrcp *session)
target->player = player;
player->sessions = g_slist_prepend(player->sessions, session);
- init_volume = media_player_get_device_volume(session->dev);
+ init_volume = btd_device_get_volume(session->dev);
media_transport_update_device_volume(session->dev, init_volume);
}
diff --git a/profiles/audio/media.c b/profiles/audio/media.c
index 8e62dca17070edbc5101677c6eebd3707492c824..55f1482d1d9ce52e104481bab3ede373f47aee0c 100644
--- a/profiles/audio/media.c
+++ b/profiles/audio/media.c
@@ -499,37 +499,6 @@ struct a2dp_config_data {
a2dp_endpoint_config_t cb;
};
-int8_t media_player_get_device_volume(struct btd_device *device)
-{
-#ifdef HAVE_AVRCP
- struct avrcp_player *target_player;
- struct media_adapter *adapter;
- GSList *l;
-
- if (!device)
- return -1;
-
- target_player = avrcp_get_target_player_by_device(device);
- if (!target_player)
- goto done;
-
- adapter = find_adapter(device);
- if (!adapter)
- goto done;
-
- for (l = adapter->players; l; l = l->next) {
- struct media_player *mp = l->data;
-
- if (mp->player == target_player)
- return mp->volume;
- }
-
-done:
-#endif /* HAVE_AVRCP */
- /* If media_player doesn't exists use device_volume */
- return btd_device_get_volume(device);
-}
-
static gboolean set_configuration(struct media_endpoint *endpoint,
uint8_t *configuration, size_t size,
media_endpoint_cb_t cb,
@@ -556,7 +525,7 @@ static gboolean set_configuration(struct media_endpoint *endpoint,
if (transport == NULL)
return FALSE;
- init_volume = media_player_get_device_volume(device);
+ init_volume = btd_device_get_volume(device);
media_transport_update_volume(transport, init_volume);
msg = dbus_message_new_method_call(endpoint->sender, endpoint->path,
diff --git a/profiles/audio/media.h b/profiles/audio/media.h
index 2b2e8e1572874d5f71abb28fdd5b92fa2d9efe83..d3954abd6de505a69cab3fcffc217d236a52d3e5 100644
--- a/profiles/audio/media.h
+++ b/profiles/audio/media.h
@@ -23,6 +23,5 @@ uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint);
struct btd_adapter *media_endpoint_get_btd_adapter(
struct media_endpoint *endpoint);
bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
-int8_t media_player_get_device_volume(struct btd_device *device);
const struct media_endpoint *media_endpoint_get_asha(void);
---
base-commit: 2c0c323d08357a4ff3065fcd49fee0c83b5835cd
change-id: 20250805-audio-no-reuse-media-player-volume-fbc2983a287a
Best regards,
--
Myrrh Periwinkle <myrrhperiwinkle@qtmlabs.xyz>
^ permalink raw reply related [flat|nested] 8+ messages in thread
* RE: [bluez] audio: Don't initialize device volume from media player
2025-08-05 10:21 [PATCH bluez] audio: Don't initialize device volume from media player Myrrh Periwinkle
@ 2025-08-05 12:02 ` bluez.test.bot
2025-08-05 15:24 ` [PATCH bluez] " Luiz Augusto von Dentz
2025-08-12 18:10 ` patchwork-bot+bluetooth
2 siblings, 0 replies; 8+ messages in thread
From: bluez.test.bot @ 2025-08-05 12:02 UTC (permalink / raw)
To: linux-bluetooth, myrrhperiwinkle
[-- Attachment #1: Type: text/plain, Size: 1261 bytes --]
This is automated email and please do not reply to this email!
Dear submitter,
Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=988417
---Test result---
Test Summary:
CheckPatch PENDING 0.29 seconds
GitLint PENDING 0.28 seconds
BuildEll PASS 20.01 seconds
BluezMake PASS 2701.18 seconds
MakeCheck PASS 20.14 seconds
MakeDistcheck PASS 184.68 seconds
CheckValgrind PASS 234.98 seconds
CheckSmatch PASS 304.73 seconds
bluezmakeextell PASS 128.95 seconds
IncrementalBuild PENDING 0.24 seconds
ScanBuild PASS 911.45 seconds
Details
##############################
Test: CheckPatch - PENDING
Desc: Run checkpatch.pl script
Output:
##############################
Test: GitLint - PENDING
Desc: Run gitlint
Output:
##############################
Test: IncrementalBuild - PENDING
Desc: Incremental build with the patches in the series
Output:
---
Regards,
Linux Bluetooth
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bluez] audio: Don't initialize device volume from media player
2025-08-05 10:21 [PATCH bluez] audio: Don't initialize device volume from media player Myrrh Periwinkle
2025-08-05 12:02 ` [bluez] " bluez.test.bot
@ 2025-08-05 15:24 ` Luiz Augusto von Dentz
2025-08-05 15:34 ` Myrrh Periwinkle
2025-08-12 18:10 ` patchwork-bot+bluetooth
2 siblings, 1 reply; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2025-08-05 15:24 UTC (permalink / raw)
To: Myrrh Periwinkle; +Cc: Linux Bluetooth
Hi Myrrh,
On Tue, Aug 5, 2025 at 6:29 AM Myrrh Periwinkle
<myrrhperiwinkle@qtmlabs.xyz> wrote:
>
> Media player objects may be shared between devices. As a result,
> a device without support for hardware volume that is connected after one
> that does may end up being erroneously considered hardware
> volume-capable.
Don't quite follow, avrcp_player is per device, not sure how it can be
shared between devices?
> fa7828bdd ("transport: Fix not being able to initialize volume properly")
> introduced btd_device_{get,set}_volume that is used as an alternative in
> case no media player objects are present. Therefore, we can remove
> media_player_get_device_volume and instead use btd_device_get_volume to
> determine the initial volume.
Don't follow you here, why shouldn;t we use the media player if we have one?
> ---
> profiles/audio/avrcp.c | 2 +-
> profiles/audio/media.c | 33 +--------------------------------
> profiles/audio/media.h | 1 -
> 3 files changed, 2 insertions(+), 34 deletions(-)
>
> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> index e2797112fcd580c3fc56793f933e00b1c61e5205..ec07522e6a34eb1dc5f6f413f48f1087a609df9a 100644
> --- a/profiles/audio/avrcp.c
> +++ b/profiles/audio/avrcp.c
> @@ -4284,7 +4284,7 @@ static void target_init(struct avrcp *session)
> target->player = player;
> player->sessions = g_slist_prepend(player->sessions, session);
>
> - init_volume = media_player_get_device_volume(session->dev);
> + init_volume = btd_device_get_volume(session->dev);
> media_transport_update_device_volume(session->dev, init_volume);
> }
>
> diff --git a/profiles/audio/media.c b/profiles/audio/media.c
> index 8e62dca17070edbc5101677c6eebd3707492c824..55f1482d1d9ce52e104481bab3ede373f47aee0c 100644
> --- a/profiles/audio/media.c
> +++ b/profiles/audio/media.c
> @@ -499,37 +499,6 @@ struct a2dp_config_data {
> a2dp_endpoint_config_t cb;
> };
>
> -int8_t media_player_get_device_volume(struct btd_device *device)
> -{
> -#ifdef HAVE_AVRCP
> - struct avrcp_player *target_player;
> - struct media_adapter *adapter;
> - GSList *l;
> -
> - if (!device)
> - return -1;
> -
> - target_player = avrcp_get_target_player_by_device(device);
> - if (!target_player)
> - goto done;
> -
> - adapter = find_adapter(device);
> - if (!adapter)
> - goto done;
> -
> - for (l = adapter->players; l; l = l->next) {
> - struct media_player *mp = l->data;
> -
> - if (mp->player == target_player)
> - return mp->volume;
> - }
> -
> -done:
> -#endif /* HAVE_AVRCP */
> - /* If media_player doesn't exists use device_volume */
> - return btd_device_get_volume(device);
> -}
> -
> static gboolean set_configuration(struct media_endpoint *endpoint,
> uint8_t *configuration, size_t size,
> media_endpoint_cb_t cb,
> @@ -556,7 +525,7 @@ static gboolean set_configuration(struct media_endpoint *endpoint,
> if (transport == NULL)
> return FALSE;
>
> - init_volume = media_player_get_device_volume(device);
> + init_volume = btd_device_get_volume(device);
> media_transport_update_volume(transport, init_volume);
>
> msg = dbus_message_new_method_call(endpoint->sender, endpoint->path,
> diff --git a/profiles/audio/media.h b/profiles/audio/media.h
> index 2b2e8e1572874d5f71abb28fdd5b92fa2d9efe83..d3954abd6de505a69cab3fcffc217d236a52d3e5 100644
> --- a/profiles/audio/media.h
> +++ b/profiles/audio/media.h
> @@ -23,6 +23,5 @@ uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint);
> struct btd_adapter *media_endpoint_get_btd_adapter(
> struct media_endpoint *endpoint);
> bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
> -int8_t media_player_get_device_volume(struct btd_device *device);
>
> const struct media_endpoint *media_endpoint_get_asha(void);
>
> ---
> base-commit: 2c0c323d08357a4ff3065fcd49fee0c83b5835cd
> change-id: 20250805-audio-no-reuse-media-player-volume-fbc2983a287a
>
> Best regards,
> --
> Myrrh Periwinkle <myrrhperiwinkle@qtmlabs.xyz>
>
>
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bluez] audio: Don't initialize device volume from media player
2025-08-05 15:24 ` [PATCH bluez] " Luiz Augusto von Dentz
@ 2025-08-05 15:34 ` Myrrh Periwinkle
2025-08-05 16:01 ` Luiz Augusto von Dentz
0 siblings, 1 reply; 8+ messages in thread
From: Myrrh Periwinkle @ 2025-08-05 15:34 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: Linux Bluetooth
Resent because I forgot to use "Reply All"
On 8/5/25 22:24, Luiz Augusto von Dentz wrote:
> Hi Myrrh,
>
> On Tue, Aug 5, 2025 at 6:29 AM Myrrh Periwinkle
> <myrrhperiwinkle@qtmlabs.xyz> wrote:
>> Media player objects may be shared between devices. As a result,
>> a device without support for hardware volume that is connected after one
>> that does may end up being erroneously considered hardware
>> volume-capable.
> Don't quite follow, avrcp_player is per device, not sure how it can be
> shared between devices?
>
>> fa7828bdd ("transport: Fix not being able to initialize volume properly")
>> introduced btd_device_{get,set}_volume that is used as an alternative in
>> case no media player objects are present. Therefore, we can remove
>> media_player_get_device_volume and instead use btd_device_get_volume to
>> determine the initial volume.
> Don't follow you here, why shouldn;t we use the media player if we have one?
>
>> ---
>> profiles/audio/avrcp.c | 2 +-
>> profiles/audio/media.c | 33 +--------------------------------
>> profiles/audio/media.h | 1 -
>> 3 files changed, 2 insertions(+), 34 deletions(-)
>>
>> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
>> index e2797112fcd580c3fc56793f933e00b1c61e5205..ec07522e6a34eb1dc5f6f413f48f1087a609df9a 100644
>> --- a/profiles/audio/avrcp.c
>> +++ b/profiles/audio/avrcp.c
>> @@ -4284,7 +4284,7 @@ static void target_init(struct avrcp *session)
>> target->player = player;
>> player->sessions = g_slist_prepend(player->sessions, session);
>>
>> - init_volume = media_player_get_device_volume(session->dev);
>> + init_volume = btd_device_get_volume(session->dev);
>> media_transport_update_device_volume(session->dev, init_volume);
>> }
>>
>> diff --git a/profiles/audio/media.c b/profiles/audio/media.c
>> index 8e62dca17070edbc5101677c6eebd3707492c824..55f1482d1d9ce52e104481bab3ede373f47aee0c 100644
>> --- a/profiles/audio/media.c
>> +++ b/profiles/audio/media.c
>> @@ -499,37 +499,6 @@ struct a2dp_config_data {
>> a2dp_endpoint_config_t cb;
>> };
>>
>> -int8_t media_player_get_device_volume(struct btd_device *device)
>> -{
>> -#ifdef HAVE_AVRCP
>> - struct avrcp_player *target_player;
>> - struct media_adapter *adapter;
>> - GSList *l;
>> -
>> - if (!device)
>> - return -1;
>> -
>> - target_player = avrcp_get_target_player_by_device(device);
>> - if (!target_player)
>> - goto done;
>> -
>> - adapter = find_adapter(device);
>> - if (!adapter)
>> - goto done;
>> -
>> - for (l = adapter->players; l; l = l->next) {
>> - struct media_player *mp = l->data;
>> -
>> - if (mp->player == target_player)
>> - return mp->volume;
The `avrcp_player` object indeed is not shared between devices, but the
volume is acquired from (and set for) the associated `media_player`
object which is not tied to a specific device, and corresponds to client
`org.mpris.MediaPlayer2.Player` objects.
>> - }
>> -
>> -done:
>> -#endif /* HAVE_AVRCP */
>> - /* If media_player doesn't exists use device_volume */
>> - return btd_device_get_volume(device);
>> -}
>> -
>> static gboolean set_configuration(struct media_endpoint *endpoint,
>> uint8_t *configuration, size_t size,
>> media_endpoint_cb_t cb,
>> @@ -556,7 +525,7 @@ static gboolean set_configuration(struct media_endpoint *endpoint,
>> if (transport == NULL)
>> return FALSE;
>>
>> - init_volume = media_player_get_device_volume(device);
>> + init_volume = btd_device_get_volume(device);
>> media_transport_update_volume(transport, init_volume);
>>
>> msg = dbus_message_new_method_call(endpoint->sender, endpoint->path,
>> diff --git a/profiles/audio/media.h b/profiles/audio/media.h
>> index 2b2e8e1572874d5f71abb28fdd5b92fa2d9efe83..d3954abd6de505a69cab3fcffc217d236a52d3e5 100644
>> --- a/profiles/audio/media.h
>> +++ b/profiles/audio/media.h
>> @@ -23,6 +23,5 @@ uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint);
>> struct btd_adapter *media_endpoint_get_btd_adapter(
>> struct media_endpoint *endpoint);
>> bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
>> -int8_t media_player_get_device_volume(struct btd_device *device);
>>
>> const struct media_endpoint *media_endpoint_get_asha(void);
>>
>> ---
>> base-commit: 2c0c323d08357a4ff3065fcd49fee0c83b5835cd
>> change-id: 20250805-audio-no-reuse-media-player-volume-fbc2983a287a
>>
>> Best regards,
>> --
>> Myrrh Periwinkle<myrrhperiwinkle@qtmlabs.xyz>
>>
>>
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bluez] audio: Don't initialize device volume from media player
2025-08-05 15:34 ` Myrrh Periwinkle
@ 2025-08-05 16:01 ` Luiz Augusto von Dentz
2025-08-05 16:08 ` Myrrh Periwinkle
0 siblings, 1 reply; 8+ messages in thread
From: Luiz Augusto von Dentz @ 2025-08-05 16:01 UTC (permalink / raw)
To: Myrrh Periwinkle; +Cc: Linux Bluetooth
Hi Myrrh,
On Tue, Aug 5, 2025 at 11:34 AM Myrrh Periwinkle
<myrrhperiwinkle@qtmlabs.xyz> wrote:
>
> Resent because I forgot to use "Reply All"
>
> On 8/5/25 22:24, Luiz Augusto von Dentz wrote:
> > Hi Myrrh,
> >
> > On Tue, Aug 5, 2025 at 6:29 AM Myrrh Periwinkle
> > <myrrhperiwinkle@qtmlabs.xyz> wrote:
> >> Media player objects may be shared between devices. As a result,
> >> a device without support for hardware volume that is connected after one
> >> that does may end up being erroneously considered hardware
> >> volume-capable.
> > Don't quite follow, avrcp_player is per device, not sure how it can be
> > shared between devices?
> >
> >> fa7828bdd ("transport: Fix not being able to initialize volume properly")
> >> introduced btd_device_{get,set}_volume that is used as an alternative in
> >> case no media player objects are present. Therefore, we can remove
> >> media_player_get_device_volume and instead use btd_device_get_volume to
> >> determine the initial volume.
> > Don't follow you here, why shouldn;t we use the media player if we have one?
> >
> >> ---
> >> profiles/audio/avrcp.c | 2 +-
> >> profiles/audio/media.c | 33 +--------------------------------
> >> profiles/audio/media.h | 1 -
> >> 3 files changed, 2 insertions(+), 34 deletions(-)
> >>
> >> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
> >> index e2797112fcd580c3fc56793f933e00b1c61e5205..ec07522e6a34eb1dc5f6f413f48f1087a609df9a 100644
> >> --- a/profiles/audio/avrcp.c
> >> +++ b/profiles/audio/avrcp.c
> >> @@ -4284,7 +4284,7 @@ static void target_init(struct avrcp *session)
> >> target->player = player;
> >> player->sessions = g_slist_prepend(player->sessions, session);
> >>
> >> - init_volume = media_player_get_device_volume(session->dev);
> >> + init_volume = btd_device_get_volume(session->dev);
> >> media_transport_update_device_volume(session->dev, init_volume);
> >> }
> >>
> >> diff --git a/profiles/audio/media.c b/profiles/audio/media.c
> >> index 8e62dca17070edbc5101677c6eebd3707492c824..55f1482d1d9ce52e104481bab3ede373f47aee0c 100644
> >> --- a/profiles/audio/media.c
> >> +++ b/profiles/audio/media.c
> >> @@ -499,37 +499,6 @@ struct a2dp_config_data {
> >> a2dp_endpoint_config_t cb;
> >> };
> >>
> >> -int8_t media_player_get_device_volume(struct btd_device *device)
> >> -{
> >> -#ifdef HAVE_AVRCP
> >> - struct avrcp_player *target_player;
> >> - struct media_adapter *adapter;
> >> - GSList *l;
> >> -
> >> - if (!device)
> >> - return -1;
> >> -
> >> - target_player = avrcp_get_target_player_by_device(device);
> >> - if (!target_player)
> >> - goto done;
> >> -
> >> - adapter = find_adapter(device);
> >> - if (!adapter)
> >> - goto done;
> >> -
> >> - for (l = adapter->players; l; l = l->next) {
> >> - struct media_player *mp = l->data;
> >> -
> >> - if (mp->player == target_player)
> >> - return mp->volume;
> The `avrcp_player` object indeed is not shared between devices, but the
> volume is acquired from (and set for) the associated `media_player`
> object which is not tied to a specific device, and corresponds to client
> `org.mpris.MediaPlayer2.Player` objects.
Ok, so what is the problem with that? If there are 2 headsets that
wants to control the same player registered via mpris-proxy(?) that
should be allowed, or the problem is that each device should control a
dedicated instance of the volume? I suspect the volume store in
mp->volume is only used as initial volume since the actual volume is
stored in the Transport.Volume, the reason why we can't use the
Transport directly is that it is created on demand while there is a
stream so if the stream is not ready at time a volume has been set we
need to store it elsewhere, that said perhaps that should be store per
device not per media_player which seem to be registered per adapter in
media.c but then we should probably remove the volume field altogether
to avoid any confusion in the future.
> >> - }
> >> -
> >> -done:
> >> -#endif /* HAVE_AVRCP */
> >> - /* If media_player doesn't exists use device_volume */
> >> - return btd_device_get_volume(device);
> >> -}
> >> -
> >> static gboolean set_configuration(struct media_endpoint *endpoint,
> >> uint8_t *configuration, size_t size,
> >> media_endpoint_cb_t cb,
> >> @@ -556,7 +525,7 @@ static gboolean set_configuration(struct media_endpoint *endpoint,
> >> if (transport == NULL)
> >> return FALSE;
> >>
> >> - init_volume = media_player_get_device_volume(device);
> >> + init_volume = btd_device_get_volume(device);
> >> media_transport_update_volume(transport, init_volume);
> >>
> >> msg = dbus_message_new_method_call(endpoint->sender, endpoint->path,
> >> diff --git a/profiles/audio/media.h b/profiles/audio/media.h
> >> index 2b2e8e1572874d5f71abb28fdd5b92fa2d9efe83..d3954abd6de505a69cab3fcffc217d236a52d3e5 100644
> >> --- a/profiles/audio/media.h
> >> +++ b/profiles/audio/media.h
> >> @@ -23,6 +23,5 @@ uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint);
> >> struct btd_adapter *media_endpoint_get_btd_adapter(
> >> struct media_endpoint *endpoint);
> >> bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
> >> -int8_t media_player_get_device_volume(struct btd_device *device);
> >>
> >> const struct media_endpoint *media_endpoint_get_asha(void);
> >>
> >> ---
> >> base-commit: 2c0c323d08357a4ff3065fcd49fee0c83b5835cd
> >> change-id: 20250805-audio-no-reuse-media-player-volume-fbc2983a287a
> >>
> >> Best regards,
> >> --
> >> Myrrh Periwinkle<myrrhperiwinkle@qtmlabs.xyz>
> >>
> >>
--
Luiz Augusto von Dentz
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bluez] audio: Don't initialize device volume from media player
2025-08-05 16:01 ` Luiz Augusto von Dentz
@ 2025-08-05 16:08 ` Myrrh Periwinkle
2025-08-06 0:50 ` Myrrh Periwinkle
0 siblings, 1 reply; 8+ messages in thread
From: Myrrh Periwinkle @ 2025-08-05 16:08 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: Linux Bluetooth
Hi,
On 8/5/25 23:01, Luiz Augusto von Dentz wrote:
> Hi Myrrh,
>
> On Tue, Aug 5, 2025 at 11:34 AM Myrrh Periwinkle
> <myrrhperiwinkle@qtmlabs.xyz> wrote:
>> Resent because I forgot to use "Reply All"
>>
>> On 8/5/25 22:24, Luiz Augusto von Dentz wrote:
>>> Hi Myrrh,
>>>
>>> On Tue, Aug 5, 2025 at 6:29 AM Myrrh Periwinkle
>>> <myrrhperiwinkle@qtmlabs.xyz> wrote:
>>>> Media player objects may be shared between devices. As a result,
>>>> a device without support for hardware volume that is connected after one
>>>> that does may end up being erroneously considered hardware
>>>> volume-capable.
>>> Don't quite follow, avrcp_player is per device, not sure how it can be
>>> shared between devices?
>>>
>>>> fa7828bdd ("transport: Fix not being able to initialize volume properly")
>>>> introduced btd_device_{get,set}_volume that is used as an alternative in
>>>> case no media player objects are present. Therefore, we can remove
>>>> media_player_get_device_volume and instead use btd_device_get_volume to
>>>> determine the initial volume.
>>> Don't follow you here, why shouldn;t we use the media player if we have one?
>>>
>>>> ---
>>>> profiles/audio/avrcp.c | 2 +-
>>>> profiles/audio/media.c | 33 +--------------------------------
>>>> profiles/audio/media.h | 1 -
>>>> 3 files changed, 2 insertions(+), 34 deletions(-)
>>>>
>>>> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
>>>> index e2797112fcd580c3fc56793f933e00b1c61e5205..ec07522e6a34eb1dc5f6f413f48f1087a609df9a 100644
>>>> --- a/profiles/audio/avrcp.c
>>>> +++ b/profiles/audio/avrcp.c
>>>> @@ -4284,7 +4284,7 @@ static void target_init(struct avrcp *session)
>>>> target->player = player;
>>>> player->sessions = g_slist_prepend(player->sessions, session);
>>>>
>>>> - init_volume = media_player_get_device_volume(session->dev);
>>>> + init_volume = btd_device_get_volume(session->dev);
>>>> media_transport_update_device_volume(session->dev, init_volume);
>>>> }
>>>>
>>>> diff --git a/profiles/audio/media.c b/profiles/audio/media.c
>>>> index 8e62dca17070edbc5101677c6eebd3707492c824..55f1482d1d9ce52e104481bab3ede373f47aee0c 100644
>>>> --- a/profiles/audio/media.c
>>>> +++ b/profiles/audio/media.c
>>>> @@ -499,37 +499,6 @@ struct a2dp_config_data {
>>>> a2dp_endpoint_config_t cb;
>>>> };
>>>>
>>>> -int8_t media_player_get_device_volume(struct btd_device *device)
>>>> -{
>>>> -#ifdef HAVE_AVRCP
>>>> - struct avrcp_player *target_player;
>>>> - struct media_adapter *adapter;
>>>> - GSList *l;
>>>> -
>>>> - if (!device)
>>>> - return -1;
>>>> -
>>>> - target_player = avrcp_get_target_player_by_device(device);
>>>> - if (!target_player)
>>>> - goto done;
>>>> -
>>>> - adapter = find_adapter(device);
>>>> - if (!adapter)
>>>> - goto done;
>>>> -
>>>> - for (l = adapter->players; l; l = l->next) {
>>>> - struct media_player *mp = l->data;
>>>> -
>>>> - if (mp->player == target_player)
>>>> - return mp->volume;
>> The `avrcp_player` object indeed is not shared between devices, but the
>> volume is acquired from (and set for) the associated `media_player`
>> object which is not tied to a specific device, and corresponds to client
>> `org.mpris.MediaPlayer2.Player` objects.
> Ok, so what is the problem with that? If there are 2 headsets that
> wants to control the same player registered via mpris-proxy(?) that
> should be allowed, or the problem is that each device should control a
> dedicated instance of the volume? I suspect the volume store in
> mp->volume is only used as initial volume since the actual volume is
I searched the codebase for all usages of `mp->volume` and seems like
this is solely used as a temporary storage for the initial volume. This
usage was first introduced in 4b6153b0501cf18812cb869c2320c41e51f81adc
and the field itself was introduced in
a282fff97dabbd3a814765a868e3367cb3dc1ce3 (with unclear purposes).
> stored in the Transport.Volume, the reason why we can't use the
> Transport directly is that it is created on demand while there is a
> stream so if the stream is not ready at time a volume has been set we
> need to store it elsewhere, that said perhaps that should be store per
> device not per media_player which seem to be registered per adapter in
> media.c but then we should probably remove the volume field altogether
> to avoid any confusion in the future.
>
>>>> - }
>>>> -
>>>> -done:
>>>> -#endif /* HAVE_AVRCP */
>>>> - /* If media_player doesn't exists use device_volume */
>>>> - return btd_device_get_volume(device);
>>>> -}
>>>> -
>>>> static gboolean set_configuration(struct media_endpoint *endpoint,
>>>> uint8_t *configuration, size_t size,
>>>> media_endpoint_cb_t cb,
>>>> @@ -556,7 +525,7 @@ static gboolean set_configuration(struct media_endpoint *endpoint,
>>>> if (transport == NULL)
>>>> return FALSE;
>>>>
>>>> - init_volume = media_player_get_device_volume(device);
>>>> + init_volume = btd_device_get_volume(device);
>>>> media_transport_update_volume(transport, init_volume);
>>>>
>>>> msg = dbus_message_new_method_call(endpoint->sender, endpoint->path,
>>>> diff --git a/profiles/audio/media.h b/profiles/audio/media.h
>>>> index 2b2e8e1572874d5f71abb28fdd5b92fa2d9efe83..d3954abd6de505a69cab3fcffc217d236a52d3e5 100644
>>>> --- a/profiles/audio/media.h
>>>> +++ b/profiles/audio/media.h
>>>> @@ -23,6 +23,5 @@ uint8_t media_endpoint_get_codec(struct media_endpoint *endpoint);
>>>> struct btd_adapter *media_endpoint_get_btd_adapter(
>>>> struct media_endpoint *endpoint);
>>>> bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
>>>> -int8_t media_player_get_device_volume(struct btd_device *device);
>>>>
>>>> const struct media_endpoint *media_endpoint_get_asha(void);
>>>>
>>>> ---
>>>> base-commit: 2c0c323d08357a4ff3065fcd49fee0c83b5835cd
>>>> change-id: 20250805-audio-no-reuse-media-player-volume-fbc2983a287a
>>>>
>>>> Best regards,
>>>> --
>>>> Myrrh Periwinkle<myrrhperiwinkle@qtmlabs.xyz>
>>>>
>>>>
-Myrrh
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bluez] audio: Don't initialize device volume from media player
2025-08-05 16:08 ` Myrrh Periwinkle
@ 2025-08-06 0:50 ` Myrrh Periwinkle
0 siblings, 0 replies; 8+ messages in thread
From: Myrrh Periwinkle @ 2025-08-06 0:50 UTC (permalink / raw)
To: Luiz Augusto von Dentz; +Cc: Linux Bluetooth
On 8/5/25 23:08, Myrrh Periwinkle wrote:
> Hi,
>
> On 8/5/25 23:01, Luiz Augusto von Dentz wrote:
>> Hi Myrrh,
>>
>> On Tue, Aug 5, 2025 at 11:34 AM Myrrh Periwinkle
>> <myrrhperiwinkle@qtmlabs.xyz> wrote:
>>> Resent because I forgot to use "Reply All"
>>>
>>> On 8/5/25 22:24, Luiz Augusto von Dentz wrote:
>>>> Hi Myrrh,
>>>>
>>>> On Tue, Aug 5, 2025 at 6:29 AM Myrrh Periwinkle
>>>> <myrrhperiwinkle@qtmlabs.xyz> wrote:
>>>>> Media player objects may be shared between devices. As a result,
>>>>> a device without support for hardware volume that is connected
>>>>> after one
>>>>> that does may end up being erroneously considered hardware
>>>>> volume-capable.
>>>> Don't quite follow, avrcp_player is per device, not sure how it can be
>>>> shared between devices?
>>>>
>>>>> fa7828bdd ("transport: Fix not being able to initialize volume
>>>>> properly")
>>>>> introduced btd_device_{get,set}_volume that is used as an
>>>>> alternative in
>>>>> case no media player objects are present. Therefore, we can remove
>>>>> media_player_get_device_volume and instead use
>>>>> btd_device_get_volume to
>>>>> determine the initial volume.
>>>> Don't follow you here, why shouldn;t we use the media player if we
>>>> have one?
>>>>
>>>>> ---
>>>>> profiles/audio/avrcp.c | 2 +-
>>>>> profiles/audio/media.c | 33 +--------------------------------
>>>>> profiles/audio/media.h | 1 -
>>>>> 3 files changed, 2 insertions(+), 34 deletions(-)
>>>>>
>>>>> diff --git a/profiles/audio/avrcp.c b/profiles/audio/avrcp.c
>>>>> index
>>>>> e2797112fcd580c3fc56793f933e00b1c61e5205..ec07522e6a34eb1dc5f6f413f48f1087a609df9a
>>>>> 100644
>>>>> --- a/profiles/audio/avrcp.c
>>>>> +++ b/profiles/audio/avrcp.c
>>>>> @@ -4284,7 +4284,7 @@ static void target_init(struct avrcp *session)
>>>>> target->player = player;
>>>>> player->sessions =
>>>>> g_slist_prepend(player->sessions, session);
>>>>>
>>>>> - init_volume =
>>>>> media_player_get_device_volume(session->dev);
>>>>> + init_volume = btd_device_get_volume(session->dev);
>>>>> media_transport_update_device_volume(session->dev, init_volume);
>>>>> }
>>>>>
>>>>> diff --git a/profiles/audio/media.c b/profiles/audio/media.c
>>>>> index
>>>>> 8e62dca17070edbc5101677c6eebd3707492c824..55f1482d1d9ce52e104481bab3ede373f47aee0c
>>>>> 100644
>>>>> --- a/profiles/audio/media.c
>>>>> +++ b/profiles/audio/media.c
>>>>> @@ -499,37 +499,6 @@ struct a2dp_config_data {
>>>>> a2dp_endpoint_config_t cb;
>>>>> };
>>>>>
>>>>> -int8_t media_player_get_device_volume(struct btd_device *device)
>>>>> -{
>>>>> -#ifdef HAVE_AVRCP
>>>>> - struct avrcp_player *target_player;
>>>>> - struct media_adapter *adapter;
>>>>> - GSList *l;
>>>>> -
>>>>> - if (!device)
>>>>> - return -1;
>>>>> -
>>>>> - target_player = avrcp_get_target_player_by_device(device);
>>>>> - if (!target_player)
>>>>> - goto done;
>>>>> -
>>>>> - adapter = find_adapter(device);
>>>>> - if (!adapter)
>>>>> - goto done;
>>>>> -
>>>>> - for (l = adapter->players; l; l = l->next) {
>>>>> - struct media_player *mp = l->data;
>>>>> -
>>>>> - if (mp->player == target_player)
>>>>> - return mp->volume;
>>> The `avrcp_player` object indeed is not shared between devices, but the
>>> volume is acquired from (and set for) the associated `media_player`
>>> object which is not tied to a specific device, and corresponds to
>>> client
>>> `org.mpris.MediaPlayer2.Player` objects.
>> Ok, so what is the problem with that? If there are 2 headsets that
>> wants to control the same player registered via mpris-proxy(?) that
>> should be allowed, or the problem is that each device should control a
>> dedicated instance of the volume? I suspect the volume store in
>> mp->volume is only used as initial volume since the actual volume is
>
> I searched the codebase for all usages of `mp->volume` and seems like
> this is solely used as a temporary storage for the initial volume.
> This usage was first introduced in
> 4b6153b0501cf18812cb869c2320c41e51f81adc and the field itself was
> introduced in a282fff97dabbd3a814765a868e3367cb3dc1ce3 (with unclear
> purposes).
>
>> stored in the Transport.Volume, the reason why we can't use the
>> Transport directly is that it is created on demand while there is a
>> stream so if the stream is not ready at time a volume has been set we
>> need to store it elsewhere, that said perhaps that should be store per
>> device not per media_player which seem to be registered per adapter in
>> media.c but then we should probably remove the volume field altogether
>> to avoid any confusion in the future.
For some additional context: This issue only started happening when I
started using mpris-proxy. Without mpris-proxy the device without
hardware volume support is always recognized as such. What I believe is
happening is that the volume for the first device with hardware volume
support is set on the media_player object which is then used as the
initial volume for the second device that doesn't have hardware volume.
I will soon send a v2 that removes the media_player.volume field
entirely since it doesn't appear to be used for anything else.
>>
>>>>> - }
>>>>> -
>>>>> -done:
>>>>> -#endif /* HAVE_AVRCP */
>>>>> - /* If media_player doesn't exists use device_volume */
>>>>> - return btd_device_get_volume(device);
>>>>> -}
>>>>> -
>>>>> static gboolean set_configuration(struct media_endpoint *endpoint,
>>>>> uint8_t *configuration,
>>>>> size_t size,
>>>>> media_endpoint_cb_t cb,
>>>>> @@ -556,7 +525,7 @@ static gboolean set_configuration(struct
>>>>> media_endpoint *endpoint,
>>>>> if (transport == NULL)
>>>>> return FALSE;
>>>>>
>>>>> - init_volume = media_player_get_device_volume(device);
>>>>> + init_volume = btd_device_get_volume(device);
>>>>> media_transport_update_volume(transport, init_volume);
>>>>>
>>>>> msg = dbus_message_new_method_call(endpoint->sender,
>>>>> endpoint->path,
>>>>> diff --git a/profiles/audio/media.h b/profiles/audio/media.h
>>>>> index
>>>>> 2b2e8e1572874d5f71abb28fdd5b92fa2d9efe83..d3954abd6de505a69cab3fcffc217d236a52d3e5
>>>>> 100644
>>>>> --- a/profiles/audio/media.h
>>>>> +++ b/profiles/audio/media.h
>>>>> @@ -23,6 +23,5 @@ uint8_t media_endpoint_get_codec(struct
>>>>> media_endpoint *endpoint);
>>>>> struct btd_adapter *media_endpoint_get_btd_adapter(
>>>>> struct media_endpoint
>>>>> *endpoint);
>>>>> bool media_endpoint_is_broadcast(struct media_endpoint *endpoint);
>>>>> -int8_t media_player_get_device_volume(struct btd_device *device);
>>>>>
>>>>> const struct media_endpoint *media_endpoint_get_asha(void);
>>>>>
>>>>> ---
>>>>> base-commit: 2c0c323d08357a4ff3065fcd49fee0c83b5835cd
>>>>> change-id: 20250805-audio-no-reuse-media-player-volume-fbc2983a287a
>>>>>
>>>>> Best regards,
>>>>> --
>>>>> Myrrh Periwinkle<myrrhperiwinkle@qtmlabs.xyz>
>>>>>
>>>>>
> -Myrrh
-Myrrh
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH bluez] audio: Don't initialize device volume from media player
2025-08-05 10:21 [PATCH bluez] audio: Don't initialize device volume from media player Myrrh Periwinkle
2025-08-05 12:02 ` [bluez] " bluez.test.bot
2025-08-05 15:24 ` [PATCH bluez] " Luiz Augusto von Dentz
@ 2025-08-12 18:10 ` patchwork-bot+bluetooth
2 siblings, 0 replies; 8+ messages in thread
From: patchwork-bot+bluetooth @ 2025-08-12 18:10 UTC (permalink / raw)
To: Myrrh Periwinkle; +Cc: linux-bluetooth
Hello:
This patch was applied to bluetooth/bluez.git (master)
by Luiz Augusto von Dentz <luiz.von.dentz@intel.com>:
On Tue, 05 Aug 2025 17:21:28 +0700 you wrote:
> Media player objects may be shared between devices. As a result,
> a device without support for hardware volume that is connected after one
> that does may end up being erroneously considered hardware
> volume-capable.
>
> fa7828bdd ("transport: Fix not being able to initialize volume properly")
> introduced btd_device_{get,set}_volume that is used as an alternative in
> case no media player objects are present. Therefore, we can remove
> media_player_get_device_volume and instead use btd_device_get_volume to
> determine the initial volume.
>
> [...]
Here is the summary with links:
- [bluez] audio: Don't initialize device volume from media player
https://git.kernel.org/pub/scm/bluetooth/bluez.git/?id=5db6d2fef66f
You are awesome, thank you!
--
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2025-08-12 18:09 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-05 10:21 [PATCH bluez] audio: Don't initialize device volume from media player Myrrh Periwinkle
2025-08-05 12:02 ` [bluez] " bluez.test.bot
2025-08-05 15:24 ` [PATCH bluez] " Luiz Augusto von Dentz
2025-08-05 15:34 ` Myrrh Periwinkle
2025-08-05 16:01 ` Luiz Augusto von Dentz
2025-08-05 16:08 ` Myrrh Periwinkle
2025-08-06 0:50 ` Myrrh Periwinkle
2025-08-12 18:10 ` patchwork-bot+bluetooth
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox