Troubleshooting

The problems below are the ones that actually happen, in rough order of how often.

Start here

One command reports dependencies, output devices, adb transports and config in a single pass, and answers most questions before you have to ask them.

pab doctor

Homebrew puts pab on your PATH. From the disk image it lives inside the app, at /Applications/PixelAudioBridge.app/Contents/Resources/pab.

Nothing happens when I put my headphones on

The app judges presence by CoreAudio, not Bluetooth. Headphones can show as connected in Bluetooth while being absent from CoreAudio in standby, and the bridge correctly waits rather than failing.

Check what the app can actually see:

pab doctor

If your device is not in the output list, play any sound on your Mac to wake it, then look again. The app starts on its own within about a second of it appearing.

If the device is listed but the app still sits in Waiting, a name filter is pinning the bridge to something else. OUTPUT_MATCH in ~/.config/pixel-audio-bridge/config is a plain substring: set it to any part of your device's name, or leave it empty to follow whatever your Mac is currently playing through. Configs written before 1.2 use AIRPODS_MATCH, which is still read.

It says Streaming but there is no sound

Almost always the app on the phone opting out of capture. Android lets an app set allowAudioPlaybackCapture="false" or flag its audio as DRM protected, and capture then returns silence with no error at all. Spotify does this. Instagram does not.

Try a different app on the phone. If everything is silent, check that the phone's media stream is not muted, then open the log and look for a warning about a persistently low capture level.

Worth knowing: the phone's volume slider is not the cause. Capture happens before stream volume is applied, so the phone can be at zero and the Mac will still get full-level audio.

I hear clicks, pops or brief dropouts

That is sample skipping, which means the buffer is too small for the link. Raise it:

pab run --wired --buffer 30

The wired default of 15 ms is deliberately below scrcpy's own default of 50 ms, and it is the one figure in this project validated by listening rather than instrumentation. If 30 fixes it, keep 30.

Glitches and lag are different symptoms with opposite fixes. Clicks mean the buffer is too tight. Lag means it is doing its job.

Wireless stopped working

Wireless ADB resets whenever the phone reboots. With no cable to hand, reopen Pair device with pairing code on the phone and run:

pab pair

It finds the phone, takes the six digit code, and looks up the connect port itself, so the pairing port cannot be reused by mistake. If a cable is already attached, pab enable-wireless is quicker.

If the phone is awake and on the same network but still unreachable, its Wi-Fi address may have changed. The address is relearned automatically the next time you connect over USB, so plugging in once fixes it.

Audio briefly came out of my speakers

Expected, and documented rather than fixed. The watchdog polls the default output twice a second, so a mid-stream disconnect leaves a window of up to about half a second before playback is killed.

scrcpy plays to the system output and cannot be told to target a specific device, which is why this is a watchdog rather than a pin. The how it works page explains the trade in full.

The video on my phone is ahead of the audio

The phone does not know its audio was captured, so it never delays video to compensate. Over USB the offset is about 191 ms. Over Wi-Fi it is about 376 ms and clearly visible.

Use the cable for anything you are watching. Mirroring the video through scrcpy would keep both in sync, but that routes audio through scrcpy's own window and gives up the output watchdog.

The app says the bridge helper is missing

pab and paboutput ship inside the app bundle. If either is missing, the build did not complete. Rebuild:

./build.sh

The app deliberately does not guess at a path on disk when the helper is absent, because that turns a clear build failure into a confusing runtime one.

scrcpy or adb is not found

pab looks on your PATH first, then falls back to Homebrew and the Android SDK's standard locations. Install what is missing:

brew install scrcpy

adb comes from the Android SDK. If you have Android Studio it is already at ~/Library/Android/sdk/platform-tools. Otherwise install platform-tools and make sure it is on your PATH.

Phone calls do not capture

They cannot. Android blocks USAGE_VOICE_COMMUNICATION from playback capture, and there is no return path for your microphone either. This is a platform restriction, not something the app can work around.

Still stuck

Open an issue with the output of pab doctor attached. The issue template asks for it first, because it usually contains the answer.

Please redact anything you would rather not share. The log can contain device names and local IP addresses.