bumble 0.0.191__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/_version.py +2 -2
- bumble/apps/lea_unicast/app.py +577 -0
- bumble/apps/lea_unicast/index.html +68 -0
- bumble/apps/lea_unicast/liblc3.wasm +0 -0
- bumble/device.py +157 -118
- bumble/hci.py +14 -25
- bumble/hfp.py +279 -31
- bumble/host.py +9 -5
- bumble/keys.py +7 -4
- bumble/profiles/bap.py +52 -11
- bumble/rfcomm.py +29 -4
- bumble/transport/common.py +4 -0
- {bumble-0.0.191.dist-info → bumble-0.0.193.dist-info}/METADATA +6 -5
- {bumble-0.0.191.dist-info → bumble-0.0.193.dist-info}/RECORD +18 -15
- {bumble-0.0.191.dist-info → bumble-0.0.193.dist-info}/LICENSE +0 -0
- {bumble-0.0.191.dist-info → bumble-0.0.193.dist-info}/WHEEL +0 -0
- {bumble-0.0.191.dist-info → bumble-0.0.193.dist-info}/entry_points.txt +0 -0
- {bumble-0.0.191.dist-info → bumble-0.0.193.dist-info}/top_level.txt +0 -0
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
880
|
-
|
|
881
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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.
|
|
553
|
-
self.
|
|
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:
|
bumble/transport/common.py
CHANGED
|
@@ -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.
|
|
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
|
|
@@ -20,7 +20,7 @@ Requires-Dist: libusb-package ==1.0.26.1 ; platform_system != "Emscripten"
|
|
|
20
20
|
Requires-Dist: platformdirs >=3.10.0 ; platform_system != "Emscripten"
|
|
21
21
|
Requires-Dist: prompt-toolkit >=3.0.16 ; platform_system != "Emscripten"
|
|
22
22
|
Requires-Dist: prettytable >=3.6.0 ; platform_system != "Emscripten"
|
|
23
|
-
Requires-Dist: protobuf >=
|
|
23
|
+
Requires-Dist: protobuf >=3.12.4 ; platform_system != "Emscripten"
|
|
24
24
|
Requires-Dist: pyserial-asyncio >=0.5 ; platform_system != "Emscripten"
|
|
25
25
|
Requires-Dist: pyserial >=3.5 ; platform_system != "Emscripten"
|
|
26
26
|
Requires-Dist: pyusb >=1.2 ; platform_system != "Emscripten"
|
|
@@ -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.
|
|
38
|
+
Requires-Dist: mypy ==1.10.0 ; extra == 'development'
|
|
39
39
|
Requires-Dist: nox >=2022 ; extra == 'development'
|
|
40
|
-
Requires-Dist: pylint ==
|
|
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.
|
|
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=
|
|
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=
|
|
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=
|
|
23
|
+
bumble/hci.py,sha256=mL7xvgGyTz56Bn75yQSelFIl3Pys6ZImJIvZnjgkLCM,266912
|
|
24
24
|
bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
|
|
25
|
-
bumble/hfp.py,sha256=
|
|
25
|
+
bumble/hfp.py,sha256=OsBDREelxhLMi_UZO9Kxlqzbts08CcGxoiicUgrYlXg,75353
|
|
26
26
|
bumble/hid.py,sha256=Dd4rsmkRxcxt1IjoozJdu9Qd-QWruKJfsiYqTT89NDk,20590
|
|
27
|
-
bumble/host.py,sha256=
|
|
28
|
-
bumble/keys.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
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.
|
|
141
|
-
bumble-0.0.
|
|
142
|
-
bumble-0.0.
|
|
143
|
-
bumble-0.0.
|
|
144
|
-
bumble-0.0.
|
|
145
|
-
bumble-0.0.
|
|
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,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|