bumble 0.0.217__py3-none-any.whl → 0.0.218__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
bumble/_version.py CHANGED
@@ -28,7 +28,7 @@ version_tuple: VERSION_TUPLE
28
28
  commit_id: COMMIT_ID
29
29
  __commit_id__: COMMIT_ID
30
30
 
31
- __version__ = version = '0.0.217'
32
- __version_tuple__ = version_tuple = (0, 0, 217)
31
+ __version__ = version = '0.0.218'
32
+ __version_tuple__ = version_tuple = (0, 0, 218)
33
33
 
34
34
  __commit_id__ = commit_id = None
bumble/device.py CHANGED
@@ -2263,8 +2263,6 @@ class Device(utils.CompositeEventEmitter):
2263
2263
  EVENT_CONNECTION_FAILURE = "connection_failure"
2264
2264
  EVENT_SCO_REQUEST = "sco_request"
2265
2265
  EVENT_INQUIRY_COMPLETE = "inquiry_complete"
2266
- EVENT_REMOTE_NAME = "remote_name"
2267
- EVENT_REMOTE_NAME_FAILURE = "remote_name_failure"
2268
2266
  EVENT_SCO_CONNECTION = "sco_connection"
2269
2267
  EVENT_SCO_CONNECTION_FAILURE = "sco_connection_failure"
2270
2268
  EVENT_CIS_REQUEST = "cis_request"
@@ -4727,7 +4725,7 @@ class Device(utils.CompositeEventEmitter):
4727
4725
  self, cis_acl_pairs: Sequence[tuple[int, Connection]]
4728
4726
  ) -> list[CisLink]:
4729
4727
  for cis_handle, acl_connection in cis_acl_pairs:
4730
- cis_id, cig_id = self._pending_cis.pop(cis_handle)
4728
+ cis_id, cig_id = self._pending_cis[cis_handle]
4731
4729
  self.cis_links[cis_handle] = CisLink(
4732
4730
  device=self,
4733
4731
  acl_connection=acl_connection,
@@ -4743,6 +4741,7 @@ class Device(utils.CompositeEventEmitter):
4743
4741
  }
4744
4742
 
4745
4743
  def on_cis_establishment(cis_link: CisLink) -> None:
4744
+ self._pending_cis.pop(cis_link.handle)
4746
4745
  if pending_future := pending_cis_establishments.get(cis_link.handle):
4747
4746
  pending_future.set_result(cis_link)
4748
4747
 
@@ -49,6 +49,10 @@ async def get_driver_for_host(host: Host) -> Optional[Driver]:
49
49
  driver_classes: dict[str, type[Driver]] = {"rtk": rtk.Driver, "intel": intel.Driver}
50
50
  probe_list: Iterable[str]
51
51
  if driver_name := host.hci_metadata.get("driver"):
52
+ # The "driver" metadata may include runtime options after a '/' (for example
53
+ # "intel/ddc=..."). Keep only the base driver name (the portion before the
54
+ # first slash) so it matches a key in driver_classes (e.g. "intel").
55
+ driver_name = driver_name.split("/")[0]
52
56
  # Only probe a single driver
53
57
  probe_list = [driver_name]
54
58
  else:
bumble/drivers/intel.py CHANGED
@@ -459,6 +459,10 @@ class Driver(common.Driver):
459
459
  == ModeOfOperation.OPERATIONAL
460
460
  ):
461
461
  logger.debug("firmware already loaded")
462
+ # If the firmeare is already loaded, still attempt to load any
463
+ # device configuration (DDC). DDC can be applied independently of a
464
+ # firmware reload and may contain runtime overrides or patches.
465
+ await self.load_ddc_if_any()
462
466
  return
463
467
 
464
468
  # We only support some platforms and variants.
@@ -598,17 +602,39 @@ class Driver(common.Driver):
598
602
  await self.reset_complete.wait()
599
603
  logger.debug("reset complete")
600
604
 
601
- # Load the device config if there is one.
605
+ await self.load_ddc_if_any(firmware_base_name)
606
+
607
+ async def load_ddc_if_any(self, firmware_base_name: Optional[str] = None) -> None:
608
+ """
609
+ Check for and load any Device Data Configuration (DDC) blobs.
610
+
611
+ Args:
612
+ firmware_base_name: Base name of the selected firmware (e.g. "ibt-XXXX-YYYY").
613
+ If None, don't attempt to look up a .ddc file that
614
+ corresponds to the firmware image.
615
+ Priority:
616
+ 1. If a ddc_override was provided via driver metadata, use it (highest priority).
617
+ 2. Otherwise, if firmware_base_name is provided, attempt to find a .ddc file
618
+ that corresponds to the selected firmware image.
619
+ 3. Finally, if a ddc_addon was provided, append/load it after the primary DDC.
620
+ """
621
+ # If an explicit DDC override was supplied, use it and skip file lookup.
602
622
  if self.ddc_override:
603
623
  logger.debug("loading overridden DDC")
604
624
  await self.load_device_config(self.ddc_override)
605
625
  else:
606
- ddc_name = f"{firmware_base_name}.ddc"
607
- ddc_path = _find_binary_path(ddc_name)
608
- if ddc_path:
609
- logger.debug(f"loading DDC from {ddc_path}")
610
- ddc_data = ddc_path.read_bytes()
611
- await self.load_device_config(ddc_data)
626
+ # Only attempt .ddc file lookup if a firmware_base_name was provided.
627
+ if firmware_base_name is None:
628
+ logger.debug(
629
+ "no firmware_base_name provided; skipping .ddc file lookup"
630
+ )
631
+ else:
632
+ ddc_name = f"{firmware_base_name}.ddc"
633
+ ddc_path = _find_binary_path(ddc_name)
634
+ if ddc_path:
635
+ logger.debug(f"loading DDC from {ddc_path}")
636
+ ddc_data = ddc_path.read_bytes()
637
+ await self.load_device_config(ddc_data)
612
638
  if self.ddc_addon:
613
639
  logger.debug("loading DDC addon")
614
640
  await self.load_device_config(self.ddc_addon)
bumble/hfp.py CHANGED
@@ -489,9 +489,9 @@ STATUS_CODES = {
489
489
 
490
490
  @dataclasses.dataclass
491
491
  class HfConfiguration:
492
- supported_hf_features: list[HfFeature]
493
- supported_hf_indicators: list[HfIndicator]
494
- supported_audio_codecs: list[AudioCodec]
492
+ supported_hf_features: collections.abc.Sequence[HfFeature]
493
+ supported_hf_indicators: collections.abc.Sequence[HfIndicator]
494
+ supported_audio_codecs: collections.abc.Sequence[AudioCodec]
495
495
 
496
496
 
497
497
  @dataclasses.dataclass
@@ -753,7 +753,7 @@ class HfProtocol(utils.EventEmitter):
753
753
 
754
754
  # Build local features.
755
755
  self.supported_hf_features = sum(configuration.supported_hf_features)
756
- self.supported_audio_codecs = configuration.supported_audio_codecs
756
+ self.supported_audio_codecs = list(configuration.supported_audio_codecs)
757
757
 
758
758
  self.hf_indicators = {
759
759
  indicator: HfIndicatorState(indicator=indicator)
@@ -84,7 +84,12 @@ async def open_transport(name: str) -> Transport:
84
84
  scheme, *tail = name.split(':', 1)
85
85
  spec = tail[0] if tail else None
86
86
  metadata = None
87
- if spec and (m := re.search(r'\[(\w+=\w+(?:,\w+=\w+)*,?)\]', spec)):
87
+ # If a spec is provided, check for a metadata section in square brackets.
88
+ # The regex captures a comma-separated list of key=value pairs (allowing an
89
+ # optional trailing comma). The key is matched by \w+ and the value by [^,\]]+,
90
+ # meaning the value may contain any character except a comma or a closing
91
+ # bracket (']').
92
+ if spec and (m := re.search(r'\[(\w+=[^,\]]+(?:,\w+=[^,\]]+)*,?)\]', spec)):
88
93
  metadata_str = m.group(1)
89
94
  if m.start() == 0:
90
95
  # <metadata><spec>
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bumble
3
- Version: 0.0.217
3
+ Version: 0.0.218
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Author-email: Google <bumble-dev@google.com>
6
6
  License-Expression: Apache-2.0
@@ -113,7 +113,7 @@ Bumble is easiest to use with a dedicated USB dongle.
113
113
  This is because internal Bluetooth interfaces tend to be locked down by the operating system.
114
114
  You can use the [usb_probe](/docs/mkdocs/src/apps_and_tools/usb_probe.md) tool (all platforms) or `lsusb` (Linux or macOS) to list the available USB devices on your system.
115
115
 
116
- See the [USB Transport](/docs/mkdocs/src/transports/usb.md) page for details on how to refer to USB devices. Also, if your are on a mac, see [these instructions](docs/mkdocs/src/platforms/macos.md).
116
+ See the [USB Transport](/docs/mkdocs/src/transports/usb.md) page for details on how to refer to USB devices. Also, if you are on a mac, see [these instructions](docs/mkdocs/src/platforms/macos.md).
117
117
 
118
118
  ## License
119
119
 
@@ -1,5 +1,5 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=PoO2jYBkVti2LSUuEHv8sargBSqX0YyvJ9djrfZmGJs,708
2
+ bumble/_version.py,sha256=KD7H3kk26v8iwTiruZ8RXdlJzmt24QL0S_7OS-mLIks,708
3
3
  bumble/a2dp.py,sha256=sVo3w6qSsGm7Ttsqu4zeTO_Gfo63a7STTlJnaq8iJ-M,32031
4
4
  bumble/at.py,sha256=u93DzB5Ghrxks_ufuUqoYV2RUSowLNLMDhq_j9GrCBc,3108
5
5
  bumble/att.py,sha256=vS1dUwiuUgNU6PztARg_qPB_olLOWsAxFz6DZGX8zII,33423
@@ -15,7 +15,7 @@ bumble/controller.py,sha256=oIo6_3Y2_lhMPn0MUfEEN8997ry1blzT2rTUQabQwv8,68282
15
15
  bumble/core.py,sha256=QojIUs4nP9qo_r-FWPVxHrCdVSg6CaIzHf6GVPTuu9s,94583
16
16
  bumble/data_types.py,sha256=jLELcRiUcvRc4JcEo6vMO9kZmumZ9WuibFN-AK7ZYbc,32831
17
17
  bumble/decoder.py,sha256=0-VNWZT-u7lvK3qBpAuYT0M6Rz_bMgMi4CjfUXX_6RM,9728
18
- bumble/device.py,sha256=pV8krw94d42c0hml_XG8v0hSjb7DXLwgs5U2sgIbXNc,251491
18
+ bumble/device.py,sha256=lOO8MjKQ0hJ9BTgWtMA10zllGl2uHtbueGeQvn5JZ2k,251450
19
19
  bumble/gap.py,sha256=j5mevt__i_fSdIc_B3x7YvCJLeCc7bVq8omRphxwXNw,2144
20
20
  bumble/gatt.py,sha256=dBd-opQVUumlLPGw7EYZM5DF-ssnym3LsxhskAJMhig,34552
21
21
  bumble/gatt_adapters.py,sha256=9uN2uXGIdlvNeSvv3nfwxCEa15uPfm5DVLR5bog_knI,13190
@@ -23,7 +23,7 @@ bumble/gatt_client.py,sha256=jLIa7OoJgw8X7pLBGqsdSY3Sde4HSWBxGWTVWH0FPpA,44268
23
23
  bumble/gatt_server.py,sha256=Xx5UaXoNeEIcXfe1YjGrf4Mt7ZKEUak7e3dhFtdK-4Y,37907
24
24
  bumble/hci.py,sha256=2yEJnR6JBtxK6ghituuXCbSalifevnTqvPvnCjyrtAo,327200
25
25
  bumble/helpers.py,sha256=WFyikseIRdXUqqeOplNlmd0giOegahlXv5e324ax9ck,12611
26
- bumble/hfp.py,sha256=0ktRzzRSSwGVcmw_jZlayYjvPUGhzlWZY5fVuSH6FcE,76680
26
+ bumble/hfp.py,sha256=rUfd1OvNnr9FbURRjeNvLA4CcMzv3NcowVxbG4s2FXM,76746
27
27
  bumble/hid.py,sha256=UCPGHw-jm4i4Akk9pXVEL8_i6EdOwaOuqv2Xd_8EhXo,21054
28
28
  bumble/host.py,sha256=46fwcskNlfHyW8Ejo5wp8rHtMBZSMkR4URSdekKLPzg,68019
29
29
  bumble/keys.py,sha256=VCOrtuw-xF_4Oa5Qt-ECRKaTqabL_GbwdQUKoZX20II,13416
@@ -73,9 +73,9 @@ bumble/audio/io.py,sha256=OVwQfav8V6zwlI-DRHTCSXEYxBRJZCoQxfirnJI0kgE,17764
73
73
  bumble/crypto/__init__.py,sha256=n1V7wJp3-YOPl_GzM4zmjpYS8PI2J9xigtY81KMOiDY,6565
74
74
  bumble/crypto/builtin.py,sha256=JNUHJIaUx3ylBDCpMjaaDYPl-K3eCdD3iCl_2AWLn8Q,60901
75
75
  bumble/crypto/cryptography.py,sha256=yHznoBZ-hd8XqWheipkgn3Vdt5JydLxlTM3nTp5ayvc,2696
76
- bumble/drivers/__init__.py,sha256=o305FkknRCmFbzL1aY3B9JE_oSlClb138Xivb6EFPes,3212
76
+ bumble/drivers/__init__.py,sha256=03lZKWOvRi2qd_iogohvtTc76vpn89c5jvhbaNzxlSM,3505
77
77
  bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
78
- bumble/drivers/intel.py,sha256=oucJcjK4fQQznKXPCQ05vOWQjXFofKKNz0-aNrUTgcE,23193
78
+ bumble/drivers/intel.py,sha256=2LmZL4ka1qz90WZGnrEzALd2mj7AcG_06rV03cnKKgY,24624
79
79
  bumble/drivers/rtk.py,sha256=tCY2nW-tn_UnYJ_0o9XkJHaiyvSEnt-zA7GI2IIDoNg,22646
80
80
  bumble/pandora/__init__.py,sha256=xlEwye5eIwHMDHS-qPT2weF0TT86fEUIHYCUvW6LGpc,3535
81
81
  bumble/pandora/config.py,sha256=wfmko9UDEZWeRC4fccUdJnHn9D2Bus15R-Tqn2bLoAY,2384
@@ -116,7 +116,7 @@ bumble/tools/intel_fw_download.py,sha256=rLyiGcZ8XNhSTtv8ZWPozmO9QlyiV52ZS1brBu3
116
116
  bumble/tools/intel_util.py,sha256=-ZYSW4b09D7346MgkSW4vr6SsG1L5iX4H75EZtzwctE,4672
117
117
  bumble/tools/rtk_fw_download.py,sha256=kuJ2q-75Troc9hCrow0q5zKSMsVhocMeWHKvfdg6HC8,5645
118
118
  bumble/tools/rtk_util.py,sha256=4kdaHON_pg2HElzBRaStolqvEJVWPd0eZPUyAQWAqxc,5726
119
- bumble/transport/__init__.py,sha256=Dk84_3nAC24jY5zcCWVhjC2RxjJahKTz4zChygAqlvs,7027
119
+ bumble/transport/__init__.py,sha256=1z6WcJ0kkqSK1iugl3hYamJe54FdB8fmNI4M8M-zNx8,7376
120
120
  bumble/transport/android_emulator.py,sha256=axEdFBj17c0dOD5lMqJjiULInG_SQVx5W7ptjyLtRJs,4281
121
121
  bumble/transport/android_netsim.py,sha256=8C2kUITCl7L1ggl5FPwWcFq4It8e9O3esEpMjRaYkkw,17563
122
122
  bumble/transport/common.py,sha256=C0wurvCvcEX4r6F0cWbD2x1GhamJwJoyYmYJ21pU04Q,16770
@@ -175,9 +175,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
175
175
  bumble/vendor/android/hci.py,sha256=LcV4_OBpzoLtpSiP2su7F4r3bDrHWxcQPR4OGnMVXDk,10485
176
176
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
177
177
  bumble/vendor/zephyr/hci.py,sha256=ysct40uIVohaKKLrWjcWo-7YqozU17xGia2dWeHoMoI,3435
178
- bumble-0.0.217.dist-info/licenses/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
179
- bumble-0.0.217.dist-info/METADATA,sha256=Mdy5v7BSROxcolAFXgbeSX1fX0lOAQW319HWJNcwicg,6155
180
- bumble-0.0.217.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
181
- bumble-0.0.217.dist-info/entry_points.txt,sha256=mX5dzixNMRo4CTAEQqiYTr-JIaWF62TYrRvJOstjjL8,1081
182
- bumble-0.0.217.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
183
- bumble-0.0.217.dist-info/RECORD,,
178
+ bumble-0.0.218.dist-info/licenses/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
179
+ bumble-0.0.218.dist-info/METADATA,sha256=EdHBIsGq3Uaq02oNiTArIIVLe5BkYbWmCX34jclv5Qo,6154
180
+ bumble-0.0.218.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
181
+ bumble-0.0.218.dist-info/entry_points.txt,sha256=mX5dzixNMRo4CTAEQqiYTr-JIaWF62TYrRvJOstjjL8,1081
182
+ bumble-0.0.218.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
183
+ bumble-0.0.218.dist-info/RECORD,,