Android app implementing Roc sender and receiver. Work in progress!
Features:
- receive sound from remote Roc-compatible sender and play to local audio device
- capture sound from apps or microphone and send to remote Roc-compatible receiver
-
Download APK from latest release
-
Download from IzzyOnDroid:
Compatible senders and receivers include:
- command-line tools
- sound server modules (PulseAudio, PipeWire)
- C library
- language bindings (Go, Java)
Key features:
- real-time streaming with guaranteed latency;
- restoring lost packets using Forward Erasure Correction codes;
- converting between the sender and receiver clock domains;
- CD-quality audio;
- multiple profiles for different CPU and latency requirements;
- portability;
- relying on open, standard protocols.
See Roc Toolkit documentation for details.
The app uses Java bindings for Roc Toolkit. You don't need to install them manually; gradle will automatically download AAR from maven central, which contains both libroc and Java bindings built for all Android ABIs.
The easiest way to build the app is using Android Studio.
Alternatively, you can build and deploy APK from command-line.
Build:
./gradlew build
Install to device:
adb install app/build/outputs/apk/debug/roc-droid-*.apk
To check code style use:
./gradlew spotlessCheck
To apply code style use:
./gradlew spotlessApply
To check consistency of version name and code:
./gradlew checkVersion
Keystore with certificates was generated using this command:
keytool -genkey -v -keystore roc-droid.jks -alias apk -keyalg RSA -keysize 2048 -validity 10000
Then it was encoded to base64:
base64 roc-droid.jks
Then the following secrets were added to the repo:
SIGNING_STORE_BASE64
- base64-encoded keystore (roc-droid.jks
)SIGNING_STORE_PASSWORD
- keystore passwordSIGNING_KEY_ALIAS
- key alias (apk
)SIGNING_KEY_PASSWORD
- key password (same as keystore password)
GitHub actions decode SIGNING_STORE_BASE64
into a temporary .jks
file and set SIGNING_*
environment variables with the name of the file and credentials.
Then the following command is run:
./gradlew assembleRelease
It reads credentials from the environment variables and signs release APK using them.
To release a new version:
-
Create git tag
./tag.py --push <remote> <version>
e.g.
./tag.py --push origin 1.2.3
Or use tag.py without --push to only create a tag locally, and then push it manually.
-
Wait until "Release" CI job completes and creates GitHub release draft.
-
Edit GitHub release created by CI and publish it.
See here.