bluez5: move bluez-hardware.conf loading to the plugin

It's not really the responsibility of the session manager to load the
bluez5 device quirks, and it's easier for eg. Wireplumber if it doesn't
need to do it.

Move loading bluez-hardware.conf to be the responsibility of the bluez5
spa plugin, similarly as the alsa plugin deals with the ACP database.

Put the configuration to share/spa-0.2/bluez5, mirroring the plugin
directory structure in lib/spa-0.2/bluez5.
This commit is contained in:
Pauli Virtanen 2021-09-18 12:32:29 +03:00 committed by Wim Taymans
parent 6168067cb2
commit cae1554449
6 changed files with 84 additions and 28 deletions

View file

@ -1,95 +0,0 @@
# List of hardware/kernel features, which cannot be detected generically.
#
# The `feature` is enabled only if all three of adapter, device, and
# kernel have it.
#
# For each of the adapter/device/kernel, the match rules are processed
# one at a time, and the first one that matches is used.
#
# Features and tags:
# msbc "standard" mSBC (60 byte tx packet)
# msbc-alt1 USB adapters with mSBC in ALT1 setting (24 byte tx packet)
# msbc-alt1-rtl Realtek USB adapters with mSBC in ALT1 setting (24 byte tx packet)
# hw-volume AVRCP and HSP/HFP hardware volume support
# hw-volume-mic Functional HSP/HFP microphone volume support
# sbc-xq "nonstandard" SBC codec setting with better sound quality
#
# Features are disabled with the key "no-features" whose value is an
# array of strings in the match rule.
bluez5.features.device = [
# properties:
# - name
# - address ("ff:ff:ff:ff:ff:ff")
# - vendor-id ("bluetooth:ffff", "usb:ffff")
# - product-id
# - version-id
{ name = "Air 1 Plus", no-features = [ hw-volume-mic ] },
{ name = "AirPods", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ name = "AirPods Pro", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ name = "AXLOIE Goin", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ name = "BAA 100", no-features = [ hw-volume ] }, # Buxton BAA 100, doesn't remember volume, #pipewire-1449
{ name = "D50s", address = "~^00:13:ef:", no-features = [ hw-volume ] }, # volume has no effect, #pipewire-1562
{ name = "JBL Endurance RUN BT", no-features = [ msbc-alt1, msbc-alt1-rtl, sbc-xq ] },
{ name = "JBL LIVE650BTNC" },
{ name = "Motorola DC800", no-features = [ sbc-xq ] }, # #pipewire-1590
{ name = "Motorola S305", no-features = [ sbc-xq ] }, # #pipewire-1590
{ name = "Soundcore Life P2-L", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ name = "Urbanista Stockholm Plus", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ address = "~^94:16:25:", no-features = [ hw-volume ]}, # AirPods 2
{ address = "~^9c:64:8b:", no-features = [ hw-volume ]}, # AirPods 2
{ address = "~^a0:e9:db:", no-features = [ hw-volume ]}, # Ausdom M05
{ address = "~^0c:a6:94:", no-features = [ hw-volume ]}, # deepblue2
{ address = "~^00:14:02:", no-features = [ hw-volume ]}, # iKross IKBT83B HS
{ address = "~^44:5e:f3:", no-features = [ hw-volume ]}, # JayBird BlueBuds X
{ address = "~^d4:9c:28:", no-features = [ hw-volume ]}, # JayBird BlueBuds X
{ address = "~^00:18:6b:", no-features = [ hw-volume ]}, # LG Tone HBS-730
{ address = "~^b8:ad:3e:", no-features = [ hw-volume ]}, # LG Tone HBS-730
{ address = "~^a0:e9:db:", no-features = [ hw-volume ]}, # LG Tone HV-800
{ address = "~^00:24:1c:", no-features = [ hw-volume ]}, # Motorola Roadster
{ address = "~^00:11:b1:", no-features = [ hw-volume ]}, # Mpow Cheetah
{ address = "~^a4:15:66:", no-features = [ hw-volume ]}, # SOL REPUBLIC Tracks Air
{ address = "~^00:14:f1:", no-features = [ hw-volume ]}, # Swage Rokitboost HS
{ address = "~^00:26:7e:", no-features = [ hw-volume ]}, # VW Car Kit
{ address = "~^90:03:b7:", no-features = [ hw-volume ]}, # VW Car Kit
# All features are enabled by default; it's simpler to block non-working devices one by one.
]
bluez5.features.adapter = [
# properties:
# - address ("ff:ff:ff:ff:ff:ff")
# - bus-type ("usb", "other")
# - vendor-id ("usb:ffff")
# - product-id ("ffff")
# Realtek Semiconductor Corp.
{ bus-type = "usb", vendor-id = "usb:0bda" },
# Generic USB adapters
{ bus-type = "usb", no-features = [ msbc-alt1-rtl ] },
# Other adapters
{ no-features = [ msbc-alt1-rtl ] },
]
bluez5.features.kernel = [
# properties (as in uname):
# - sysname
# - release
# - version
# See https://lore.kernel.org/linux-bluetooth/20201210012003.133000-1-tpiepho@gmail.com/
# https://lore.kernel.org/linux-bluetooth/b86543908684cc6cd9afaf4de10fac7af1a49665.camel@iki.fi/
{ sysname = "Linux", release = "~^[0-4]\\.", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ sysname = "Linux", release = "~^5\\.[1-7]\\.", no-features = [ msbc-alt1, msbc-alt1-rtl ] },
{ sysname = "Linux", release = "~^5\\.(8|9)\\.", no-features = [ msbc-alt1 ] },
{ sysname = "Linux", release = "~^5\\.10\\.(1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|51|52|53|54|55|56|57|58|59|60|61)($|[^0-9])", no-features = [ msbc-alt1 ] },
{ sysname = "Linux", release = "~^5\\.12\\.(18|19)($|[^0-9])", no-features = [ msbc-alt1 ] },
{ sysname = "Linux", release = "~^5\\.13\\.(3|4|5|6|7|8|9|10|11|12|13)($|[^0-9])", no-features = [ msbc-alt1 ] },
{ sysname = "Linux", release = "~^5\\.14($|[^0-9])", no-features = [ msbc-alt1 ] },
{ no-features = [] },
]

View file

@ -1,5 +1,4 @@
conf_files = [
[ 'bluez-hardware.conf', 'bluez-hardware.conf' ],
[ 'bluez-monitor.conf', 'bluez-monitor.conf' ],
[ 'v4l2-monitor.conf', 'v4l2-monitor.conf' ],
[ 'media-session.conf', 'media-session.conf' ],

View file

@ -719,9 +719,7 @@ int sm_bluez5_monitor_start(struct sm_media_session *session)
{
int res;
struct impl *impl;
const char *key, *str;
struct pw_properties *hw_features = NULL;
void *state = NULL;
const char *str;
impl = calloc(1, sizeof(struct impl));
if (impl == NULL) {
@ -737,16 +735,9 @@ int sm_bluez5_monitor_start(struct sm_media_session *session)
res = -errno;
goto out_free;
}
if ((hw_features = pw_properties_new(NULL, NULL)) == NULL) {
res = -errno;
goto out_free;
}
if ((res = sm_media_session_load_conf(impl->session,
SESSION_CONF, impl->conf)) < 0)
pw_log_info("can't load "SESSION_CONF" config: %s", spa_strerror(res));
if ((res = sm_media_session_load_conf(impl->session,
FEATURES_CONF, hw_features)) < 0)
pw_log_info("can't load "FEATURES_CONF" config: %s", spa_strerror(res));
if ((impl->props = pw_properties_new(NULL, NULL)) == NULL) {
res = -errno;
@ -757,15 +748,6 @@ int sm_bluez5_monitor_start(struct sm_media_session *session)
pw_properties_set(impl->props, "api.bluez5.connection-info", "true");
while ((key = pw_properties_iterate(hw_features, &state)) != NULL) {
if (strncmp(key, "bluez5.features.", strlen("bluez5.features.")) != 0)
continue;
if ((str = pw_properties_get(hw_features, key)) != NULL)
pw_properties_set(impl->props, key, str);
}
pw_properties_free(hw_features);
sm_media_session_add_listener(session, &impl->session_listener,
&session_events, impl);
return 0;
@ -773,7 +755,6 @@ int sm_bluez5_monitor_start(struct sm_media_session *session)
out_free:
pw_properties_free(impl->conf);
pw_properties_free(impl->props);
pw_properties_free(hw_features);
free(impl);
out:
return res;