diff options
| -rw-r--r-- | meta/recipes-multimedia/pulseaudio/pulseaudio/0001-bluetooth-don-t-create-the-HSP-HFP-profile-twice.patch | 343 | ||||
| -rw-r--r-- | meta/recipes-multimedia/pulseaudio/pulseaudio_8.0.bb | 1 |
2 files changed, 344 insertions, 0 deletions
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-bluetooth-don-t-create-the-HSP-HFP-profile-twice.patch b/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-bluetooth-don-t-create-the-HSP-HFP-profile-twice.patch new file mode 100644 index 0000000000..a5ca325ba8 --- /dev/null +++ b/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-bluetooth-don-t-create-the-HSP-HFP-profile-twice.patch | |||
| @@ -0,0 +1,343 @@ | |||
| 1 | From 14ff15bf5acac7b7edd64e2240fc6fe5d227b8c4 Mon Sep 17 00:00:00 2001 | ||
| 2 | From: Tanu Kaskinen <tanuk@iki.fi> | ||
| 3 | Date: Sun, 31 Jul 2016 01:03:02 +0300 | ||
| 4 | Subject: [PATCH] bluetooth: don't create the HSP/HFP profile twice | ||
| 5 | |||
| 6 | create_card_profile() used to get called separately for HSP and HFP, | ||
| 7 | so if a headset supports both profiles, a profile named | ||
| 8 | "headset_head_unit" would get created twice. The second instance would | ||
| 9 | get immediately freed, so that wasn't a particularly serious problem. | ||
| 10 | However, I think it makes more sense to create the profile only once. | ||
| 11 | This patch makes things so that before a profile is created, we check | ||
| 12 | what name that profile would have, and if a profile with that name | ||
| 13 | already exists, we don't create the profile. | ||
| 14 | |||
| 15 | A couple of Yocto releases (jethro and krogoth) have non-upstream | ||
| 16 | patches that suffer from this double creation. The patches add | ||
| 17 | associations between profiles and ports, and those associations use | ||
| 18 | the profile name as the key. When the second profile gets freed, the | ||
| 19 | associations between the profile and its ports get removed, and since | ||
| 20 | the profile name is used as the key, this erroneously affects the | ||
| 21 | first profile too. Crashing ensues. | ||
| 22 | |||
| 23 | I have tested this only with BlueZ 5. | ||
| 24 | |||
| 25 | BugLink: https://bugzilla.yoctoproject.org/show_bug.cgi?id=10018 | ||
| 26 | |||
| 27 | Upstream-Status: Submitted [https://patchwork.freedesktop.org/patch/101926/] | ||
| 28 | |||
| 29 | Signed-off-by: Tanu Kaskinen <tanuk@iki.fi> | ||
| 30 | --- | ||
| 31 | src/modules/bluetooth/module-bluez4-device.c | 81 +++++++++++++++++----------- | ||
| 32 | src/modules/bluetooth/module-bluez5-device.c | 72 ++++++++++++++++--------- | ||
| 33 | 2 files changed, 99 insertions(+), 54 deletions(-) | ||
| 34 | |||
| 35 | diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c | ||
| 36 | index 5d0d3db..df51168 100644 | ||
| 37 | --- a/src/modules/bluetooth/module-bluez4-device.c | ||
| 38 | +++ b/src/modules/bluetooth/module-bluez4-device.c | ||
| 39 | @@ -2162,18 +2162,23 @@ static void create_card_ports(struct userdata *u, pa_hashmap *ports) { | ||
| 40 | } | ||
| 41 | |||
| 42 | /* Run from main thread */ | ||
| 43 | -static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid, pa_hashmap *ports) { | ||
| 44 | +static pa_card_profile *create_card_profile(struct userdata *u, pa_bluez4_profile_t profile, pa_hashmap *ports) { | ||
| 45 | pa_device_port *input_port, *output_port; | ||
| 46 | + const char *name; | ||
| 47 | pa_card_profile *p = NULL; | ||
| 48 | - pa_bluez4_profile_t *d; | ||
| 49 | + pa_bluez4_profile_t *d = NULL; | ||
| 50 | + pa_bluez4_transport *t; | ||
| 51 | |||
| 52 | pa_assert(u->input_port_name); | ||
| 53 | pa_assert(u->output_port_name); | ||
| 54 | pa_assert_se(input_port = pa_hashmap_get(ports, u->input_port_name)); | ||
| 55 | pa_assert_se(output_port = pa_hashmap_get(ports, u->output_port_name)); | ||
| 56 | |||
| 57 | - if (pa_streq(uuid, A2DP_SINK_UUID)) { | ||
| 58 | - p = pa_card_profile_new("a2dp", _("High Fidelity Playback (A2DP)"), sizeof(pa_bluez4_profile_t)); | ||
| 59 | + name = pa_bluez4_profile_to_string(profile); | ||
| 60 | + | ||
| 61 | + switch (profile) { | ||
| 62 | + case PA_BLUEZ4_PROFILE_A2DP: | ||
| 63 | + p = pa_card_profile_new(name, _("High Fidelity Playback (A2DP)"), sizeof(pa_bluez4_profile_t)); | ||
| 64 | p->priority = 10; | ||
| 65 | p->n_sinks = 1; | ||
| 66 | p->n_sources = 0; | ||
| 67 | @@ -2183,9 +2188,10 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 68 | pa_card_profile_add_port(p, output_port); | ||
| 69 | |||
| 70 | d = PA_CARD_PROFILE_DATA(p); | ||
| 71 | - *d = PA_BLUEZ4_PROFILE_A2DP; | ||
| 72 | - } else if (pa_streq(uuid, A2DP_SOURCE_UUID)) { | ||
| 73 | - p = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP)"), sizeof(pa_bluez4_profile_t)); | ||
| 74 | + break; | ||
| 75 | + | ||
| 76 | + case PA_BLUEZ4_PROFILE_A2DP_SOURCE: | ||
| 77 | + p = pa_card_profile_new(name, _("High Fidelity Capture (A2DP)"), sizeof(pa_bluez4_profile_t)); | ||
| 78 | p->priority = 10; | ||
| 79 | p->n_sinks = 0; | ||
| 80 | p->n_sources = 1; | ||
| 81 | @@ -2195,9 +2201,10 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 82 | pa_card_profile_add_port(p, input_port); | ||
| 83 | |||
| 84 | d = PA_CARD_PROFILE_DATA(p); | ||
| 85 | - *d = PA_BLUEZ4_PROFILE_A2DP_SOURCE; | ||
| 86 | - } else if (pa_streq(uuid, HSP_HS_UUID) || pa_streq(uuid, HFP_HS_UUID)) { | ||
| 87 | - p = pa_card_profile_new("hsp", _("Telephony Duplex (HSP/HFP)"), sizeof(pa_bluez4_profile_t)); | ||
| 88 | + break; | ||
| 89 | + | ||
| 90 | + case PA_BLUEZ4_PROFILE_HSP: | ||
| 91 | + p = pa_card_profile_new(name, _("Telephony Duplex (HSP/HFP)"), sizeof(pa_bluez4_profile_t)); | ||
| 92 | p->priority = 20; | ||
| 93 | p->n_sinks = 1; | ||
| 94 | p->n_sources = 1; | ||
| 95 | @@ -2209,9 +2216,10 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 96 | pa_card_profile_add_port(p, output_port); | ||
| 97 | |||
| 98 | d = PA_CARD_PROFILE_DATA(p); | ||
| 99 | - *d = PA_BLUEZ4_PROFILE_HSP; | ||
| 100 | - } else if (pa_streq(uuid, HFP_AG_UUID)) { | ||
| 101 | - p = pa_card_profile_new("hfgw", _("Handsfree Gateway"), sizeof(pa_bluez4_profile_t)); | ||
| 102 | + break; | ||
| 103 | + | ||
| 104 | + case PA_BLUEZ4_PROFILE_HFGW: | ||
| 105 | + p = pa_card_profile_new(name, _("Handsfree Gateway"), sizeof(pa_bluez4_profile_t)); | ||
| 106 | p->priority = 20; | ||
| 107 | p->n_sinks = 1; | ||
| 108 | p->n_sources = 1; | ||
| 109 | @@ -2223,19 +2231,35 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 110 | pa_card_profile_add_port(p, output_port); | ||
| 111 | |||
| 112 | d = PA_CARD_PROFILE_DATA(p); | ||
| 113 | - *d = PA_BLUEZ4_PROFILE_HFGW; | ||
| 114 | + break; | ||
| 115 | + | ||
| 116 | + case PA_BLUEZ4_PROFILE_OFF: | ||
| 117 | + pa_assert_not_reached(); | ||
| 118 | } | ||
| 119 | |||
| 120 | - if (p) { | ||
| 121 | - pa_bluez4_transport *t; | ||
| 122 | + *d = profile; | ||
| 123 | |||
| 124 | - if ((t = u->device->transports[*d])) | ||
| 125 | - p->available = transport_state_to_availability(t->state); | ||
| 126 | - } | ||
| 127 | + if ((t = u->device->transports[*d])) | ||
| 128 | + p->available = transport_state_to_availability(t->state); | ||
| 129 | |||
| 130 | return p; | ||
| 131 | } | ||
| 132 | |||
| 133 | +static int uuid_to_profile(const char *uuid, pa_bluez4_profile_t *_r) { | ||
| 134 | + if (pa_streq(uuid, A2DP_SINK_UUID)) | ||
| 135 | + *_r = PA_BLUEZ4_PROFILE_A2DP; | ||
| 136 | + else if (pa_streq(uuid, A2DP_SOURCE_UUID)) | ||
| 137 | + *_r = PA_BLUEZ4_PROFILE_A2DP_SOURCE; | ||
| 138 | + else if (pa_streq(uuid, HSP_HS_UUID) || pa_streq(uuid, HFP_HS_UUID)) | ||
| 139 | + *_r = PA_BLUEZ4_PROFILE_HSP; | ||
| 140 | + else if (pa_streq(uuid, HSP_AG_UUID) || pa_streq(uuid, HFP_AG_UUID)) | ||
| 141 | + *_r = PA_BLUEZ4_PROFILE_HFGW; | ||
| 142 | + else | ||
| 143 | + return -PA_ERR_INVALID; | ||
| 144 | + | ||
| 145 | + return 0; | ||
| 146 | +} | ||
| 147 | + | ||
| 148 | /* Run from main thread */ | ||
| 149 | static int add_card(struct userdata *u) { | ||
| 150 | pa_card_new_data data; | ||
| 151 | @@ -2283,16 +2307,15 @@ static int add_card(struct userdata *u) { | ||
| 152 | create_card_ports(u, data.ports); | ||
| 153 | |||
| 154 | PA_LLIST_FOREACH(uuid, device->uuids) { | ||
| 155 | - p = create_card_profile(u, uuid->uuid, data.ports); | ||
| 156 | + pa_bluez4_profile_t profile; | ||
| 157 | |||
| 158 | - if (!p) | ||
| 159 | + if (uuid_to_profile(uuid->uuid, &profile) < 0) | ||
| 160 | continue; | ||
| 161 | |||
| 162 | - if (pa_hashmap_get(data.profiles, p->name)) { | ||
| 163 | - pa_card_profile_free(p); | ||
| 164 | + if (pa_hashmap_get(data.profiles, pa_bluez4_profile_to_string(profile))) | ||
| 165 | continue; | ||
| 166 | - } | ||
| 167 | |||
| 168 | + p = create_card_profile(u, profile, data.ports); | ||
| 169 | pa_hashmap_put(data.profiles, p->name, p); | ||
| 170 | } | ||
| 171 | |||
| 172 | @@ -2382,6 +2405,7 @@ static pa_bluez4_device* find_device(struct userdata *u, const char *address, co | ||
| 173 | /* Run from main thread */ | ||
| 174 | static pa_hook_result_t uuid_added_cb(pa_bluez4_discovery *y, const struct pa_bluez4_hook_uuid_data *data, | ||
| 175 | struct userdata *u) { | ||
| 176 | + pa_bluez4_profile_t profile; | ||
| 177 | pa_card_profile *p; | ||
| 178 | |||
| 179 | pa_assert(data); | ||
| 180 | @@ -2392,16 +2416,13 @@ static pa_hook_result_t uuid_added_cb(pa_bluez4_discovery *y, const struct pa_bl | ||
| 181 | if (data->device != u->device) | ||
| 182 | return PA_HOOK_OK; | ||
| 183 | |||
| 184 | - p = create_card_profile(u, data->uuid, u->card->ports); | ||
| 185 | - | ||
| 186 | - if (!p) | ||
| 187 | + if (uuid_to_profile(data->uuid, &profile) < 0) | ||
| 188 | return PA_HOOK_OK; | ||
| 189 | |||
| 190 | - if (pa_hashmap_get(u->card->profiles, p->name)) { | ||
| 191 | - pa_card_profile_free(p); | ||
| 192 | + if (pa_hashmap_get(u->card->profiles, pa_bluez4_profile_to_string(profile))) | ||
| 193 | return PA_HOOK_OK; | ||
| 194 | - } | ||
| 195 | |||
| 196 | + p = create_card_profile(u, profile, u->card->ports); | ||
| 197 | pa_card_add_profile(u->card, p); | ||
| 198 | |||
| 199 | return PA_HOOK_OK; | ||
| 200 | diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c | ||
| 201 | index 7b90a31..db06ac1 100644 | ||
| 202 | --- a/src/modules/bluetooth/module-bluez5-device.c | ||
| 203 | +++ b/src/modules/bluetooth/module-bluez5-device.c | ||
| 204 | @@ -1772,8 +1772,9 @@ static void create_card_ports(struct userdata *u, pa_hashmap *ports) { | ||
| 205 | } | ||
| 206 | |||
| 207 | /* Run from main thread */ | ||
| 208 | -static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid, pa_hashmap *ports) { | ||
| 209 | +static pa_card_profile *create_card_profile(struct userdata *u, pa_bluetooth_profile_t profile, pa_hashmap *ports) { | ||
| 210 | pa_device_port *input_port, *output_port; | ||
| 211 | + const char *name; | ||
| 212 | pa_card_profile *cp = NULL; | ||
| 213 | pa_bluetooth_profile_t *p; | ||
| 214 | |||
| 215 | @@ -1782,8 +1783,11 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 216 | pa_assert_se(input_port = pa_hashmap_get(ports, u->input_port_name)); | ||
| 217 | pa_assert_se(output_port = pa_hashmap_get(ports, u->output_port_name)); | ||
| 218 | |||
| 219 | - if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SINK)) { | ||
| 220 | - cp = pa_card_profile_new("a2dp_sink", _("High Fidelity Playback (A2DP Sink)"), sizeof(pa_bluetooth_profile_t)); | ||
| 221 | + name = pa_bluetooth_profile_to_string(profile); | ||
| 222 | + | ||
| 223 | + switch (profile) { | ||
| 224 | + case PA_BLUETOOTH_PROFILE_A2DP_SINK: | ||
| 225 | + cp = pa_card_profile_new(name, _("High Fidelity Playback (A2DP Sink)"), sizeof(pa_bluetooth_profile_t)); | ||
| 226 | cp->priority = 10; | ||
| 227 | cp->n_sinks = 1; | ||
| 228 | cp->n_sources = 0; | ||
| 229 | @@ -1793,9 +1797,10 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 230 | pa_card_profile_add_port(cp, output_port); | ||
| 231 | |||
| 232 | p = PA_CARD_PROFILE_DATA(cp); | ||
| 233 | - *p = PA_BLUETOOTH_PROFILE_A2DP_SINK; | ||
| 234 | - } else if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE)) { | ||
| 235 | - cp = pa_card_profile_new("a2dp_source", _("High Fidelity Capture (A2DP Source)"), sizeof(pa_bluetooth_profile_t)); | ||
| 236 | + break; | ||
| 237 | + | ||
| 238 | + case PA_BLUETOOTH_PROFILE_A2DP_SOURCE: | ||
| 239 | + cp = pa_card_profile_new(name, _("High Fidelity Capture (A2DP Source)"), sizeof(pa_bluetooth_profile_t)); | ||
| 240 | cp->priority = 10; | ||
| 241 | cp->n_sinks = 0; | ||
| 242 | cp->n_sources = 1; | ||
| 243 | @@ -1805,9 +1810,10 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 244 | pa_card_profile_add_port(cp, input_port); | ||
| 245 | |||
| 246 | p = PA_CARD_PROFILE_DATA(cp); | ||
| 247 | - *p = PA_BLUETOOTH_PROFILE_A2DP_SOURCE; | ||
| 248 | - } else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF)) { | ||
| 249 | - cp = pa_card_profile_new("headset_head_unit", _("Headset Head Unit (HSP/HFP)"), sizeof(pa_bluetooth_profile_t)); | ||
| 250 | + break; | ||
| 251 | + | ||
| 252 | + case PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT: | ||
| 253 | + cp = pa_card_profile_new(name, _("Headset Head Unit (HSP/HFP)"), sizeof(pa_bluetooth_profile_t)); | ||
| 254 | cp->priority = 20; | ||
| 255 | cp->n_sinks = 1; | ||
| 256 | cp->n_sources = 1; | ||
| 257 | @@ -1819,9 +1825,10 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 258 | pa_card_profile_add_port(cp, output_port); | ||
| 259 | |||
| 260 | p = PA_CARD_PROFILE_DATA(cp); | ||
| 261 | - *p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT; | ||
| 262 | - } else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_AG) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_AG)) { | ||
| 263 | - cp = pa_card_profile_new("headset_audio_gateway", _("Headset Audio Gateway (HSP/HFP)"), sizeof(pa_bluetooth_profile_t)); | ||
| 264 | + break; | ||
| 265 | + | ||
| 266 | + case PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY: | ||
| 267 | + cp = pa_card_profile_new(name, _("Headset Audio Gateway (HSP/HFP)"), sizeof(pa_bluetooth_profile_t)); | ||
| 268 | cp->priority = 20; | ||
| 269 | cp->n_sinks = 1; | ||
| 270 | cp->n_sources = 1; | ||
| 271 | @@ -1833,16 +1840,19 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid | ||
| 272 | pa_card_profile_add_port(cp, output_port); | ||
| 273 | |||
| 274 | p = PA_CARD_PROFILE_DATA(cp); | ||
| 275 | - *p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY; | ||
| 276 | - } | ||
| 277 | + break; | ||
| 278 | |||
| 279 | - if (cp) { | ||
| 280 | - if (u->device->transports[*p]) | ||
| 281 | - cp->available = transport_state_to_availability(u->device->transports[*p]->state); | ||
| 282 | - else | ||
| 283 | - cp->available = PA_AVAILABLE_NO; | ||
| 284 | + case PA_BLUETOOTH_PROFILE_OFF: | ||
| 285 | + pa_assert_not_reached(); | ||
| 286 | } | ||
| 287 | |||
| 288 | + *p = profile; | ||
| 289 | + | ||
| 290 | + if (u->device->transports[*p]) | ||
| 291 | + cp->available = transport_state_to_availability(u->device->transports[*p]->state); | ||
| 292 | + else | ||
| 293 | + cp->available = PA_AVAILABLE_NO; | ||
| 294 | + | ||
| 295 | return cp; | ||
| 296 | } | ||
| 297 | |||
| 298 | @@ -1888,6 +1898,21 @@ off: | ||
| 299 | return -PA_ERR_IO; | ||
| 300 | } | ||
| 301 | |||
| 302 | +static int uuid_to_profile(const char *uuid, pa_bluetooth_profile_t *_r) { | ||
| 303 | + if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SINK)) | ||
| 304 | + *_r = PA_BLUETOOTH_PROFILE_A2DP_SINK; | ||
| 305 | + else if (pa_streq(uuid, PA_BLUETOOTH_UUID_A2DP_SOURCE)) | ||
| 306 | + *_r = PA_BLUETOOTH_PROFILE_A2DP_SOURCE; | ||
| 307 | + else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_HS) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_HF)) | ||
| 308 | + *_r = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT; | ||
| 309 | + else if (pa_streq(uuid, PA_BLUETOOTH_UUID_HSP_AG) || pa_streq(uuid, PA_BLUETOOTH_UUID_HFP_AG)) | ||
| 310 | + *_r = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY; | ||
| 311 | + else | ||
| 312 | + return -PA_ERR_INVALID; | ||
| 313 | + | ||
| 314 | + return 0; | ||
| 315 | +} | ||
| 316 | + | ||
| 317 | /* Run from main thread */ | ||
| 318 | static int add_card(struct userdata *u) { | ||
| 319 | const pa_bluetooth_device *d; | ||
| 320 | @@ -1929,16 +1954,15 @@ static int add_card(struct userdata *u) { | ||
| 321 | create_card_ports(u, data.ports); | ||
| 322 | |||
| 323 | PA_HASHMAP_FOREACH(uuid, d->uuids, state) { | ||
| 324 | - cp = create_card_profile(u, uuid, data.ports); | ||
| 325 | + pa_bluetooth_profile_t profile; | ||
| 326 | |||
| 327 | - if (!cp) | ||
| 328 | + if (uuid_to_profile(uuid, &profile) < 0) | ||
| 329 | continue; | ||
| 330 | |||
| 331 | - if (pa_hashmap_get(data.profiles, cp->name)) { | ||
| 332 | - pa_card_profile_free(cp); | ||
| 333 | + if (pa_hashmap_get(data.profiles, pa_bluetooth_profile_to_string(profile))) | ||
| 334 | continue; | ||
| 335 | - } | ||
| 336 | |||
| 337 | + cp = create_card_profile(u, profile, data.ports); | ||
| 338 | pa_hashmap_put(data.profiles, cp->name, cp); | ||
| 339 | } | ||
| 340 | |||
| 341 | -- | ||
| 342 | 2.8.1 | ||
| 343 | |||
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio_8.0.bb b/meta/recipes-multimedia/pulseaudio/pulseaudio_8.0.bb index b01ba8f689..b947c62812 100644 --- a/meta/recipes-multimedia/pulseaudio/pulseaudio_8.0.bb +++ b/meta/recipes-multimedia/pulseaudio/pulseaudio_8.0.bb | |||
| @@ -9,6 +9,7 @@ SRC_URI = "http://freedesktop.org/software/pulseaudio/releases/${BP}.tar.xz \ | |||
| 9 | file://0003-card-move-profile-selection-after-pa_card_new.patch \ | 9 | file://0003-card-move-profile-selection-after-pa_card_new.patch \ |
| 10 | file://0004-alsa-set-availability-for-some-unavailable-profiles.patch \ | 10 | file://0004-alsa-set-availability-for-some-unavailable-profiles.patch \ |
| 11 | file://0001-Revert-module-switch-on-port-available-Route-to-pref.patch \ | 11 | file://0001-Revert-module-switch-on-port-available-Route-to-pref.patch \ |
| 12 | file://0001-bluetooth-don-t-create-the-HSP-HFP-profile-twice.patch \ | ||
| 12 | " | 13 | " |
| 13 | SRC_URI[md5sum] = "8678442ba0bb4b4c33ac6f62542962df" | 14 | SRC_URI[md5sum] = "8678442ba0bb4b4c33ac6f62542962df" |
| 14 | SRC_URI[sha256sum] = "690eefe28633466cfd1ab9d85ebfa9376f6b622deec6bfee5091ac9737cd1989" | 15 | SRC_URI[sha256sum] = "690eefe28633466cfd1ab9d85ebfa9376f6b622deec6bfee5091ac9737cd1989" |
