bumble 0.0.192__py3-none-any.whl → 0.0.193__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/profiles/bap.py CHANGED
@@ -78,6 +78,10 @@ class AudioLocation(enum.IntFlag):
78
78
  LEFT_SURROUND = 0x04000000
79
79
  RIGHT_SURROUND = 0x08000000
80
80
 
81
+ @property
82
+ def channel_count(self) -> int:
83
+ return bin(self.value).count('1')
84
+
81
85
 
82
86
  class AudioInputType(enum.IntEnum):
83
87
  '''Bluetooth Assigned Numbers, Section 6.12.2 - Audio Input Type'''
@@ -218,6 +222,13 @@ class FrameDuration(enum.IntEnum):
218
222
  DURATION_7500_US = 0x00
219
223
  DURATION_10000_US = 0x01
220
224
 
225
+ @property
226
+ def us(self) -> int:
227
+ return {
228
+ FrameDuration.DURATION_7500_US: 7500,
229
+ FrameDuration.DURATION_10000_US: 10000,
230
+ }[self]
231
+
221
232
 
222
233
  class SupportedFrameDuration(enum.IntFlag):
223
234
  '''Bluetooth Assigned Numbers, Section 6.12.4.2 - Frame Duration'''
@@ -534,7 +545,7 @@ class CodecSpecificCapabilities:
534
545
 
535
546
  supported_sampling_frequencies: SupportedSamplingFrequency
536
547
  supported_frame_durations: SupportedFrameDuration
537
- supported_audio_channel_counts: Sequence[int]
548
+ supported_audio_channel_count: Sequence[int]
538
549
  min_octets_per_codec_frame: int
539
550
  max_octets_per_codec_frame: int
540
551
  supported_max_codec_frames_per_sdu: int
@@ -543,7 +554,7 @@ class CodecSpecificCapabilities:
543
554
  def from_bytes(cls, data: bytes) -> CodecSpecificCapabilities:
544
555
  offset = 0
545
556
  # Allowed default values.
546
- supported_audio_channel_counts = [1]
557
+ supported_audio_channel_count = [1]
547
558
  supported_max_codec_frames_per_sdu = 1
548
559
  while offset < len(data):
549
560
  length, type = struct.unpack_from('BB', data, offset)
@@ -556,7 +567,7 @@ class CodecSpecificCapabilities:
556
567
  elif type == CodecSpecificCapabilities.Type.FRAME_DURATION:
557
568
  supported_frame_durations = SupportedFrameDuration(value)
558
569
  elif type == CodecSpecificCapabilities.Type.AUDIO_CHANNEL_COUNT:
559
- supported_audio_channel_counts = bits_to_channel_counts(value)
570
+ supported_audio_channel_count = bits_to_channel_counts(value)
560
571
  elif type == CodecSpecificCapabilities.Type.OCTETS_PER_FRAME:
561
572
  min_octets_per_sample = value & 0xFFFF
562
573
  max_octets_per_sample = value >> 16
@@ -567,7 +578,7 @@ class CodecSpecificCapabilities:
567
578
  return CodecSpecificCapabilities(
568
579
  supported_sampling_frequencies=supported_sampling_frequencies,
569
580
  supported_frame_durations=supported_frame_durations,
570
- supported_audio_channel_counts=supported_audio_channel_counts,
581
+ supported_audio_channel_count=supported_audio_channel_count,
571
582
  min_octets_per_codec_frame=min_octets_per_sample,
572
583
  max_octets_per_codec_frame=max_octets_per_sample,
573
584
  supported_max_codec_frames_per_sdu=supported_max_codec_frames_per_sdu,
@@ -584,7 +595,7 @@ class CodecSpecificCapabilities:
584
595
  self.supported_frame_durations,
585
596
  2,
586
597
  CodecSpecificCapabilities.Type.AUDIO_CHANNEL_COUNT,
587
- channel_counts_to_bits(self.supported_audio_channel_counts),
598
+ channel_counts_to_bits(self.supported_audio_channel_count),
588
599
  5,
589
600
  CodecSpecificCapabilities.Type.OCTETS_PER_FRAME,
590
601
  self.min_octets_per_codec_frame,
@@ -870,15 +881,22 @@ class AseStateMachine(gatt.Characteristic):
870
881
  cig_id: int,
871
882
  cis_id: int,
872
883
  ) -> None:
873
- if cis_id == self.cis_id and self.state == self.State.ENABLING:
884
+ if (
885
+ cig_id == self.cig_id
886
+ and cis_id == self.cis_id
887
+ and self.state == self.State.ENABLING
888
+ ):
874
889
  acl_connection.abort_on(
875
890
  'flush', self.service.device.accept_cis_request(cis_handle)
876
891
  )
877
892
 
878
893
  def on_cis_establishment(self, cis_link: device.CisLink) -> None:
879
- if cis_link.cis_id == self.cis_id and self.state == self.State.ENABLING:
880
- self.state = self.State.STREAMING
881
- self.cis_link = cis_link
894
+ if (
895
+ cis_link.cig_id == self.cig_id
896
+ and cis_link.cis_id == self.cis_id
897
+ and self.state == self.State.ENABLING
898
+ ):
899
+ cis_link.on('disconnection', self.on_cis_disconnection)
882
900
 
883
901
  async def post_cis_established():
884
902
  await self.service.device.send_command(
@@ -891,9 +909,15 @@ class AseStateMachine(gatt.Characteristic):
891
909
  codec_configuration=b'',
892
910
  )
893
911
  )
912
+ if self.role == AudioRole.SINK:
913
+ self.state = self.State.STREAMING
894
914
  await self.service.device.notify_subscribers(self, self.value)
895
915
 
896
916
  cis_link.acl_connection.abort_on('flush', post_cis_established())
917
+ self.cis_link = cis_link
918
+
919
+ def on_cis_disconnection(self, _reason) -> None:
920
+ self.cis_link = None
897
921
 
898
922
  def on_config_codec(
899
923
  self,
@@ -991,11 +1015,17 @@ class AseStateMachine(gatt.Characteristic):
991
1015
  AseResponseCode.INVALID_ASE_STATE_MACHINE_TRANSITION,
992
1016
  AseReasonCode.NONE,
993
1017
  )
994
- self.state = self.State.DISABLING
1018
+ if self.role == AudioRole.SINK:
1019
+ self.state = self.State.QOS_CONFIGURED
1020
+ else:
1021
+ self.state = self.State.DISABLING
995
1022
  return (AseResponseCode.SUCCESS, AseReasonCode.NONE)
996
1023
 
997
1024
  def on_receiver_stop_ready(self) -> Tuple[AseResponseCode, AseReasonCode]:
998
- if self.state != AseStateMachine.State.DISABLING:
1025
+ if (
1026
+ self.role != AudioRole.SOURCE
1027
+ or self.state != AseStateMachine.State.DISABLING
1028
+ ):
999
1029
  return (
1000
1030
  AseResponseCode.INVALID_ASE_STATE_MACHINE_TRANSITION,
1001
1031
  AseReasonCode.NONE,
@@ -1046,6 +1076,7 @@ class AseStateMachine(gatt.Characteristic):
1046
1076
  def state(self, new_state: State) -> None:
1047
1077
  logger.debug(f'{self} state change -> {colors.color(new_state.name, "cyan")}')
1048
1078
  self._state = new_state
1079
+ self.emit('state_change')
1049
1080
 
1050
1081
  @property
1051
1082
  def value(self):
@@ -1118,6 +1149,7 @@ class AudioStreamControlService(gatt.TemplateService):
1118
1149
 
1119
1150
  ase_state_machines: Dict[int, AseStateMachine]
1120
1151
  ase_control_point: gatt.Characteristic
1152
+ _active_client: Optional[device.Connection] = None
1121
1153
 
1122
1154
  def __init__(
1123
1155
  self,
@@ -1155,7 +1187,16 @@ class AudioStreamControlService(gatt.TemplateService):
1155
1187
  else:
1156
1188
  return (ase_id, AseResponseCode.INVALID_ASE_ID, AseReasonCode.NONE)
1157
1189
 
1190
+ def _on_client_disconnected(self, _reason: int) -> None:
1191
+ for ase in self.ase_state_machines.values():
1192
+ ase.state = AseStateMachine.State.IDLE
1193
+ self._active_client = None
1194
+
1158
1195
  def on_write_ase_control_point(self, connection, data):
1196
+ if not self._active_client and connection:
1197
+ self._active_client = connection
1198
+ connection.once('disconnection', self._on_client_disconnected)
1199
+
1159
1200
  operation = ASE_Operation.from_bytes(data)
1160
1201
  responses = []
1161
1202
  logger.debug(f'*** ASCS Write {operation} ***')
bumble/rfcomm.py CHANGED
@@ -19,6 +19,7 @@ from __future__ import annotations
19
19
 
20
20
  import logging
21
21
  import asyncio
22
+ import collections
22
23
  import dataclasses
23
24
  import enum
24
25
  from typing import Callable, Dict, List, Optional, Tuple, Union, TYPE_CHECKING
@@ -54,6 +55,7 @@ logger = logging.getLogger(__name__)
54
55
  # fmt: off
55
56
 
56
57
  RFCOMM_PSM = 0x0003
58
+ DEFAULT_RX_QUEUE_SIZE = 32
57
59
 
58
60
  class FrameType(enum.IntEnum):
59
61
  SABM = 0x2F # Control field [1,1,1,1,_,1,0,0] LSB-first
@@ -445,7 +447,8 @@ class DLC(EventEmitter):
445
447
  RESET = 0x05
446
448
 
447
449
  connection_result: Optional[asyncio.Future]
448
- sink: Optional[Callable[[bytes], None]]
450
+ _sink: Optional[Callable[[bytes], None]]
451
+ _enqueued_rx_packets: collections.deque[bytes]
449
452
 
450
453
  def __init__(
451
454
  self,
@@ -466,10 +469,12 @@ class DLC(EventEmitter):
466
469
  self.state = DLC.State.INIT
467
470
  self.role = multiplexer.role
468
471
  self.c_r = 1 if self.role == Multiplexer.Role.INITIATOR else 0
469
- self.sink = None
470
472
  self.connection_result = None
471
473
  self.drained = asyncio.Event()
472
474
  self.drained.set()
475
+ # Queued packets when sink is not set.
476
+ self._enqueued_rx_packets = collections.deque(maxlen=DEFAULT_RX_QUEUE_SIZE)
477
+ self._sink = None
473
478
 
474
479
  # Compute the MTU
475
480
  max_overhead = 4 + 1 # header with 2-byte length + fcs
@@ -477,6 +482,19 @@ class DLC(EventEmitter):
477
482
  max_frame_size, self.multiplexer.l2cap_channel.peer_mtu - max_overhead
478
483
  )
479
484
 
485
+ @property
486
+ def sink(self) -> Optional[Callable[[bytes], None]]:
487
+ return self._sink
488
+
489
+ @sink.setter
490
+ def sink(self, sink: Optional[Callable[[bytes], None]]) -> None:
491
+ self._sink = sink
492
+ # Dump queued packets to sink
493
+ if sink:
494
+ for packet in self._enqueued_rx_packets:
495
+ sink(packet) # pylint: disable=not-callable
496
+ self._enqueued_rx_packets.clear()
497
+
480
498
  def change_state(self, new_state: State) -> None:
481
499
  logger.debug(f'{self} state change -> {color(new_state.name, "magenta")}')
482
500
  self.state = new_state
@@ -549,8 +567,15 @@ class DLC(EventEmitter):
549
567
  f'rx_credits={self.rx_credits}: {data.hex()}'
550
568
  )
551
569
  if data:
552
- if self.sink:
553
- self.sink(data) # pylint: disable=not-callable
570
+ if self._sink:
571
+ self._sink(data) # pylint: disable=not-callable
572
+ else:
573
+ self._enqueued_rx_packets.append(data)
574
+ if (
575
+ self._enqueued_rx_packets.maxlen
576
+ and len(self._enqueued_rx_packets) >= self._enqueued_rx_packets.maxlen
577
+ ):
578
+ logger.warning(f'DLC [{self.dlci}] received packet queue is full')
554
579
 
555
580
  # Update the credits
556
581
  if self.rx_credits > 0:
@@ -425,6 +425,10 @@ class SnoopingTransport(Transport):
425
425
  class Source:
426
426
  sink: TransportSink
427
427
 
428
+ @property
429
+ def metadata(self) -> dict[str, Any]:
430
+ return getattr(self.source, 'metadata', {})
431
+
428
432
  def __init__(self, source: TransportSource, snooper: Snooper):
429
433
  self.source = source
430
434
  self.snooper = snooper
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.192
3
+ Version: 0.0.193
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -35,13 +35,14 @@ Provides-Extra: development
35
35
  Requires-Dist: black ==24.3 ; extra == 'development'
36
36
  Requires-Dist: grpcio-tools >=1.62.1 ; extra == 'development'
37
37
  Requires-Dist: invoke >=1.7.3 ; extra == 'development'
38
- Requires-Dist: mypy ==1.8.0 ; extra == 'development'
38
+ Requires-Dist: mypy ==1.10.0 ; extra == 'development'
39
39
  Requires-Dist: nox >=2022 ; extra == 'development'
40
- Requires-Dist: pylint ==2.15.8 ; extra == 'development'
40
+ Requires-Dist: pylint ==3.1.0 ; extra == 'development'
41
41
  Requires-Dist: pyyaml >=6.0 ; extra == 'development'
42
42
  Requires-Dist: types-appdirs >=1.4.3 ; extra == 'development'
43
43
  Requires-Dist: types-invoke >=1.7.3 ; extra == 'development'
44
44
  Requires-Dist: types-protobuf >=4.21.0 ; extra == 'development'
45
+ Requires-Dist: wasmtime ==20.0.0 ; extra == 'development'
45
46
  Provides-Extra: documentation
46
47
  Requires-Dist: mkdocs >=1.4.0 ; extra == 'documentation'
47
48
  Requires-Dist: mkdocs-material >=8.5.6 ; extra == 'documentation'
@@ -49,7 +50,7 @@ Requires-Dist: mkdocstrings[python] >=0.19.0 ; extra == 'documentation'
49
50
  Provides-Extra: pandora
50
51
  Requires-Dist: bt-test-interfaces >=0.0.6 ; extra == 'pandora'
51
52
  Provides-Extra: test
52
- Requires-Dist: pytest >=8.0 ; extra == 'test'
53
+ Requires-Dist: pytest >=8.2 ; extra == 'test'
53
54
  Requires-Dist: pytest-asyncio >=0.23.5 ; extra == 'test'
54
55
  Requires-Dist: pytest-html >=3.2.0 ; extra == 'test'
55
56
  Requires-Dist: coverage >=6.4 ; extra == 'test'
@@ -1,5 +1,5 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=lSefnTH6R6u0mUz0L1w0kV_TidGT3hsmjlFRbEtBud0,415
2
+ bumble/_version.py,sha256=Gd5zR-hy663VWkpBiQSeTTwcqqLABTk22YvYNZ1-ZgY,415
3
3
  bumble/a2dp.py,sha256=VEeAOCfT1ZqpwnEgel6DJ32vxR8jYX3IAaBfCqPdWO8,22675
4
4
  bumble/at.py,sha256=kdrcsx2C8Rg61EWESD2QHwpZntkXkRBJLrPn9auv9K8,2961
5
5
  bumble/att.py,sha256=TGzhhBKCQPA_P_eDDSNASJVfa3dCr-QzzrRB3GekrI0,32366
@@ -15,22 +15,22 @@ bumble/controller.py,sha256=XkYTQb2J5MhH_dGfnFkrLXdChFD2s1wSvqXaHQFeo48,59688
15
15
  bumble/core.py,sha256=l71AacyuFijZJH-kBYB41riW9SEsRtlVIPYyhnhPwmc,53132
16
16
  bumble/crypto.py,sha256=L6z3dn9-dgKYRtOM6O3F6n6Ju4PwTM3LAFJtCg_ie78,9382
17
17
  bumble/decoder.py,sha256=N9nMvuVhuwpnfw7EDVuNe9uYY6B6c3RY2dh8RhRPC1U,9608
18
- bumble/device.py,sha256=XvAdIoGcYZIdlJzJNHRA_4nPYiJF1GRQZAp8HflKe60,167653
18
+ bumble/device.py,sha256=W6u3zI9ivj5ypFycq8r7OGs0svBGrFVq3KplXI5minA,168751
19
19
  bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
20
20
  bumble/gatt.py,sha256=W7h8hEyxM8fu3HbAKYJ2HStb8NM7T98UICVnf4G9HDo,38447
21
21
  bumble/gatt_client.py,sha256=pJ29537m9L_cY2nrtEqZdssOEpg4147fF7vhz0BweyY,43071
22
22
  bumble/gatt_server.py,sha256=uPYbn2-y0MLnyR8xxpOf18gPua_Q49pSlMR1zxEnU-Q,37118
23
- bumble/hci.py,sha256=3MYwWLuuolxY9xMitm5tOHpqvGKqtsReZ6QUfI1DcVA,267323
23
+ bumble/hci.py,sha256=mL7xvgGyTz56Bn75yQSelFIl3Pys6ZImJIvZnjgkLCM,266912
24
24
  bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
25
- bumble/hfp.py,sha256=zee-gfWdKK1gBEqF32u2BaMf5Uc6LsoepO-ZFV65bj8,66094
25
+ bumble/hfp.py,sha256=OsBDREelxhLMi_UZO9Kxlqzbts08CcGxoiicUgrYlXg,75353
26
26
  bumble/hid.py,sha256=Dd4rsmkRxcxt1IjoozJdu9Qd-QWruKJfsiYqTT89NDk,20590
27
- bumble/host.py,sha256=g9twZR9JapJdOD_HYFTbyA8U2dyUVKBEbq-2RtfSdQA,46928
28
- bumble/keys.py,sha256=58BMWd8LocY0bazVQ-qw3DKrOxgilhYaKBkmJRcNPp4,12593
27
+ bumble/host.py,sha256=2hT-HRAlxPhVMoXUwn5E1-M90bbCNsWOam5nV3fnF1o,47175
28
+ bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
29
29
  bumble/l2cap.py,sha256=8m_1Kv6Tk-M-DilkAz_OXx0XsiLUhXycEZjUkICwyj0,81064
30
30
  bumble/link.py,sha256=QiiMSCZ0z0ko2oUEMYg6nbq-h5A_3DLN4pjqAx_E-SA,23980
31
31
  bumble/pairing.py,sha256=tgPUba6xNxMi-2plm3xfRlzHq-uPRNZEIGWaN0qNGCs,9853
32
32
  bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
- bumble/rfcomm.py,sha256=rCkYaRNjwQ5HPRTat4CY9ZecU9qWQUi4OCB8_RUKeQc,35685
33
+ bumble/rfcomm.py,sha256=M93g5CxBVvKEEDr_gxbg3immwnWIu_LP158NXVc5B64,36667
34
34
  bumble/sdp.py,sha256=_Jp3Ui7dwIm-1t5vvIDBzPOs_gLmFpnZBnPcYtgu6nY,45287
35
35
  bumble/smp.py,sha256=PcQj8mDoM8fBc4gKECHoOs0A2ukUAaSZQGdgLj6YzB0,76277
36
36
  bumble/snoop.py,sha256=_QfF36eylBW6Snd-_KYOwKaGiM8i_Ed-B5XoFIPt3Dg,5631
@@ -53,6 +53,9 @@ bumble/apps/scan.py,sha256=b6hIppiJqDfR7VFW2wl3-lkPdFvHLqYZKY8VjjNnhls,8366
53
53
  bumble/apps/show.py,sha256=8w0-8jLtN6IM6_58pOHbEmE1Rmxm71O48ACrXixC2jk,6218
54
54
  bumble/apps/unbond.py,sha256=LDPWpmgKLMGYDdIFGTdGciFDcUliZ0OmseEbGfJ-MAM,3176
55
55
  bumble/apps/usb_probe.py,sha256=zJqrqKSGVYcOntXzgONdluZDE6jfj3IwPNuLqmDPDsU,10351
56
+ bumble/apps/lea_unicast/app.py,sha256=LBJn5_wOPehHACnrw2N9JwIyYH-MhyadGl5A9SqhXSs,20625
57
+ bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
58
+ bumble/apps/lea_unicast/liblc3.wasm,sha256=nYMzG9fP8_71K9dQfVI9QPQPkFRPHoqZEEExs1y6Oac,158603
56
59
  bumble/apps/link_relay/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
57
60
  bumble/apps/link_relay/link_relay.py,sha256=GOESYPzkMJFrz5VOI_BSmnmgz4Y8EdSLHMWgdA63aDg,10066
58
61
  bumble/apps/link_relay/logging.yml,sha256=t-P72RAHsTZOESw0M4I3CQPonymcjkd9SLE0eY_ZNiM,311
@@ -75,7 +78,7 @@ bumble/pandora/security.py,sha256=YErueKNLsnmcRe6dKo724Ht-buOqmZl2Gauswcc8FW0,21
75
78
  bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
76
79
  bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
77
80
  bumble/profiles/asha_service.py,sha256=J4i5jkJciZWMtTWJ1zGJkEx65DlAEIADqjCRYf_CWNs,7220
78
- bumble/profiles/bap.py,sha256=jY0wHBIlc_Qxv6j-3rF_4nI4uM2z4I8WT99Teu4o0S8,46006
81
+ bumble/profiles/bap.py,sha256=m5abJqb49iDPEkxc_EL3r1jOl2LKtKHSqB4E-4I5Dzw,47272
79
82
  bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
80
83
  bumble/profiles/cap.py,sha256=6gH7oOnUKjOggMPuB7rtbwj0AneoNmnWzQ_iR3io8e0,1945
81
84
  bumble/profiles/csip.py,sha256=wzSpNRCOMWtKw2Yd9OTAzPoFDoQWG-KYwWdA6sUkwiI,10102
@@ -90,7 +93,7 @@ bumble/tools/rtk_util.py,sha256=TwZhupHQrQYsYHLdRGyzXKd24pwCk8kkzqK1Rj2guco,5087
90
93
  bumble/transport/__init__.py,sha256=W_IjqBehWCvjyTghgRYvbbLqDlh2xh7ZRDRvun5iYB0,6830
91
94
  bumble/transport/android_emulator.py,sha256=eH8H1aB7MvQ8lpdwVG6SGKg5uwCRb_aPJk8pPwoTXSY,4321
92
95
  bumble/transport/android_netsim.py,sha256=SVh-IUZ2bhcIESZFGzOsofybsi4H0qoBRwBieeqUINE,16215
93
- bumble/transport/common.py,sha256=1W8p2dMAlEhmmcS9DFtuM01BNl-LRsNQWcqjq6PfMPc,15697
96
+ bumble/transport/common.py,sha256=LHZNCrSNMd3AwaOT31WZXRdu9ydidNO3pnmonWBWhLA,15818
94
97
  bumble/transport/file.py,sha256=eVM2V6Nk2nDAFdE7Rt01ZI3JdTovsH9OEU1gKYPJjpE,2010
95
98
  bumble/transport/hci_socket.py,sha256=EdgWi3-O5yvYcH4R4BkPtG79pnUo7GQtXWawuUHDoDQ,6331
96
99
  bumble/transport/pty.py,sha256=grTl-yvjMWHflNwuME4ccVqDbk6NIEgQMgH6Y9lf1fU,2732
@@ -137,9 +140,9 @@ bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3h
137
140
  bumble/vendor/android/hci.py,sha256=GZrkhaWmcMt1JpnRhv0NoySGkf2H4lNUV2f_omRZW0I,10741
138
141
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
139
142
  bumble/vendor/zephyr/hci.py,sha256=d83bC0TvT947eN4roFjLkQefWtHOoNsr4xib2ctSkvA,3195
140
- bumble-0.0.192.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
141
- bumble-0.0.192.dist-info/METADATA,sha256=-PS1I7x-VWaCdUl1Wcgmnzd1W_uAtjjsuC1F_JPKL5Q,5695
142
- bumble-0.0.192.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
143
- bumble-0.0.192.dist-info/entry_points.txt,sha256=UkNj1KMZDhzOb7O4OU7Jn4YI5KaxJZgQF2GF64BwOlQ,883
144
- bumble-0.0.192.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
145
- bumble-0.0.192.dist-info/RECORD,,
143
+ bumble-0.0.193.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
144
+ bumble-0.0.193.dist-info/METADATA,sha256=gtflo1GIuoKchDFFY0xhmfpzgV8fK78dXSg4NXc349c,5753
145
+ bumble-0.0.193.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
146
+ bumble-0.0.193.dist-info/entry_points.txt,sha256=UkNj1KMZDhzOb7O4OU7Jn4YI5KaxJZgQF2GF64BwOlQ,883
147
+ bumble-0.0.193.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
148
+ bumble-0.0.193.dist-info/RECORD,,