bumble 0.0.155__tar.gz → 0.0.156__tar.gz

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.
Files changed (284) hide show
  1. {bumble-0.0.155 → bumble-0.0.156}/PKG-INFO +1 -1
  2. bumble-0.0.156/apps/speaker/speaker.css +76 -0
  3. bumble-0.0.156/apps/speaker/speaker.html +34 -0
  4. bumble-0.0.156/apps/speaker/speaker.js +315 -0
  5. bumble-0.0.156/apps/speaker/speaker.py +747 -0
  6. {bumble-0.0.155 → bumble-0.0.156}/bumble/_version.py +2 -2
  7. {bumble-0.0.155 → bumble-0.0.156}/bumble/a2dp.py +1 -0
  8. {bumble-0.0.155 → bumble-0.0.156}/bumble/avdtp.py +50 -31
  9. bumble-0.0.156/bumble/codecs.py +381 -0
  10. {bumble-0.0.155 → bumble-0.0.156}/bumble/device.py +7 -3
  11. {bumble-0.0.155 → bumble-0.0.156}/bumble/hci.py +13 -9
  12. {bumble-0.0.155 → bumble-0.0.156}/bumble/host.py +7 -1
  13. bumble-0.0.156/bumble/transport/py.typed +0 -0
  14. {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/PKG-INFO +1 -1
  15. {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/SOURCES.txt +12 -0
  16. {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/entry_points.txt +1 -0
  17. {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/requires.txt +4 -3
  18. bumble-0.0.156/docs/images/logo_framed.svg +42 -0
  19. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/mkdocs.yml +1 -0
  20. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/index.md +1 -0
  21. bumble-0.0.156/docs/mkdocs/src/apps_and_tools/speaker.md +86 -0
  22. bumble-0.0.156/docs/mkdocs/src/images/speaker_screenshot.png +0 -0
  23. bumble-0.0.156/examples/run_classic_connect.py +119 -0
  24. bumble-0.0.156/examples/speaker.json +5 -0
  25. {bumble-0.0.155 → bumble-0.0.156}/setup.cfg +5 -3
  26. bumble-0.0.156/speaker.html +28 -0
  27. bumble-0.0.156/tests/codecs_test.py +67 -0
  28. bumble-0.0.155/examples/run_classic_connect.py +0 -111
  29. {bumble-0.0.155 → bumble-0.0.156}/.git-blame-ignore-revs +0 -0
  30. {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/code-check.yml +0 -0
  31. {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/codeql-analysis.yml +0 -0
  32. {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/python-build-test.yml +0 -0
  33. {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/python-publish.yml +0 -0
  34. {bumble-0.0.155 → bumble-0.0.156}/.gitignore +0 -0
  35. {bumble-0.0.155 → bumble-0.0.156}/.vscode/settings.json +0 -0
  36. {bumble-0.0.155 → bumble-0.0.156}/CONTRIBUTING.md +0 -0
  37. {bumble-0.0.155 → bumble-0.0.156}/LICENSE +0 -0
  38. {bumble-0.0.155 → bumble-0.0.156}/README.md +0 -0
  39. {bumble-0.0.155 → bumble-0.0.156}/apps/README.md +0 -0
  40. {bumble-0.0.155 → bumble-0.0.156}/apps/__init__.py +0 -0
  41. {bumble-0.0.155 → bumble-0.0.156}/apps/bench.py +0 -0
  42. {bumble-0.0.155 → bumble-0.0.156}/apps/console.py +0 -0
  43. {bumble-0.0.155 → bumble-0.0.156}/apps/controller_info.py +0 -0
  44. {bumble-0.0.155 → bumble-0.0.156}/apps/controllers.py +0 -0
  45. {bumble-0.0.155 → bumble-0.0.156}/apps/gatt_dump.py +0 -0
  46. {bumble-0.0.155 → bumble-0.0.156}/apps/gg_bridge.py +0 -0
  47. {bumble-0.0.155 → bumble-0.0.156}/apps/hci_bridge.py +0 -0
  48. {bumble-0.0.155 → bumble-0.0.156}/apps/l2cap_bridge.py +0 -0
  49. {bumble-0.0.155 → bumble-0.0.156}/apps/link_relay/__init__.py +0 -0
  50. {bumble-0.0.155 → bumble-0.0.156}/apps/link_relay/link_relay.py +0 -0
  51. {bumble-0.0.155 → bumble-0.0.156}/apps/link_relay/logging.yml +0 -0
  52. {bumble-0.0.155 → bumble-0.0.156}/apps/pair.py +0 -0
  53. {bumble-0.0.155 → bumble-0.0.156}/apps/pandora_server.py +0 -0
  54. {bumble-0.0.155 → bumble-0.0.156}/apps/scan.py +0 -0
  55. {bumble-0.0.155 → bumble-0.0.156}/apps/show.py +0 -0
  56. {bumble-0.0.155/bumble/transport/grpc_protobuf → bumble-0.0.156/apps/speaker}/__init__.py +0 -0
  57. /bumble-0.0.155/docs/images/logo_framed.svg → /bumble-0.0.156/apps/speaker/logo.svg +0 -0
  58. {bumble-0.0.155 → bumble-0.0.156}/apps/unbond.py +0 -0
  59. {bumble-0.0.155 → bumble-0.0.156}/apps/usb_probe.py +0 -0
  60. {bumble-0.0.155 → bumble-0.0.156}/bumble/__init__.py +0 -0
  61. {bumble-0.0.155 → bumble-0.0.156}/bumble/att.py +0 -0
  62. {bumble-0.0.155 → bumble-0.0.156}/bumble/bridge.py +0 -0
  63. {bumble-0.0.155 → bumble-0.0.156}/bumble/colors.py +0 -0
  64. {bumble-0.0.155 → bumble-0.0.156}/bumble/company_ids.py +0 -0
  65. {bumble-0.0.155 → bumble-0.0.156}/bumble/controller.py +0 -0
  66. {bumble-0.0.155 → bumble-0.0.156}/bumble/core.py +0 -0
  67. {bumble-0.0.155 → bumble-0.0.156}/bumble/crypto.py +0 -0
  68. {bumble-0.0.155 → bumble-0.0.156}/bumble/decoder.py +0 -0
  69. {bumble-0.0.155 → bumble-0.0.156}/bumble/gap.py +0 -0
  70. {bumble-0.0.155 → bumble-0.0.156}/bumble/gatt.py +0 -0
  71. {bumble-0.0.155 → bumble-0.0.156}/bumble/gatt_client.py +0 -0
  72. {bumble-0.0.155 → bumble-0.0.156}/bumble/gatt_server.py +0 -0
  73. {bumble-0.0.155 → bumble-0.0.156}/bumble/helpers.py +0 -0
  74. {bumble-0.0.155 → bumble-0.0.156}/bumble/hfp.py +0 -0
  75. {bumble-0.0.155 → bumble-0.0.156}/bumble/keys.py +0 -0
  76. {bumble-0.0.155 → bumble-0.0.156}/bumble/l2cap.py +0 -0
  77. {bumble-0.0.155 → bumble-0.0.156}/bumble/link.py +0 -0
  78. {bumble-0.0.155 → bumble-0.0.156}/bumble/pairing.py +0 -0
  79. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/__init__.py +0 -0
  80. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/config.py +0 -0
  81. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/device.py +0 -0
  82. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/host.py +0 -0
  83. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/py.typed +0 -0
  84. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/security.py +0 -0
  85. {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/utils.py +0 -0
  86. {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/__init__.py +0 -0
  87. {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/asha_service.py +0 -0
  88. {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/battery_service.py +0 -0
  89. {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/device_information_service.py +0 -0
  90. {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/heart_rate_service.py +0 -0
  91. {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/py.typed +0 -0
  92. {bumble-0.0.155 → bumble-0.0.156}/bumble/py.typed +0 -0
  93. {bumble-0.0.155 → bumble-0.0.156}/bumble/rfcomm.py +0 -0
  94. {bumble-0.0.155 → bumble-0.0.156}/bumble/sdp.py +0 -0
  95. {bumble-0.0.155 → bumble-0.0.156}/bumble/smp.py +0 -0
  96. {bumble-0.0.155 → bumble-0.0.156}/bumble/snoop.py +0 -0
  97. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/__init__.py +0 -0
  98. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/android_emulator.py +0 -0
  99. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/android_netsim.py +0 -0
  100. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/common.py +0 -0
  101. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/file.py +0 -0
  102. /bumble-0.0.155/bumble/transport/py.typed → /bumble-0.0.156/bumble/transport/grpc_protobuf/__init__.py +0 -0
  103. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/common_pb2.py +0 -0
  104. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/common_pb2.pyi +0 -0
  105. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/common_pb2_grpc.py +0 -0
  106. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.py +0 -0
  107. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.pyi +0 -0
  108. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2_grpc.py +0 -0
  109. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.py +0 -0
  110. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.pyi +0 -0
  111. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2_grpc.py +0 -0
  112. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.py +0 -0
  113. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.pyi +0 -0
  114. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2_grpc.py +0 -0
  115. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.py +0 -0
  116. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.pyi +0 -0
  117. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2_grpc.py +0 -0
  118. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.py +0 -0
  119. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.pyi +0 -0
  120. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2_grpc.py +0 -0
  121. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/hci_packet_pb2.py +0 -0
  122. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/hci_packet_pb2.pyi +0 -0
  123. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/hci_packet_pb2_grpc.py +0 -0
  124. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/packet_streamer_pb2.py +0 -0
  125. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/packet_streamer_pb2.pyi +0 -0
  126. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/packet_streamer_pb2_grpc.py +0 -0
  127. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/startup_pb2.py +0 -0
  128. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/startup_pb2.pyi +0 -0
  129. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/startup_pb2_grpc.py +0 -0
  130. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/hci_socket.py +0 -0
  131. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/pty.py +0 -0
  132. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/pyusb.py +0 -0
  133. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/serial.py +0 -0
  134. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/tcp_client.py +0 -0
  135. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/tcp_server.py +0 -0
  136. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/udp.py +0 -0
  137. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/usb.py +0 -0
  138. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/vhci.py +0 -0
  139. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/ws_client.py +0 -0
  140. {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/ws_server.py +0 -0
  141. {bumble-0.0.155 → bumble-0.0.156}/bumble/utils.py +0 -0
  142. {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/dependency_links.txt +0 -0
  143. {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/top_level.txt +0 -0
  144. {bumble-0.0.155 → bumble-0.0.156}/docs/README.md +0 -0
  145. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.png +0 -0
  146. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.svg +0 -0
  147. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Artboard0.json +0 -0
  148. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Document.json +0 -0
  149. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Manifest.json +0 -0
  150. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Thumbnail.png +0 -0
  151. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/UndoHistory.json +0 -0
  152. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.png +0 -0
  153. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Artboard0.json +0 -0
  154. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Document.json +0 -0
  155. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Manifest.json +0 -0
  156. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Thumbnail.png +0 -0
  157. {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/UndoHistory.json +0 -0
  158. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/requirements.txt +0 -0
  159. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/api/examples.md +0 -0
  160. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/api/guide.md +0 -0
  161. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/api/reference.md +0 -0
  162. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/bench.md +0 -0
  163. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/console.md +0 -0
  164. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/gatt_dump.md +0 -0
  165. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/gg_bridge.md +0 -0
  166. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/hci_bridge.md +0 -0
  167. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/link_relay.md +0 -0
  168. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/pair.md +0 -0
  169. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/show.md +0 -0
  170. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/unbond.md +0 -0
  171. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/usb_probe.md +0 -0
  172. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/controller.md +0 -0
  173. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/gatt.md +0 -0
  174. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/host.md +0 -0
  175. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/security_manager.md +0 -0
  176. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/development/code_style.md +0 -0
  177. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/development/contributing.md +0 -0
  178. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/development/python_environments.md +0 -0
  179. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/examples/index.md +0 -0
  180. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/getting_started.md +0 -0
  181. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/hardware/index.md +0 -0
  182. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/bumble_layers.svg +0 -0
  183. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/console_screenshot.png +0 -0
  184. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/favicon.ico +0 -0
  185. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/logo.png +0 -0
  186. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/logo_framed.png +0 -0
  187. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/index.md +0 -0
  188. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/android.md +0 -0
  189. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/index.md +0 -0
  190. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/linux.md +0 -0
  191. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/macos.md +0 -0
  192. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/windows.md +0 -0
  193. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/winusb_driver.png +0 -0
  194. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/android_emulator.md +0 -0
  195. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/file.md +0 -0
  196. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/hci_socket.md +0 -0
  197. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/index.md +0 -0
  198. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/pty.md +0 -0
  199. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/serial.md +0 -0
  200. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/tcp_client.md +0 -0
  201. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/tcp_server.md +0 -0
  202. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/udp.md +0 -0
  203. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/usb.md +0 -0
  204. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/vhci.md +0 -0
  205. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/ws_client.md +0 -0
  206. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/ws_server.md +0 -0
  207. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/index.md +0 -0
  208. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_1.md +0 -0
  209. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_2.md +0 -0
  210. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_3.md +0 -0
  211. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_4.md +0 -0
  212. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_5.md +0 -0
  213. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_6.md +0 -0
  214. {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/theme/partials/footer.html +0 -0
  215. {bumble-0.0.155 → bumble-0.0.156}/environment.yml +0 -0
  216. {bumble-0.0.155 → bumble-0.0.156}/examples/README.md +0 -0
  217. {bumble-0.0.155 → bumble-0.0.156}/examples/a2dp_sink1.json +0 -0
  218. {bumble-0.0.155 → bumble-0.0.156}/examples/asha_sink1.json +0 -0
  219. {bumble-0.0.155 → bumble-0.0.156}/examples/asha_sink2.json +0 -0
  220. {bumble-0.0.155 → bumble-0.0.156}/examples/async_runner.py +0 -0
  221. {bumble-0.0.155 → bumble-0.0.156}/examples/battery_client.py +0 -0
  222. {bumble-0.0.155 → bumble-0.0.156}/examples/battery_server.py +0 -0
  223. {bumble-0.0.155 → bumble-0.0.156}/examples/classic1.json +0 -0
  224. {bumble-0.0.155 → bumble-0.0.156}/examples/classic2.json +0 -0
  225. {bumble-0.0.155 → bumble-0.0.156}/examples/device1.json +0 -0
  226. {bumble-0.0.155 → bumble-0.0.156}/examples/device2.json +0 -0
  227. {bumble-0.0.155 → bumble-0.0.156}/examples/device3.json +0 -0
  228. {bumble-0.0.155 → bumble-0.0.156}/examples/device_information_client.py +0 -0
  229. {bumble-0.0.155 → bumble-0.0.156}/examples/device_information_server.py +0 -0
  230. {bumble-0.0.155 → bumble-0.0.156}/examples/heart_rate_client.py +0 -0
  231. {bumble-0.0.155 → bumble-0.0.156}/examples/heart_rate_server.py +0 -0
  232. {bumble-0.0.155 → bumble-0.0.156}/examples/hfp_gateway.json +0 -0
  233. {bumble-0.0.155 → bumble-0.0.156}/examples/hfp_handsfree.html +0 -0
  234. {bumble-0.0.155 → bumble-0.0.156}/examples/hfp_handsfree.json +0 -0
  235. {bumble-0.0.155 → bumble-0.0.156}/examples/keyboard.html +0 -0
  236. {bumble-0.0.155 → bumble-0.0.156}/examples/keyboard.json +0 -0
  237. {bumble-0.0.155 → bumble-0.0.156}/examples/keyboard.py +0 -0
  238. {bumble-0.0.155 → bumble-0.0.156}/examples/run_a2dp_info.py +0 -0
  239. {bumble-0.0.155 → bumble-0.0.156}/examples/run_a2dp_sink.py +0 -0
  240. {bumble-0.0.155 → bumble-0.0.156}/examples/run_a2dp_source.py +0 -0
  241. {bumble-0.0.155 → bumble-0.0.156}/examples/run_advertiser.py +0 -0
  242. {bumble-0.0.155 → bumble-0.0.156}/examples/run_asha_sink.py +0 -0
  243. {bumble-0.0.155 → bumble-0.0.156}/examples/run_classic_discoverable.py +0 -0
  244. {bumble-0.0.155 → bumble-0.0.156}/examples/run_classic_discovery.py +0 -0
  245. {bumble-0.0.155 → bumble-0.0.156}/examples/run_connect_and_encrypt.py +0 -0
  246. {bumble-0.0.155 → bumble-0.0.156}/examples/run_controller.py +0 -0
  247. {bumble-0.0.155 → bumble-0.0.156}/examples/run_controller_with_scanner.py +0 -0
  248. {bumble-0.0.155 → bumble-0.0.156}/examples/run_device_with_snooper.py +0 -0
  249. {bumble-0.0.155 → bumble-0.0.156}/examples/run_gatt_client.py +0 -0
  250. {bumble-0.0.155 → bumble-0.0.156}/examples/run_gatt_client_and_server.py +0 -0
  251. {bumble-0.0.155 → bumble-0.0.156}/examples/run_gatt_server.py +0 -0
  252. {bumble-0.0.155 → bumble-0.0.156}/examples/run_hfp_gateway.py +0 -0
  253. {bumble-0.0.155 → bumble-0.0.156}/examples/run_hfp_handsfree.py +0 -0
  254. {bumble-0.0.155 → bumble-0.0.156}/examples/run_notifier.py +0 -0
  255. {bumble-0.0.155 → bumble-0.0.156}/examples/run_rfcomm_client.py +0 -0
  256. {bumble-0.0.155 → bumble-0.0.156}/examples/run_rfcomm_server.py +0 -0
  257. {bumble-0.0.155 → bumble-0.0.156}/examples/run_scanner.py +0 -0
  258. {bumble-0.0.155 → bumble-0.0.156}/noxfile.py +0 -0
  259. {bumble-0.0.155 → bumble-0.0.156}/pyproject.toml +0 -0
  260. {bumble-0.0.155 → bumble-0.0.156}/scripts/process_android_emulator_protos.sh +0 -0
  261. {bumble-0.0.155 → bumble-0.0.156}/scripts/process_android_netsim_protos.sh +0 -0
  262. {bumble-0.0.155 → bumble-0.0.156}/setup.py +0 -0
  263. {bumble-0.0.155 → bumble-0.0.156}/tasks.py +0 -0
  264. {bumble-0.0.155 → bumble-0.0.156}/tests/a2dp_test.py +0 -0
  265. {bumble-0.0.155 → bumble-0.0.156}/tests/avdtp_test.py +0 -0
  266. {bumble-0.0.155 → bumble-0.0.156}/tests/core_test.py +0 -0
  267. {bumble-0.0.155 → bumble-0.0.156}/tests/decoder_test.py +0 -0
  268. {bumble-0.0.155 → bumble-0.0.156}/tests/device_test.py +0 -0
  269. {bumble-0.0.155 → bumble-0.0.156}/tests/g722_sample.g722 +0 -0
  270. {bumble-0.0.155 → bumble-0.0.156}/tests/gatt_test.py +0 -0
  271. {bumble-0.0.155 → bumble-0.0.156}/tests/hci_data_001.bin +0 -0
  272. {bumble-0.0.155 → bumble-0.0.156}/tests/hci_test.py +0 -0
  273. {bumble-0.0.155 → bumble-0.0.156}/tests/import_test.py +0 -0
  274. {bumble-0.0.155 → bumble-0.0.156}/tests/keystore_test.py +0 -0
  275. {bumble-0.0.155 → bumble-0.0.156}/tests/l2cap_test.py +0 -0
  276. {bumble-0.0.155 → bumble-0.0.156}/tests/pytest.ini +0 -0
  277. {bumble-0.0.155 → bumble-0.0.156}/tests/rfcomm_test.py +0 -0
  278. {bumble-0.0.155 → bumble-0.0.156}/tests/sdp_test.py +0 -0
  279. {bumble-0.0.155 → bumble-0.0.156}/tests/self_test.py +0 -0
  280. {bumble-0.0.155 → bumble-0.0.156}/tests/smp_test.py +0 -0
  281. {bumble-0.0.155 → bumble-0.0.156}/tests/transport_test.py +0 -0
  282. {bumble-0.0.155 → bumble-0.0.156}/utils/generate_company_id_list.py +0 -0
  283. {bumble-0.0.155 → bumble-0.0.156}/web/index.html +0 -0
  284. {bumble-0.0.155 → bumble-0.0.156}/web/scanner.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: bumble
3
- Version: 0.0.155
3
+ Version: 0.0.156
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
5
  Home-page: https://github.com/google/bumble
6
6
  Author: Google
@@ -0,0 +1,76 @@
1
+ body, h1, h2, h3, h4, h5, h6 {
2
+ font-family: sans-serif;
3
+ }
4
+
5
+ #controlsDiv {
6
+ margin: 6px;
7
+ }
8
+
9
+ #connectionText {
10
+ background-color: rgb(239, 89, 75);
11
+ border: none;
12
+ border-radius: 4px;
13
+ padding: 8px;
14
+ display: inline-block;
15
+ margin: 4px;
16
+ }
17
+
18
+ #startButton {
19
+ padding: 4px;
20
+ margin: 6px;
21
+ }
22
+
23
+ #fftCanvas {
24
+ border-radius: 16px;
25
+ margin: 6px;
26
+ }
27
+
28
+ #bandwidthCanvas {
29
+ border: grey;
30
+ border-style: solid;
31
+ border-radius: 8px;
32
+ margin: 6px;
33
+ }
34
+
35
+ #streamStateText {
36
+ background-color: rgb(93, 165, 93);
37
+ border: none;
38
+ border-radius: 8px;
39
+ padding: 10px 20px;
40
+ display: inline-block;
41
+ margin: 6px;
42
+ }
43
+
44
+ #connectionStateText {
45
+ background-color: rgb(112, 146, 206);
46
+ border: none;
47
+ border-radius: 8px;
48
+ padding: 10px 20px;
49
+ display: inline-block;
50
+ margin: 6px;
51
+ }
52
+
53
+ #propertiesTable {
54
+ border: grey;
55
+ border-style: solid;
56
+ border-radius: 4px;
57
+ padding: 4px;
58
+ margin: 6px;
59
+ margin-left: 0px;
60
+ }
61
+
62
+ th, td {
63
+ padding-left: 6px;
64
+ padding-right: 6px;
65
+ }
66
+
67
+ .properties td:nth-child(even) {
68
+ background-color: #D6EEEE;
69
+ font-family: monospace;
70
+ }
71
+
72
+ .properties td:nth-child(odd) {
73
+ font-weight: bold;
74
+ }
75
+
76
+ .properties tr td:nth-child(2) { width: 150px; }
@@ -0,0 +1,34 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Bumble Speaker</title>
5
+ <script type="text/javascript" src="speaker.js"></script>
6
+ <link rel="stylesheet" href="speaker.css">
7
+ </head>
8
+ <body>
9
+ <h1><img src="logo.svg" width=100 height=100 style="vertical-align:middle" alt=""/>Bumble Virtual Speaker</h1>
10
+ <div id="connectionText"></div>
11
+ <div id="speaker">
12
+ <table><tr>
13
+ <td>
14
+ <table id="propertiesTable" class="properties">
15
+ <tr><td>Codec</td><td><span id="codecText"></span></td></tr>
16
+ <tr><td>Packets</td><td><span id="packetsReceivedText"></span></td></tr>
17
+ <tr><td>Bytes</td><td><span id="bytesReceivedText"></span></td></tr>
18
+ </table>
19
+ </td>
20
+ <td>
21
+ <canvas id="bandwidthCanvas" width="500", height="100">Bandwidth Graph</canvas>
22
+ </td>
23
+ </tr></table>
24
+ <span id="streamStateText">IDLE</span>
25
+ <span id="connectionStateText">NOT CONNECTED</span>
26
+ <div id="controlsDiv">
27
+ <button id="audioOnButton">Audio On</button>
28
+ <span id="audioSupportMessageText"></span>
29
+ </div>
30
+ <canvas id="fftCanvas" width="1024", height="300">Audio Frequencies Animation</canvas>
31
+ <audio id="audio"></audio>
32
+ </div>
33
+ </body>
34
+ </html>
@@ -0,0 +1,315 @@
1
+ (function () {
2
+ 'use strict';
3
+
4
+ const channelUrl = ((window.location.protocol === "https:") ? "wss://" : "ws://") + window.location.host + "/channel";
5
+ let channelSocket;
6
+ let connectionText;
7
+ let codecText;
8
+ let packetsReceivedText;
9
+ let bytesReceivedText;
10
+ let streamStateText;
11
+ let connectionStateText;
12
+ let controlsDiv;
13
+ let audioOnButton;
14
+ let mediaSource;
15
+ let sourceBuffer;
16
+ let audioElement;
17
+ let audioContext;
18
+ let audioAnalyzer;
19
+ let audioFrequencyBinCount;
20
+ let audioFrequencyData;
21
+ let packetsReceived = 0;
22
+ let bytesReceived = 0;
23
+ let audioState = "stopped";
24
+ let streamState = "IDLE";
25
+ let audioSupportMessageText;
26
+ let fftCanvas;
27
+ let fftCanvasContext;
28
+ let bandwidthCanvas;
29
+ let bandwidthCanvasContext;
30
+ let bandwidthBinCount;
31
+ let bandwidthBins = [];
32
+
33
+ const FFT_WIDTH = 800;
34
+ const FFT_HEIGHT = 256;
35
+ const BANDWIDTH_WIDTH = 500;
36
+ const BANDWIDTH_HEIGHT = 100;
37
+
38
+ function hexToBytes(hex) {
39
+ return Uint8Array.from(hex.match(/.{1,2}/g).map((byte) => parseInt(byte, 16)));
40
+ }
41
+
42
+ function init() {
43
+ initUI();
44
+ initMediaSource();
45
+ initAudioElement();
46
+ initAnalyzer();
47
+
48
+ connect();
49
+ }
50
+
51
+ function initUI() {
52
+ controlsDiv = document.getElementById("controlsDiv");
53
+ controlsDiv.style.visibility = "hidden";
54
+ connectionText = document.getElementById("connectionText");
55
+ audioOnButton = document.getElementById("audioOnButton");
56
+ codecText = document.getElementById("codecText");
57
+ packetsReceivedText = document.getElementById("packetsReceivedText");
58
+ bytesReceivedText = document.getElementById("bytesReceivedText");
59
+ streamStateText = document.getElementById("streamStateText");
60
+ connectionStateText = document.getElementById("connectionStateText");
61
+ audioSupportMessageText = document.getElementById("audioSupportMessageText");
62
+
63
+ audioOnButton.onclick = () => startAudio();
64
+
65
+ setConnectionText("");
66
+
67
+ requestAnimationFrame(onAnimationFrame);
68
+ }
69
+
70
+ function initMediaSource() {
71
+ mediaSource = new MediaSource();
72
+ mediaSource.onsourceopen = onMediaSourceOpen;
73
+ mediaSource.onsourceclose = onMediaSourceClose;
74
+ mediaSource.onsourceended = onMediaSourceEnd;
75
+ }
76
+
77
+ function initAudioElement() {
78
+ audioElement = document.getElementById("audio");
79
+ audioElement.src = URL.createObjectURL(mediaSource);
80
+ // audioElement.controls = true;
81
+ }
82
+
83
+ function initAnalyzer() {
84
+ fftCanvas = document.getElementById("fftCanvas");
85
+ fftCanvas.width = FFT_WIDTH
86
+ fftCanvas.height = FFT_HEIGHT
87
+ fftCanvasContext = fftCanvas.getContext('2d');
88
+ fftCanvasContext.fillStyle = "rgb(0, 0, 0)";
89
+ fftCanvasContext.fillRect(0, 0, FFT_WIDTH, FFT_HEIGHT);
90
+
91
+ bandwidthCanvas = document.getElementById("bandwidthCanvas");
92
+ bandwidthCanvas.width = BANDWIDTH_WIDTH
93
+ bandwidthCanvas.height = BANDWIDTH_HEIGHT
94
+ bandwidthCanvasContext = bandwidthCanvas.getContext('2d');
95
+ bandwidthCanvasContext.fillStyle = "rgb(255, 255, 255)";
96
+ bandwidthCanvasContext.fillRect(0, 0, BANDWIDTH_WIDTH, BANDWIDTH_HEIGHT);
97
+ }
98
+
99
+ function startAnalyzer() {
100
+ // FFT
101
+ if (audioElement.captureStream !== undefined) {
102
+ audioContext = new AudioContext();
103
+ audioAnalyzer = audioContext.createAnalyser();
104
+ audioAnalyzer.fftSize = 128;
105
+ audioFrequencyBinCount = audioAnalyzer.frequencyBinCount;
106
+ audioFrequencyData = new Uint8Array(audioFrequencyBinCount);
107
+ const stream = audioElement.captureStream();
108
+ const source = audioContext.createMediaStreamSource(stream);
109
+ source.connect(audioAnalyzer);
110
+ }
111
+
112
+ // Bandwidth
113
+ bandwidthBinCount = BANDWIDTH_WIDTH / 2;
114
+ bandwidthBins = [];
115
+ }
116
+
117
+ function setConnectionText(message) {
118
+ connectionText.innerText = message;
119
+ if (message.length == 0) {
120
+ connectionText.style.display = "none";
121
+ } else {
122
+ connectionText.style.display = "inline-block";
123
+ }
124
+ }
125
+
126
+ function setStreamState(state) {
127
+ streamState = state;
128
+ streamStateText.innerText = streamState;
129
+ }
130
+
131
+ function onAnimationFrame() {
132
+ // FFT
133
+ if (audioAnalyzer !== undefined) {
134
+ audioAnalyzer.getByteFrequencyData(audioFrequencyData);
135
+ fftCanvasContext.fillStyle = "rgb(0, 0, 0)";
136
+ fftCanvasContext.fillRect(0, 0, FFT_WIDTH, FFT_HEIGHT);
137
+ const barCount = audioFrequencyBinCount;
138
+ const barWidth = (FFT_WIDTH / audioFrequencyBinCount) - 1;
139
+ for (let bar = 0; bar < barCount; bar++) {
140
+ const barHeight = audioFrequencyData[bar];
141
+ fftCanvasContext.fillStyle = `rgb(${barHeight / 256 * 200 + 50}, 50, ${50 + 2 * bar})`;
142
+ fftCanvasContext.fillRect(bar * (barWidth + 1), FFT_HEIGHT - barHeight, barWidth, barHeight);
143
+ }
144
+ }
145
+
146
+ // Bandwidth
147
+ bandwidthCanvasContext.fillStyle = "rgb(255, 255, 255)";
148
+ bandwidthCanvasContext.fillRect(0, 0, BANDWIDTH_WIDTH, BANDWIDTH_HEIGHT);
149
+ bandwidthCanvasContext.fillStyle = `rgb(100, 100, 100)`;
150
+ for (let t = 0; t < bandwidthBins.length; t++) {
151
+ const lineHeight = (bandwidthBins[t] / 1000) * BANDWIDTH_HEIGHT;
152
+ bandwidthCanvasContext.fillRect(t * 2, BANDWIDTH_HEIGHT - lineHeight, 2, lineHeight);
153
+ }
154
+
155
+ // Display again at the next frame
156
+ requestAnimationFrame(onAnimationFrame);
157
+ }
158
+
159
+ function onMediaSourceOpen() {
160
+ console.log(this.readyState);
161
+ sourceBuffer = mediaSource.addSourceBuffer("audio/aac");
162
+ }
163
+
164
+ function onMediaSourceClose() {
165
+ console.log(this.readyState);
166
+ }
167
+
168
+ function onMediaSourceEnd() {
169
+ console.log(this.readyState);
170
+ }
171
+
172
+ async function startAudio() {
173
+ try {
174
+ console.log("starting audio...");
175
+ audioOnButton.disabled = true;
176
+ audioState = "starting";
177
+ await audioElement.play();
178
+ console.log("audio started");
179
+ audioState = "playing";
180
+ startAnalyzer();
181
+ } catch(error) {
182
+ console.error(`play failed: ${error}`);
183
+ audioState = "stopped";
184
+ audioOnButton.disabled = false;
185
+ }
186
+ }
187
+
188
+ function onAudioPacket(packet) {
189
+ if (audioState != "stopped") {
190
+ // Queue the audio packet.
191
+ sourceBuffer.appendBuffer(packet);
192
+ }
193
+
194
+ packetsReceived += 1;
195
+ packetsReceivedText.innerText = packetsReceived;
196
+ bytesReceived += packet.byteLength;
197
+ bytesReceivedText.innerText = bytesReceived;
198
+
199
+ bandwidthBins[bandwidthBins.length] = packet.byteLength;
200
+ if (bandwidthBins.length > bandwidthBinCount) {
201
+ bandwidthBins.shift();
202
+ }
203
+ }
204
+
205
+ function onChannelOpen() {
206
+ console.log('channel OPEN');
207
+ setConnectionText("");
208
+ controlsDiv.style.visibility = "visible";
209
+
210
+ // Handshake with the backend.
211
+ sendMessage({
212
+ type: "hello"
213
+ });
214
+ }
215
+
216
+ function onChannelClose() {
217
+ console.log('channel CLOSED');
218
+ setConnectionText("Connection to CLI app closed, restart it and reload this page.");
219
+ controlsDiv.style.visibility = "hidden";
220
+ }
221
+
222
+ function onChannelError(error) {
223
+ console.log(`channel ERROR: ${error}`);
224
+ setConnectionText(`Connection to CLI app error ({${error}}), restart it and reload this page.`);
225
+ controlsDiv.style.visibility = "hidden";
226
+ }
227
+
228
+ function onChannelMessage(message) {
229
+ if (typeof message.data === 'string' || message.data instanceof String) {
230
+ // JSON message.
231
+ const jsonMessage = JSON.parse(message.data);
232
+ console.log(`channel MESSAGE: ${message.data}`);
233
+
234
+ // Dispatch the message.
235
+ const handlerName = `on${jsonMessage.type.charAt(0).toUpperCase()}${jsonMessage.type.slice(1)}Message`
236
+ const handler = messageHandlers[handlerName];
237
+ if (handler !== undefined) {
238
+ const params = jsonMessage.params;
239
+ if (params === undefined) {
240
+ params = {};
241
+ }
242
+ handler(params);
243
+ } else {
244
+ console.warn(`unhandled message: ${jsonMessage.type}`)
245
+ }
246
+ } else {
247
+ // BINARY audio data.
248
+ onAudioPacket(message.data);
249
+ }
250
+ }
251
+
252
+ function onHelloMessage(params) {
253
+ codecText.innerText = params.codec;
254
+ if (params.codec != "aac") {
255
+ audioOnButton.disabled = true;
256
+ audioSupportMessageText.innerText = "Only AAC can be played, audio will be disabled";
257
+ audioSupportMessageText.style.display = "inline-block";
258
+ } else {
259
+ audioSupportMessageText.innerText = "";
260
+ audioSupportMessageText.style.display = "none";
261
+ }
262
+ if (params.streamState) {
263
+ setStreamState(params.streamState);
264
+ }
265
+ }
266
+
267
+ function onStartMessage(params) {
268
+ setStreamState("STARTED");
269
+ }
270
+
271
+ function onStopMessage(params) {
272
+ setStreamState("STOPPED");
273
+ }
274
+
275
+ function onSuspendMessage(params) {
276
+ setStreamState("SUSPENDED");
277
+ }
278
+
279
+ function onConnectionMessage(params) {
280
+ connectionStateText.innerText = `CONNECTED: ${params.peer_name} (${params.peer_address})`;
281
+ }
282
+
283
+ function onDisconnectionMessage(params) {
284
+ connectionStateText.innerText = "DISCONNECTED";
285
+ }
286
+
287
+ function sendMessage(message) {
288
+ channelSocket.send(JSON.stringify(message));
289
+ }
290
+
291
+ function connect() {
292
+ console.log("connecting to CLI app");
293
+
294
+ channelSocket = new WebSocket(channelUrl);
295
+ channelSocket.binaryType = "arraybuffer";
296
+ channelSocket.onopen = onChannelOpen;
297
+ channelSocket.onclose = onChannelClose;
298
+ channelSocket.onerror = onChannelError;
299
+ channelSocket.onmessage = onChannelMessage;
300
+ }
301
+
302
+ const messageHandlers = {
303
+ onHelloMessage,
304
+ onStartMessage,
305
+ onStopMessage,
306
+ onSuspendMessage,
307
+ onConnectionMessage,
308
+ onDisconnectionMessage
309
+ }
310
+
311
+ window.onload = (event) => {
312
+ init();
313
+ }
314
+
315
+ }());