The purpose of this PoC is to find a solution to forward audio in scrcpy.
Install the following packages (on Debian):
sudo apt install libusb-1.0-0-dev ffmpeg
Build the tool:
make
Find your Android device vendor id and product id in the output of lsusb
:
$ lsusb
...
Bus 003 Device 011: ID 18d1:4ee2 Google Inc. Nexus 4 (debug)
...
Here, the vendor id is 18d1
and the product id is 4ee1
.
Then enable AOA audio:
./audio 18d1 4ee1 1
The last argument (1
) is the audio mode (provided in the value
field).
The output should look like:
$ ./audio 18d1 4ee1 1
Device 18d1:2d05 found. Opening...
Setting audio mode: 1
SUCCESS
Note that changing the audio mode changes the device product id.
Once enabled, your computer should detect a new input audio device. List the sources (provided your system uses PulseAudio):
pactl list short sources
You should see your device:
$ pactl list short sources
...
5 alsa_input.usb-LGE_Nexus_5_05f5e60a0ae518e5-01.analog-stereo module-alsa-card.c s16le 2ch 44100Hz RUNNING
or:
$ ffmpeg -sources pulse
...
alsa_input.usb-LGE_Nexus_5_05f5e60a0ae518e5-00.analog-stereo [Nexus 5 Stéréo analogique]
Play the sound with ffplay
:
ffplay -vn -nodisp -f pulse -i 5
or with the full name:
ffplay -vn -nodisp -f pulse -i alsa_input.usb-LGE_Nexus_5_05f5e60a0ae518e5-01.analog-stereo
The sound of your Android device should be played on your computer.
This PoC works, but there are problems to solve before this can be implemented in scrcpy.
How to find the VID and PID of the device from adb? Is there a better way than
matching the serial from adb devices
with the USB iSerial
field?
lsusb -d 18d1:4ee2 -v | grep iSerial | grep -o '[0-9a-f]\+$'
The accessory may not be stopped easily. Setting mode to 0
is not sufficient,
so the device sound is redirected until the device is rebooted.
Enabling audio accessory creates a new audio source on the computer, but how to find it reliably and automatically? What if the system does not use PulseAudio?
It would be great if it were possible to receive audio packets manually, so that we could play them with SDL directly.
The PoC uses libusb. What about systems like Windows?