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.
- {bumble-0.0.155 → bumble-0.0.156}/PKG-INFO +1 -1
- bumble-0.0.156/apps/speaker/speaker.css +76 -0
- bumble-0.0.156/apps/speaker/speaker.html +34 -0
- bumble-0.0.156/apps/speaker/speaker.js +315 -0
- bumble-0.0.156/apps/speaker/speaker.py +747 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/_version.py +2 -2
- {bumble-0.0.155 → bumble-0.0.156}/bumble/a2dp.py +1 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/avdtp.py +50 -31
- bumble-0.0.156/bumble/codecs.py +381 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/device.py +7 -3
- {bumble-0.0.155 → bumble-0.0.156}/bumble/hci.py +13 -9
- {bumble-0.0.155 → bumble-0.0.156}/bumble/host.py +7 -1
- bumble-0.0.156/bumble/transport/py.typed +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/PKG-INFO +1 -1
- {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/SOURCES.txt +12 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/entry_points.txt +1 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/requires.txt +4 -3
- bumble-0.0.156/docs/images/logo_framed.svg +42 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/mkdocs.yml +1 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/index.md +1 -0
- bumble-0.0.156/docs/mkdocs/src/apps_and_tools/speaker.md +86 -0
- bumble-0.0.156/docs/mkdocs/src/images/speaker_screenshot.png +0 -0
- bumble-0.0.156/examples/run_classic_connect.py +119 -0
- bumble-0.0.156/examples/speaker.json +5 -0
- {bumble-0.0.155 → bumble-0.0.156}/setup.cfg +5 -3
- bumble-0.0.156/speaker.html +28 -0
- bumble-0.0.156/tests/codecs_test.py +67 -0
- bumble-0.0.155/examples/run_classic_connect.py +0 -111
- {bumble-0.0.155 → bumble-0.0.156}/.git-blame-ignore-revs +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/code-check.yml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/codeql-analysis.yml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/python-build-test.yml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/.github/workflows/python-publish.yml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/.gitignore +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/.vscode/settings.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/CONTRIBUTING.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/LICENSE +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/README.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/README.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/bench.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/console.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/controller_info.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/controllers.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/gatt_dump.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/gg_bridge.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/hci_bridge.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/l2cap_bridge.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/link_relay/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/link_relay/link_relay.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/link_relay/logging.yml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/pair.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/pandora_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/scan.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/show.py +0 -0
- {bumble-0.0.155/bumble/transport/grpc_protobuf → bumble-0.0.156/apps/speaker}/__init__.py +0 -0
- /bumble-0.0.155/docs/images/logo_framed.svg → /bumble-0.0.156/apps/speaker/logo.svg +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/unbond.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/apps/usb_probe.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/att.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/bridge.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/colors.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/company_ids.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/controller.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/core.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/crypto.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/decoder.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/gap.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/gatt.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/gatt_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/gatt_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/helpers.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/hfp.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/keys.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/l2cap.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/link.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pairing.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/config.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/device.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/host.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/py.typed +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/security.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/pandora/utils.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/asha_service.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/battery_service.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/device_information_service.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/heart_rate_service.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/profiles/py.typed +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/py.typed +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/rfcomm.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/sdp.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/smp.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/snoop.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/android_emulator.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/android_netsim.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/common.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/file.py +0 -0
- /bumble-0.0.155/bumble/transport/py.typed → /bumble-0.0.156/bumble/transport/grpc_protobuf/__init__.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/common_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/common_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/common_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_device_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_packets_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/emulated_bluetooth_vhci_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/grpc_endpoint_description_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/hci_packet_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/hci_packet_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/hci_packet_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/packet_streamer_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/packet_streamer_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/packet_streamer_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/startup_pb2.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/startup_pb2.pyi +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/grpc_protobuf/startup_pb2_grpc.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/hci_socket.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/pty.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/pyusb.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/serial.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/tcp_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/tcp_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/udp.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/usb.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/vhci.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/ws_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/transport/ws_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble/utils.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/dependency_links.txt +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/bumble.egg-info/top_level.txt +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/README.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.svg +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Artboard0.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Document.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Manifest.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/Thumbnail.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo.vectornator/UndoHistory.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Artboard0.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Document.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Manifest.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/Thumbnail.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/images/logo_framed.vectornator/UndoHistory.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/requirements.txt +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/api/examples.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/api/guide.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/api/reference.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/bench.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/console.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/gatt_dump.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/gg_bridge.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/hci_bridge.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/link_relay.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/pair.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/show.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/unbond.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/apps_and_tools/usb_probe.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/controller.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/gatt.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/host.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/components/security_manager.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/development/code_style.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/development/contributing.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/development/python_environments.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/examples/index.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/getting_started.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/hardware/index.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/bumble_layers.svg +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/console_screenshot.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/favicon.ico +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/logo.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/images/logo_framed.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/index.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/android.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/index.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/linux.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/macos.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/windows.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/platforms/winusb_driver.png +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/android_emulator.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/file.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/hci_socket.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/index.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/pty.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/serial.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/tcp_client.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/tcp_server.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/udp.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/usb.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/vhci.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/ws_client.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/transports/ws_server.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/index.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_1.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_2.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_3.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_4.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_5.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/src/use_cases/use_case_6.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/docs/mkdocs/theme/partials/footer.html +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/environment.yml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/README.md +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/a2dp_sink1.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/asha_sink1.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/asha_sink2.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/async_runner.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/battery_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/battery_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/classic1.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/classic2.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/device1.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/device2.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/device3.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/device_information_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/device_information_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/heart_rate_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/heart_rate_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/hfp_gateway.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/hfp_handsfree.html +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/hfp_handsfree.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/keyboard.html +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/keyboard.json +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/keyboard.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_a2dp_info.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_a2dp_sink.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_a2dp_source.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_advertiser.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_asha_sink.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_classic_discoverable.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_classic_discovery.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_connect_and_encrypt.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_controller.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_controller_with_scanner.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_device_with_snooper.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_gatt_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_gatt_client_and_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_gatt_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_hfp_gateway.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_hfp_handsfree.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_notifier.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_rfcomm_client.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_rfcomm_server.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/examples/run_scanner.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/noxfile.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/pyproject.toml +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/scripts/process_android_emulator_protos.sh +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/scripts/process_android_netsim_protos.sh +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/setup.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tasks.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/a2dp_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/avdtp_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/core_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/decoder_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/device_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/g722_sample.g722 +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/gatt_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/hci_data_001.bin +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/hci_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/import_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/keystore_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/l2cap_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/pytest.ini +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/rfcomm_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/sdp_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/self_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/smp_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/tests/transport_test.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/utils/generate_company_id_list.py +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/web/index.html +0 -0
- {bumble-0.0.155 → bumble-0.0.156}/web/scanner.py +0 -0
|
@@ -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
|
+
}());
|