qzed / pbpctrl Goto Github PK
View Code? Open in Web Editor NEWControl Google Pixel Buds Pro from the Linux command line.
License: Apache License 2.0
Control Google Pixel Buds Pro from the Linux command line.
License: Apache License 2.0
I have had this idea for some time, but have very little information to do away with.
Thankfully, Pixel Buds Pro work well with GrapheneOS on Android, so I had been wondering: you know how these support AI assist via Google Assistant application? Now that there's many Mac Studio's and Ryzen DDR5-based inference environments in the market, on-premise cloud deployments have become more commonplace. Also: there has been improvements on-edge, namely whisper.cpp and llama.cpp builds via Android NDK are able to leverage local accelerators.
Is there a chance that the proprietary AI assist capability from Google isn't entirely proprietary?
I wonder if AI assist is ultimately implemented using some signalling protocol over Bluetooth that basically defers to recording and subsequent playback of arbitrary audio. Obviously, there's playback interrupt features but it's probably handled by the firmware itself. If this is the case, then we could potentially modify Pixel Buds application itself to use alternative inference providers.
Based on what you know about Bluetooth & Pixel Buds specifically, how hard could it be, and where would we want to start to learn specifically what's happening under the hood? If it should involve reverse-engineering the relevant apk's, would it also be tractable? If yes, what are the chances it would yield readable, meaningful results? I reckon they probably use NDK themselves, tapping into Android's bluetooth internals, and from the symbols & sniffing alone would it be possible to infer complete logic?
P.S. Great work, your code is quite tidy & indeed, would be worthwhile to investigate how what you do relates to what they do.
I tried to compile pbpctrl
for MacOS.
To solve dependency issues, I installed the missing packages: brew install dbus protobuf
.
Then I ran cargo build --release --target aarch64-apple-darwin
, but as expected, no success.
$ cargo build --release --target aarch64-apple-darwin
Compiling bluer v0.15.4
error[E0432]: unresolved imports `libc::Ioctl`, `libc::SOCK_CLOEXEC`, `libc::SOCK_NONBLOCK`
--> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/bluer-0.15.4/src/sock.rs:3:40
|
3 | use libc::{c_int, sockaddr, socklen_t, Ioctl, SOCK_CLOEXEC, SOCK_NONBLOCK};
| ^^^^^ ^^^^^^^^^^^^ ^^^^^^^^^^^^^ no `SOCK_NONBLOCK` in the root
| | |
| | no `SOCK_CLOEXEC` in the root
| no `Ioctl` in the root
|
help: a similar name exists in the module
|
3 | use libc::{c_int, sockaddr, socklen_t, ioctl, SOCK_CLOEXEC, SOCK_NONBLOCK};
| ~~~~~
help: a similar name exists in the module
|
3 | use libc::{c_int, sockaddr, socklen_t, Ioctl, O_CLOEXEC, SOCK_NONBLOCK};
| ~~~~~~~~~
help: a similar name exists in the module
|
3 | use libc::{c_int, sockaddr, socklen_t, Ioctl, SOCK_CLOEXEC, O_NONBLOCK};
| ~~~~~~~~~~
error[E0432]: unresolved imports `libc::SOCK_CLOEXEC`, `libc::SOCK_NONBLOCK`
--> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/bluer-0.15.4/src/gatt/mod.rs:5:22
|
5 | use libc::{AF_LOCAL, SOCK_CLOEXEC, SOCK_NONBLOCK, SOCK_SEQPACKET};
| ^^^^^^^^^^^^ ^^^^^^^^^^^^^ no `SOCK_NONBLOCK` in the root
| |
| no `SOCK_CLOEXEC` in the root
|
help: a similar name exists in the module
|
5 | use libc::{AF_LOCAL, O_CLOEXEC, SOCK_NONBLOCK, SOCK_SEQPACKET};
| ~~~~~~~~~
help: a similar name exists in the module
|
5 | use libc::{AF_LOCAL, SOCK_CLOEXEC, O_NONBLOCK, SOCK_SEQPACKET};
| ~~~~~~~~~~
error[E0432]: unresolved imports `libc::AF_BLUETOOTH`, `libc::SOL_BLUETOOTH`, `libc::TIOCINQ`
--> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/bluer-0.15.4/src/rfcomm/mod.rs:16:12
|
16 | c_int, AF_BLUETOOTH, EAGAIN, EINPROGRESS, MSG_PEEK, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_RAW, SOCK_STREAM,
| ^^^^^^^^^^^^ no `AF_BLUETOOTH` in the root
17 | SOL_BLUETOOTH, SOL_SOCKET, SO_ERROR, SO_RCVBUF, TIOCINQ, TIOCOUTQ,
| ^^^^^^^^^^^^^ no `SOL_BLUETOOTH` in the root ^^^^^^^ no `TIOCINQ` in the root
error[E0425]: cannot find function `accept4` in crate `libc`
--> ~/.cargo/registry/src/github.com-1ecc6299db9ec823/bluer-0.15.4/src/sock.rs:147:15
|
147 | libc::accept4(socket.as_raw_fd(), saddr.as_mut_ptr() as *mut _, &mut length, SOCK_CLOEXEC | SOCK_NONBLOCK)
| ^^^^^^^ help: a function with a similar name exists: `accept`
|
::: ~/.cargo/registry/src/github.com-1ecc6299db9ec823/libc-0.2.139/src/unix/mod.rs:641:5
|
641 | pub fn accept(socket: ::c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> ::c_int;
| ---------------------------------------------------------------------------------------------- similarly named function `accept` defined here
Some errors have detailed explanations: E0425, E0432.
For more information about an error, try `rustc --explain E0425`.
error: could not compile `bluer` due to 4 previous errors
warning: build failed, waiting for other jobs to finish...
error: could not compile `bluer` due to 4 previous errors
Is it possible to use something crossplatform for bluetooth bindings?
Google just released a new firmware update 5.9 for the buds and unfortunately pbpctrl does no longer work for me. Every command just hangs and does not return.
Can you reproduce this? I really like your tool and would love being able to use it with the latest firmware.
Btw: there were also new features/toggles introduced with the new firmware like "transparent mode on when speaking". It would be cool if pbpctrl also would support them.
Does pbpctrl
support firmware updates, or was it deemed too risky to implement?
I think fw updates for the pixel buds are signed and checksum'd by Google, so it wouldn't be possible to send a corrupted update to brick the headphones.
It would be nice if pbpctrl set anc
could have an option that allows you to cycle through ANC modes instead of only allowing you to set it. This would make it easy to create a keyboard shortcut to cycle through the ANC modes, following the order configured on the device.
I just wanted to thank you for this project, I just tried it and it worked out of the box. Also the tip with enabling the experimental flag added the battery info to my bluetooth KDE widget which is nice!
Perhaps you might want to talk to the GadgetBridge people (https://codeberg.org/Freeyourgadget/Gadgetbridge/) they already have implemented some other buds and the Pixel Buds Pro would be a nice addition.
Regards, Sebastian
Hello, thank you so much for writing this tool, works perfectly with my Pixel Buds Pro!
Were you planning to also write a GUI for this, or are you leaving it up to the community to build a GUI around your tool?
A GUI would be incredibly useful for PostmarketOS or PureOS devices who run mainline Linux.
This is not a request, but merely a question on whether I (or someone else) should consider writing a GUI for pbpctrl, or if you were planning to write one
Hi,
No matter what I try it seems that when I perform any pbpctrl
command e.g., pbpctrl show battery
, any pbpctrl get [...]
command, even when specifying -d 24:29:34:AC:9F:D1
, the program just sits with no output until I CTRL+C it.
I tried both the AUR version of pbpctrl
and I also tried building with Cargo as instructed. My Pixel Buds Pro are definitely connected via Bluetooth. I can listen to music and use the microphone. bluetoothctl
starts with the earbuds connected. My issue occurs with the Experimental option both on and off in Bluez' config.
Is there any way to increase the verbosity of pbpctrl
or is that not implemented (potential feature suggestion)?
Thanks for making this project, I appreciate it. Thanks for taking the time to read through these issues as well.
Here's the info
from bluetoothctl
:
Device 24:29:34:AC:9F:D1 (public)
Name: Olivia's Pixel Buds Pro
Alias: Olivia's Pixel Buds Pro
Class: 0x00240404 (2360324)
Icon: audio-headset
Paired: yes
Bonded: yes
Trusted: yes
Blocked: no
Connected: yes
WakeAllowed: yes
LegacyPairing: no
UUID: Audio Sink (0000110b-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control Target (0000110c-0000-1000-8000-00805f9b34fb)
UUID: Advanced Audio Distribu.. (0000110d-0000-1000-8000-00805f9b34fb)
UUID: A/V Remote Control (0000110e-0000-1000-8000-00805f9b34fb)
UUID: Handsfree (0000111e-0000-1000-8000-00805f9b34fb)
UUID: Human Interface Device... (00001124-0000-1000-8000-00805f9b34fb)
UUID: PnP Information (00001200-0000-1000-8000-00805f9b34fb)
UUID: Vendor specific (25e97ff7-24ce-4c4c-8951-f764a708f7b4)
UUID: Vendor specific (25e97ff7-24ce-4c4c-8951-f764a708f7b5)
UUID: Vendor specific (74c34f02-a774-4f6d-ae2e-dab5030b5842)
UUID: Vendor specific (81c2e72a-0591-443e-a1ff-05f988593351)
UUID: Vendor specific (df21fe2c-2515-4fdb-8886-f12c4d67927c)
UUID: Vendor specific (f8d1fbe4-7966-4334-8024-ff96c9330e15)
Modalias: bluetooth:v00E0p3004d0001
Battery Percentage: 0x4c (76)
I'm packaging pbpctrl
for nixpkgs
(https://github.com/NixOS/nixpkgs),
which need Cargo.lock
file for deterministic build, otherwise we can only store lock in our repo.
I think publish lock file as author is a better choice : )
"Might or might not work on other Pixel Buds devices."
I own a Pixel Buds A-Series and the device isn't auto detected. Trying manually by providing the Bluetooth address and running any command throws a connection error:
pbpctrl --device 0C:C4:13:0B:39:11 show hardware
2023-08-01T12:36:55.947792Z WARN pbpctrl::bt: connecting to profile failed, trying again (1/3) error=Error { kind: NotAvailable, message: "br-connection-profile-unavailable" }
2023-08-01T12:36:56.949647Z WARN pbpctrl::bt: connecting to profile failed, trying again (2/3) error=Error { kind: NotAvailable, message: "br-connection-profile-unavailable" }
2023-08-01T12:36:57.951226Z WARN pbpctrl::bt: connecting to profile failed, trying again (3/3) error=Error { kind: NotAvailable, message: "br-connection-profile-unavailable" }
Error: Bluetooth operation not available: br-connection-profile-unavailable
Anything I can provide to try and make A-Series work?
Help command isn't too useful, I get this error when running -d
josh@josh-desktop:~$ pbpctrl -d
error: a value is required for '--device <DEVICE>' but none was supplied
For more information, try '--help'.
But I get this error when I provide my MAC address
josh@josh-desktop:~$ pbpctrl --device "B8:7B:D4:0A:A8:13"
error: 'pbpctrl' requires a subcommand but one was not provided
[subcommands: show, get, set, help]
Usage: pbpctrl [OPTIONS] <COMMAND>
For more information, try '--help'.
I'm using Ubuntu 22.04 with earbuds firmware version 5.9
I tried to install pbpctrl
on Fedora Linux using cargo
but it failed.
error: failed to run custom build command for
maestro v0.1.1
Caused by:
process didn't exit successfully:
`/tmp/cargo-installtFVNri/release/build/maestro-003457e9a4943146/build-script-build` (exit status: 1)
--- stderr
Error: Custom
{
kind: Other, error:
"protoc failed: google/protobuf/empty.proto:
File not found.\nmaestro_pw.proto:5:1:
Import \"google/protobuf/empty.proto\" was not found or had errors
.\nmaestro_pw.proto:211:25: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:212:25: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:213:30: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:214:45: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:215:48: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:217:36: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:218:32: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:233:36: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:234:66: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:257:51: \"google.protobuf.Empty\" is not defined
.\nmaestro_pw.proto:258:49: \"google.protobuf.Empty\" is not defined.\n"
}
Is there a way I can fix this? Any help is appreciated.
Help command isn't too useful, I get this error when running -d
josh@josh-desktop:~$ pbpctrl -d
error: a value is required for '--device <DEVICE>' but none was supplied
For more information, try '--help'.
But I get this error when I provide my MAC address
josh@josh-desktop:~$ pbpctrl --device "B8:7B:D4:0A:A8:13"
error: 'pbpctrl' requires a subcommand but one was not provided
[subcommands: show, get, set, help]
Usage: pbpctrl [OPTIONS] <COMMAND>
For more information, try '--help'.
I'm using Ubuntu 22.04 with earbuds firmware version 5.9
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.