Files
bumble_mirror/apps_and_tools/auracast.html
T
2026-01-01 02:28:22 +08:00

2838 lines
50 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<link rel="prev" href="index.html">
<link rel="next" href="console.html">
<link rel="icon" href="../images/favicon.ico">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.7.1">
<title>Auracast - Bumble</title>
<link rel="stylesheet" href="../assets/stylesheets/main.484c7ddc.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../assets/_mkdocstrings.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#auracast-tool" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href="../index.html" title="Bumble" class="md-header__button md-logo" aria-label="Bumble" data-md-component="logo">
<img src="../images/logo.png" alt="logo">
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
Bumble
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Auracast
</span>
</div>
</div>
</div>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<div class="md-header__source">
<a href="https://github.com/google/bumble" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--primary" aria-label="Navigation" data-md-level="0">
<label class="md-nav__title" for="__drawer">
<a href="../index.html" title="Bumble" class="md-nav__button md-logo" aria-label="Bumble" data-md-component="logo">
<img src="../images/logo.png" alt="logo">
</a>
Bumble
</label>
<div class="md-nav__source">
<a href="https://github.com/google/bumble" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 7.1.0 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2025 Fonticons, Inc.--><path d="M439.6 236.1 244 40.5c-5.4-5.5-12.8-8.5-20.4-8.5s-15 3-20.4 8.4L162.5 81l51.5 51.5c27.1-9.1 52.7 16.8 43.4 43.7l49.7 49.7c34.2-11.8 61.2 31 35.5 56.7-26.5 26.5-70.2-2.9-56-37.3L240.3 199v121.9c25.3 12.5 22.3 41.8 9.1 55-6.4 6.4-15.2 10.1-24.3 10.1s-17.8-3.6-24.3-10.1c-17.6-17.6-11.1-46.9 11.2-56v-123c-20.8-8.5-24.6-30.7-18.6-45L142.6 101 8.5 235.1C3 240.6 0 247.9 0 255.5s3 15 8.5 20.4l195.6 195.7c5.4 5.4 12.7 8.4 20.4 8.4s15-3 20.4-8.4l194.7-194.7c5.4-5.4 8.4-12.8 8.4-20.4s-3-15-8.4-20.4"/></svg>
</div>
<div class="md-source__repository">
GitHub
</div>
</a>
</div>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../index.html" class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../getting_started.html" class="md-nav__link">
<span class="md-ellipsis">
Getting Started
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Development
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Development
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../development/python_environments.html" class="md-nav__link">
<span class="md-ellipsis">
Python Environments
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../development/contributing.html" class="md-nav__link">
<span class="md-ellipsis">
Contributing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../development/code_style.html" class="md-nav__link">
<span class="md-ellipsis">
Code Style
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
<div class="md-nav__link md-nav__container">
<a href="../use_cases/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Use Cases
</span>
</a>
<label class="md-nav__link " for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Use Cases
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../use_cases/use_case_1.html" class="md-nav__link">
<span class="md-ellipsis">
Use Case 1
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use_cases/use_case_2.html" class="md-nav__link">
<span class="md-ellipsis">
Use Case 2
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use_cases/use_case_3.html" class="md-nav__link">
<span class="md-ellipsis">
Use Case 3
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use_cases/use_case_4.html" class="md-nav__link">
<span class="md-ellipsis">
Use Case 4
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use_cases/use_case_5.html" class="md-nav__link">
<span class="md-ellipsis">
Use Case 5
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../use_cases/use_case_6.html" class="md-nav__link">
<span class="md-ellipsis">
Use Case 6
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
Components
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
Components
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../components/controller.html" class="md-nav__link">
<span class="md-ellipsis">
Controller
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../components/host.html" class="md-nav__link">
<span class="md-ellipsis">
Host
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../components/gatt.html" class="md-nav__link">
<span class="md-ellipsis">
GATT
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../components/security_manager.html" class="md-nav__link">
<span class="md-ellipsis">
Security Manager
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<div class="md-nav__link md-nav__container">
<a href="../transports/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Transports
</span>
</a>
<label class="md-nav__link " for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Transports
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../transports/serial.html" class="md-nav__link">
<span class="md-ellipsis">
Serial
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/usb.html" class="md-nav__link">
<span class="md-ellipsis">
USB
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/pty.html" class="md-nav__link">
<span class="md-ellipsis">
PTY
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/udp.html" class="md-nav__link">
<span class="md-ellipsis">
UDP
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/tcp_client.html" class="md-nav__link">
<span class="md-ellipsis">
TCP Client
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/tcp_server.html" class="md-nav__link">
<span class="md-ellipsis">
TCP Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/ws_client.html" class="md-nav__link">
<span class="md-ellipsis">
WebSocket Client
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/ws_server.html" class="md-nav__link">
<span class="md-ellipsis">
WebSocket Server
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/vhci.html" class="md-nav__link">
<span class="md-ellipsis">
VHCI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/hci_socket.html" class="md-nav__link">
<span class="md-ellipsis">
HCI Socket
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/android_emulator.html" class="md-nav__link">
<span class="md-ellipsis">
Android Emulator
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../transports/file.html" class="md-nav__link">
<span class="md-ellipsis">
File
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_7" >
<div class="md-nav__link md-nav__container">
<a href="../drivers/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Drivers
</span>
</a>
<label class="md-nav__link " for="__nav_7" id="__nav_7_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
Drivers
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../drivers/realtek.html" class="md-nav__link">
<span class="md-ellipsis">
Realtek
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../drivers/intel.html" class="md-nav__link">
<span class="md-ellipsis">
Intel
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
<span class="md-ellipsis">
API
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
API
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../api/guide.html" class="md-nav__link">
<span class="md-ellipsis">
Guide
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api/examples.html" class="md-nav__link">
<span class="md-ellipsis">
Examples
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../api/reference.html" class="md-nav__link">
<span class="md-ellipsis">
Reference
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" checked>
<div class="md-nav__link md-nav__container">
<a href="index.html" class="md-nav__link ">
<span class="md-ellipsis">
Apps & Tools
</span>
</a>
<label class="md-nav__link " for="__nav_9" id="__nav_9_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
Apps & Tools
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<a href="auracast.html" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Auracast
</span>
</a>
</li>
<li class="md-nav__item">
<a href="console.html" class="md-nav__link">
<span class="md-ellipsis">
Console
</span>
</a>
</li>
<li class="md-nav__item">
<a href="bench.html" class="md-nav__link">
<span class="md-ellipsis">
Bench
</span>
</a>
</li>
<li class="md-nav__item">
<a href="speaker.html" class="md-nav__link">
<span class="md-ellipsis">
Speaker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="hci_bridge.html" class="md-nav__link">
<span class="md-ellipsis">
HCI Bridge
</span>
</a>
</li>
<li class="md-nav__item">
<a href="gg_bridge.html" class="md-nav__link">
<span class="md-ellipsis">
Golden Gate Bridge
</span>
</a>
</li>
<li class="md-nav__item">
<a href="show.html" class="md-nav__link">
<span class="md-ellipsis">
Show
</span>
</a>
</li>
<li class="md-nav__item">
<a href="gatt_dump.html" class="md-nav__link">
<span class="md-ellipsis">
GATT Dump
</span>
</a>
</li>
<li class="md-nav__item">
<a href="pair.html" class="md-nav__link">
<span class="md-ellipsis">
Pair
</span>
</a>
</li>
<li class="md-nav__item">
<a href="unbond.html" class="md-nav__link">
<span class="md-ellipsis">
Unbond
</span>
</a>
</li>
<li class="md-nav__item">
<a href="usb_probe.html" class="md-nav__link">
<span class="md-ellipsis">
USB Probe
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_10" >
<div class="md-nav__link md-nav__container">
<a href="../hardware/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Hardware
</span>
</a>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
Hardware
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_11" >
<div class="md-nav__link md-nav__container">
<a href="../platforms/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Platforms
</span>
</a>
<label class="md-nav__link " for="__nav_11" id="__nav_11_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
Platforms
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../platforms/macos.html" class="md-nav__link">
<span class="md-ellipsis">
macOS
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../platforms/linux.html" class="md-nav__link">
<span class="md-ellipsis">
Linux
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../platforms/windows.html" class="md-nav__link">
<span class="md-ellipsis">
Windows
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../platforms/android.html" class="md-nav__link">
<span class="md-ellipsis">
Android
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../platforms/zephyr.html" class="md-nav__link">
<span class="md-ellipsis">
Zephyr
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_12" >
<div class="md-nav__link md-nav__container">
<a href="../examples/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Examples
</span>
</a>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_12_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_12">
<span class="md-nav__icon md-icon"></span>
Examples
</label>
<ul class="md-nav__list" data-md-scrollfix>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_13" >
<div class="md-nav__link md-nav__container">
<a href="../extras/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Extras
</span>
</a>
<label class="md-nav__link " for="__nav_13" id="__nav_13_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
Extras
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../extras/android_remote_hci.html" class="md-nav__link">
<span class="md-ellipsis">
Android Remote HCI
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../extras/android_bt_bench.html" class="md-nav__link">
<span class="md-ellipsis">
Android BT Bench
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_14" >
<div class="md-nav__link md-nav__container">
<a href="../hive/index.html" class="md-nav__link ">
<span class="md-ellipsis">
Hive
</span>
</a>
<label class="md-nav__link " for="__nav_14" id="__nav_14_label" tabindex="0">
<span class="md-nav__icon md-icon"></span>
</label>
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
Hive
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../hive/web/speaker/speaker.html" class="md-nav__link">
<span class="md-ellipsis">
Speaker
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hive/web/scanner/scanner.html" class="md-nav__link">
<span class="md-ellipsis">
Scanner
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../hive/web/heart_rate_monitor/heart_rate_monitor.html" class="md-nav__link">
<span class="md-ellipsis">
Heart Rate Monitor
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="auracast-tool">AURACAST TOOL<a class="headerlink" href="#auracast-tool" title="Permanent link">&para;</a></h1>
<p>The "auracast" tool implements commands that implement broadcasting, receiving
and controlling LE Audio broadcasts.</p>
<div class="tabbed-set tabbed-alternate" data-tabs="1:2"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Running as an installed package</label><label for="__tabbed_1_2">Running from source</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code>$ bumble-auracast
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code>$ python3 apps/auracast.py &lt;args&gt;
</code></pre></div>
</div>
</div>
</div>
<h1 id="python-dependencies">Python Dependencies<a class="headerlink" href="#python-dependencies" title="Permanent link">&para;</a></h1>
<p>Try installing the optional <code>[auracast]</code> dependencies:</p>
<div class="tabbed-set tabbed-alternate" data-tabs="2:2"><input checked="checked" id="__tabbed_2_1" name="__tabbed_2" type="radio" /><input id="__tabbed_2_2" name="__tabbed_2" type="radio" /><div class="tabbed-labels"><label for="__tabbed_2_1">From source</label><label for="__tabbed_2_2">From PyPI</label></div>
<div class="tabbed-content">
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">&quot;.[auracast]&quot;</span>
</code></pre></div>
</div>
<div class="tabbed-block">
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">&quot;bumble[auracast]&quot;</span>
</code></pre></div>
</div>
</div>
</div>
<h2 id="lc3">LC3<a class="headerlink" href="#lc3" title="Permanent link">&para;</a></h2>
<p>The <code>auracast</code> app depends on the <code>lc3</code> python module, which is available
either as PyPI module (currently only available for Linux x86_64).
When installing Bumble with the optional <code>auracast</code> dependency, the <code>lc3</code>
module will be installed from the <code>lc3py</code> PyPI package if available.
If not, you will need to install it separately. This can be done with:
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>python3<span class="w"> </span>-m<span class="w"> </span>pip<span class="w"> </span>install<span class="w"> </span><span class="s2">&quot;git+https://github.com/google/liblc3.git&quot;</span>
</code></pre></div></p>
<h2 id="sounddevice">SoundDevice<a class="headerlink" href="#sounddevice" title="Permanent link">&para;</a></h2>
<p>The <code>sounddevice</code> module is required for audio output to the host's sound
output device(s) and/or input from the host's input device(s).
If not installed, the <code>auracast</code> app is still functional, but will be limited
to non-device inputs and output (files, external processes, ...)</p>
<p>On macOS and Windows, the <code>sounddevice</code> module gets installed with the
native PortAudio libraries included.</p>
<p>For Linux, however, PortAudio must be installed separately.
This is typically done with a command like:
<div class="highlight"><pre><span></span><code>$<span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>libportaudio2
</code></pre></div></p>
<p>Visit the <a href="https://python-sounddevice.readthedocs.io/">sounddevice documentation</a>
for details.</p>
<h1 id="general-usage">General Usage<a class="headerlink" href="#general-usage" title="Permanent link">&para;</a></h1>
<div class="highlight"><pre><span></span><code>Usage: bumble-auracast [OPTIONS] COMMAND [ARGS]...
Options:
--help Show this message and exit.
Commands:
assist Scan for broadcasts on behalf of an audio server
pair Pair with an audio server
receive Receive a broadcast source
scan Scan for public broadcasts
transmit Transmit a broadcast source
</code></pre></div>
<p>Use <code>bumble-auracast &lt;command&gt; --help</code> to get more detailed usage information
for a specific <code>&lt;command&gt;</code>.</p>
<h2 id="assist"><code>assist</code><a class="headerlink" href="#assist" title="Permanent link">&para;</a></h2>
<p>Act as a broadcast assistant.</p>
<p>Use <code>bumble-auracast assist --help</code> for details on the commands and options.</p>
<p>The assistant commands are:</p>
<h3 id="monitor-state"><code>monitor-state</code><a class="headerlink" href="#monitor-state" title="Permanent link">&para;</a></h3>
<p>Subscribe to the state characteristic and monitor changes.</p>
<h3 id="add-source"><code>add-source</code><a class="headerlink" href="#add-source" title="Permanent link">&para;</a></h3>
<p>Add a broadcast source. This will instruct the device to start
receiving a broadcast.</p>
<h3 id="modify-source"><code>modify-source</code><a class="headerlink" href="#modify-source" title="Permanent link">&para;</a></h3>
<p>Modify a broadcast source.</p>
<h3 id="remove-source"><code>remove-source</code><a class="headerlink" href="#remove-source" title="Permanent link">&para;</a></h3>
<p>Remote a broadcast source.</p>
<h2 id="pair"><code>pair</code><a class="headerlink" href="#pair" title="Permanent link">&para;</a></h2>
<p>Pair with a device.</p>
<h2 id="receive"><code>receive</code><a class="headerlink" href="#receive" title="Permanent link">&para;</a></h2>
<p>Receive a broadcast source.</p>
<p>The <code>--output</code> option specifies where to send the decoded audio samples.
The following outputs are supported:</p>
<h3 id="sound-device">Sound Device<a class="headerlink" href="#sound-device" title="Permanent link">&para;</a></h3>
<p>The <code>--output</code> argument is either <code>device</code>, to send the audio to the hosts's default sound device, or <code>device:&lt;DEVICE_ID&gt;</code> where <code>&lt;DEVICE_ID&gt;</code>
is the integer ID of one of the available sound devices.
When invoked with <code>--output "device:?"</code>, a list of available devices and
their IDs is printed out.</p>
<h3 id="standard-output">Standard Output<a class="headerlink" href="#standard-output" title="Permanent link">&para;</a></h3>
<p>With <code>--output stdout</code>, the decoded audio samples are written to the
standard output (currently always as float32 PCM samples)</p>
<h3 id="ffplay">FFPlay<a class="headerlink" href="#ffplay" title="Permanent link">&para;</a></h3>
<p>With <code>--output ffplay</code>, the decoded audio samples are piped to <code>ffplay</code>
in a child process. This option is only available if <code>ffplay</code> is a command that is available on the host.</p>
<h3 id="file">File<a class="headerlink" href="#file" title="Permanent link">&para;</a></h3>
<p>With <code>--output &lt;filename&gt;</code> or <code>--output file:&lt;filename&gt;</code>, the decoded audio
samples are written to a file (currently always as float32 PCM)</p>
<h2 id="transmit"><code>transmit</code><a class="headerlink" href="#transmit" title="Permanent link">&para;</a></h2>
<p>Broadcast an audio source as a transmitter.</p>
<p>The <code>--input</code> and <code>--input-format</code> options specify what audio input
source to transmit.
The following inputs are supported:</p>
<h3 id="sound-device_1">Sound Device<a class="headerlink" href="#sound-device_1" title="Permanent link">&para;</a></h3>
<p>The <code>--input</code> argument is either <code>device</code>, to use the host's default sound
device (typically a builtin microphone), or <code>device:&lt;DEVICE_ID&gt;</code> where
<code>&lt;DEVICE_ID&gt;</code> is the integer ID of one of the available sound devices.
When invoked with <code>--input "device:?"</code>, a list of available devices and their
IDs is printed out.</p>
<h3 id="standard-input">Standard Input<a class="headerlink" href="#standard-input" title="Permanent link">&para;</a></h3>
<p>With <code>--input stdout</code>, the audio samples are read from the standard input.
(currently always as int16 PCM).</p>
<h3 id="file_1">File<a class="headerlink" href="#file_1" title="Permanent link">&para;</a></h3>
<p>With <code>--input &lt;filename&gt;</code> or <code>--input file:&lt;filename&gt;</code>, the audio samples
are read from a .wav or raw PCM file.</p>
<p>Use the <code>--input-format &lt;FORMAT&gt;</code> option to specify the format of the audio
samples in raw PCM files. <code>&lt;FORMAT&gt;</code> is expressed as:
<code>&lt;sample-type&gt;,&lt;sample-rate&gt;,&lt;channels&gt;</code>
(the only supported <sample-type> currently is 'int16le' for 16 bit signed integers with little-endian byte order)</p>
<h2 id="scan"><code>scan</code><a class="headerlink" href="#scan" title="Permanent link">&para;</a></h2>
<p>Scan for public broadcasts.</p>
<p>A live display of the available broadcasts is displayed continuously.</p>
<h1 id="compatibility-with-some-products">Compatibility With Some Products<a class="headerlink" href="#compatibility-with-some-products" title="Permanent link">&para;</a></h1>
<p>The <code>auracast</code> app has been tested for compatibility with a few products.
The list is still very limited. Please let us know if there are products
that are not working well, or if there are specific instructions that should
be shared to allow better compatibiity with certain products.</p>
<h2 id="transmitters">Transmitters<a class="headerlink" href="#transmitters" title="Permanent link">&para;</a></h2>
<p>The <code>receive</code> command has been tested to successfully receive broadcasts from
the following transmitters:</p>
<ul>
<li>JBL GO 4</li>
<li>Flairmesh FlooGoo FMA120</li>
<li>Eppfun AK3040Pro Max</li>
<li>HIGHGAZE BA-25T</li>
<li>Nexum Audio VOCE and USB dongle</li>
</ul>
<h2 id="receivers">Receivers<a class="headerlink" href="#receivers" title="Permanent link">&para;</a></h2>
<h3 id="pixel-buds-pro-2">Pixel Buds Pro 2<a class="headerlink" href="#pixel-buds-pro-2" title="Permanent link">&para;</a></h3>
<p>The Pixel Buds Pro 2 can be used as a broadcast receiver, controlled by the
<code>auracast assist</code> command, instructing the buds to receive a broadcast.</p>
<p>Use the <code>assist --command add-source</code> command to tell the buds to receive a
broadcast.</p>
<p>Use the <code>assist --command monitor-state</code> command to monitor the current sync/receive
state of the buds.</p>
<h3 id="jbl">JBL<a class="headerlink" href="#jbl" title="Permanent link">&para;</a></h3>
<p>The JBL GO 4 and other JBL products that support the Auracast feature can be used
as transmitters or receivers.</p>
<p>When running in receiver mode (pressing the Auracast button while not already playing),
the JBL speaker will scan for broadcast advertisements with a specific manufacturer data.
Use the <code>--manufacturer-data</code> option of the <code>transmit</code> command in order to include data
that will let the speaker recognize the broadcast as a compatible source.</p>
<p>The manufacturer ID for JBL is 87.
Using an option like <code>--manufacturer-data 87:00000000000000000000000000000000dffd</code> should work (tested on the
JBL GO 4. The <code>dffd</code> value at the end of the payload may be different on other models?).</p>
<h3 id="others">Others<a class="headerlink" href="#others" title="Permanent link">&para;</a></h3>
<ul>
<li>Nexum Audio VOCE and USB dongle</li>
</ul>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-nav">
<nav class="md-footer-nav__inner md-grid">
<a href="index.html" title="APPS & TOOLS" class="md-flex md-footer-nav__link md-footer-nav__link--prev" rel="prev">
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-back md-footer-nav__button"></i>
</div>
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Previous
</span>
APPS &amp; TOOLS
</span>
</div>
</a>
<a href="console.html" title="Console" class="md-flex md-footer-nav__link md-footer-nav__link--next" rel="next">
<div class="md-flex__cell md-flex__cell--stretch md-footer-nav__title">
<span class="md-flex__ellipsis">
<span class="md-footer-nav__direction">
Next
</span>
Console
</span>
</div>
<div class="md-flex__cell md-flex__cell--shrink">
<i class="md-icon md-icon--arrow-forward md-footer-nav__button"></i>
</div>
</a>
</nav>
</div>
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-footer-copyright">
<div class="md-footer-copyright__highlight">
Copyright 2021-2023 Google LLC
</div>
</div>
<div class="md-social">
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"annotate": null, "base": "..", "features": ["navigation.indexes"], "search": "../assets/javascripts/workers/search.2c215733.min.js", "tags": null, "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}, "version": null}</script>
<script src="../assets/javascripts/bundle.79ae519e.min.js"></script>
</body>
</html>