├── Snapcast ├── .gitignore ├── Ressources │ ├── ic_launcher.zip │ ├── ic_mute_icon.zip │ ├── ic_speaker_icon.zip │ ├── volume_up_24px.svg │ ├── volume_off_24px.svg │ ├── settings_24px.svg │ ├── Speaker_Icon.svg │ └── Mute_Icon.svg ├── src │ └── main │ │ ├── ic_launcher-web.png │ │ ├── assets │ │ └── files │ │ │ ├── Snapcast_800.png │ │ │ └── Snapcast_alt_800.png │ │ ├── res │ │ ├── mipmap-hdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-mdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-xhdpi │ │ │ ├── app_banner.png │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-xxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── mipmap-xxxhdpi │ │ │ ├── ic_launcher.png │ │ │ ├── ic_launcher_round.png │ │ │ └── ic_launcher_monochrome.png │ │ ├── drawable-hdpi │ │ │ ├── ic_media_play.png │ │ │ └── ic_media_stop.png │ │ ├── drawable-mdpi │ │ │ ├── ic_media_play.png │ │ │ └── ic_media_stop.png │ │ ├── drawable-xhdpi │ │ │ ├── ic_media_play.png │ │ │ └── ic_media_stop.png │ │ ├── drawable-xxhdpi │ │ │ ├── ic_media_play.png │ │ │ └── ic_media_stop.png │ │ ├── values │ │ │ ├── ic_launcher_background.xml │ │ │ ├── dimens.xml │ │ │ ├── colors.xml │ │ │ ├── ids.xml │ │ │ ├── themes.xml │ │ │ ├── styles.xml │ │ │ └── strings.xml │ │ ├── values-night │ │ │ └── themes.xml │ │ ├── mipmap-anydpi-v26 │ │ │ ├── ic_launcher_round.xml │ │ │ └── ic_launcher.xml │ │ ├── values-v21 │ │ │ └── styles.xml │ │ ├── values-w820dp │ │ │ └── dimens.xml │ │ ├── xml │ │ │ ├── group_preferences.xml │ │ │ └── client_preferences.xml │ │ ├── layout │ │ │ ├── activity_about.xml │ │ │ ├── fragment_group_list.xml │ │ │ ├── activity_main.xml │ │ │ ├── client_item.xml │ │ │ ├── group_item.xml │ │ │ └── dialog_server.xml │ │ ├── drawable │ │ │ ├── volume_up_24px.xml │ │ │ ├── ic_menu_overflow_material.xml │ │ │ ├── volume_off_24px.xml │ │ │ ├── settings_24px.xml │ │ │ └── ic_launcher_foreground.xml │ │ ├── menu │ │ │ └── menu_snapcast.xml │ │ ├── values-ja │ │ │ └── strings.xml │ │ └── values-de │ │ │ └── strings.xml │ │ ├── java │ │ └── de │ │ │ └── badaix │ │ │ └── snapcast │ │ │ ├── control │ │ │ ├── json │ │ │ │ ├── JsonSerialisable.java │ │ │ │ ├── Snapclient.java │ │ │ │ ├── Snapserver.java │ │ │ │ ├── Time_t.java │ │ │ │ ├── Volume.java │ │ │ │ ├── Snapcast.java │ │ │ │ ├── Server.java │ │ │ │ ├── Host.java │ │ │ │ ├── ClientConfig.java │ │ │ │ ├── Stream.java │ │ │ │ ├── Client.java │ │ │ │ ├── StreamUri.java │ │ │ │ ├── ServerStatus.java │ │ │ │ └── Group.java │ │ │ └── JsonRPC.java │ │ │ ├── AboutActivity.java │ │ │ ├── ClientSettingsActivity.java │ │ │ ├── GroupSettingsActivity.java │ │ │ ├── BroadcastReceiver.java │ │ │ ├── utils │ │ │ ├── MD5.java │ │ │ ├── Settings.java │ │ │ └── NsdHelper.java │ │ │ ├── ClientSettingsFragment.java │ │ │ ├── ClientItem.java │ │ │ ├── GroupSettingsFragment.java │ │ │ └── GroupListFragment.java │ │ └── AndroidManifest.xml ├── libs │ └── readme.txt ├── proguard-rules.pro └── build.gradle ├── settings.gradle ├── fastlane └── metadata │ └── android │ ├── de │ ├── short_description.txt │ ├── title.txt │ └── full_description.txt │ └── en-US │ ├── short_description.txt │ ├── title.txt │ ├── images │ └── icon.png │ └── full_description.txt ├── PlayStore ├── Screenshot_About.png ├── Snapcast_1024_500.png ├── Snapcast_1024_512.png ├── Snapcast_1280_720.png ├── Snapcast_180_120.png ├── Screenshot_Group_settings.png └── Screenshot_Client_settings.png ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── .gitmodules ├── .idea ├── encodings.xml ├── compiler.xml ├── copyright │ ├── profiles_settings.xml │ └── Snapcast.xml ├── vcs.xml ├── gradle.xml ├── modules.xml ├── jarRepositories.xml ├── codeStyles │ └── Project.xml └── misc.xml ├── README.md ├── gradle.properties ├── .gitignore ├── PRIVACY_POLICY.md ├── .github └── workflows │ └── ci.yml ├── gradlew.bat └── gradlew /Snapcast/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /settings.gradle: -------------------------------------------------------------------------------- 1 | include ':Snapcast' -------------------------------------------------------------------------------- /fastlane/metadata/android/de/short_description.txt: -------------------------------------------------------------------------------- 1 | Snapcast-Client für Android -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/short_description.txt: -------------------------------------------------------------------------------- 1 | Snapcast client for Android -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/title.txt: -------------------------------------------------------------------------------- 1 | Snapcast - multi-room audio in perfect sync -------------------------------------------------------------------------------- /fastlane/metadata/android/de/title.txt: -------------------------------------------------------------------------------- 1 | Snapcast - perfekt synchronisiertes Multi-Room Audio -------------------------------------------------------------------------------- /PlayStore/Screenshot_About.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Screenshot_About.png -------------------------------------------------------------------------------- /PlayStore/Snapcast_1024_500.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Snapcast_1024_500.png -------------------------------------------------------------------------------- /PlayStore/Snapcast_1024_512.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Snapcast_1024_512.png -------------------------------------------------------------------------------- /PlayStore/Snapcast_1280_720.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Snapcast_1280_720.png -------------------------------------------------------------------------------- /PlayStore/Snapcast_180_120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Snapcast_180_120.png -------------------------------------------------------------------------------- /gradle/wrapper/gradle-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/gradle/wrapper/gradle-wrapper.jar -------------------------------------------------------------------------------- /Snapcast/Ressources/ic_launcher.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/Ressources/ic_launcher.zip -------------------------------------------------------------------------------- /Snapcast/Ressources/ic_mute_icon.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/Ressources/ic_mute_icon.zip -------------------------------------------------------------------------------- /Snapcast/src/main/ic_launcher-web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/ic_launcher-web.png -------------------------------------------------------------------------------- /PlayStore/Screenshot_Group_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Screenshot_Group_settings.png -------------------------------------------------------------------------------- /Snapcast/Ressources/ic_speaker_icon.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/Ressources/ic_speaker_icon.zip -------------------------------------------------------------------------------- /PlayStore/Screenshot_Client_settings.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/PlayStore/Screenshot_Client_settings.png -------------------------------------------------------------------------------- /Snapcast/src/main/assets/files/Snapcast_800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/assets/files/Snapcast_800.png -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/images/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/fastlane/metadata/android/en-US/images/icon.png -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "Snapcast/src/main/cpp/snapcast"] 2 | path = Snapcast/src/main/cpp/snapcast 3 | url = https://github.com/badaix/snapcast.git 4 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-hdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-hdpi/ic_launcher.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-mdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-mdpi/ic_launcher.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xhdpi/app_banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xhdpi/app_banner.png -------------------------------------------------------------------------------- /Snapcast/src/main/assets/files/Snapcast_alt_800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/assets/files/Snapcast_alt_800.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xxxhdpi/ic_launcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xxxhdpi/ic_launcher.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-hdpi/ic_media_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-hdpi/ic_media_play.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-hdpi/ic_media_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-hdpi/ic_media_stop.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-mdpi/ic_media_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-mdpi/ic_media_play.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-mdpi/ic_media_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-mdpi/ic_media_stop.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-xhdpi/ic_media_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-xhdpi/ic_media_play.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-xhdpi/ic_media_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-xhdpi/ic_media_stop.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-xxhdpi/ic_media_play.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-xxhdpi/ic_media_play.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable-xxhdpi/ic_media_stop.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/drawable-xxhdpi/ic_media_stop.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-hdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-hdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-mdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-mdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-hdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-mdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Stvad/snapdroid/develop/Snapcast/src/main/res/mipmap-xxxhdpi/ic_launcher_monochrome.png -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #FFC107 4 | -------------------------------------------------------------------------------- /.idea/encodings.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /.idea/compiler.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values-night/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 16dp 4 | 16dp 5 | 16dp 6 | 16dp 7 | 8dp 8 | 9 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/colors.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | #607D8B 4 | #455A64 5 | #FF4081 6 | #ff999999 7 | #ffffffff 8 | #8c666666 9 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values-w820dp/dimens.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 64dp 6 | 7 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/ids.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | Auto 9 | OpenSL 10 | Oboe 11 | 12 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/xml/group_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 8 | 11 | 12 | -------------------------------------------------------------------------------- /Snapcast/Ressources/volume_off_24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/themes.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 9 | 10 | -------------------------------------------------------------------------------- /Snapcast/libs/readme.txt: -------------------------------------------------------------------------------- 1 | If you want to use local AAR packages, and not download them from GithubPackages, 2 | place them in this directory: 3 | 4 | - boost-1.85.0 5 | - flac-1.4.2 6 | - oboe-1.9.0 7 | - ogg-1.3.5 8 | - opus-1.1.2 9 | - soxr-0.1.3 10 | - tremor-1.0.1 11 | - vorbis-1.3.7 12 | 13 | you can download the aar files from here: 14 | https://github.com/badaix/snapcast-deps/releases/tag/v0.29.0 15 | 16 | If you want to use the GithubPackages repository, you must provide a github user and token 17 | with read:packages permission via the environment variables GITHUB_USER and GITHUB_TOKEN 18 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/mipmap-anydpi-v26/ic_launcher.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 12 | 13 | -------------------------------------------------------------------------------- /Snapcast/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # By default, the flags in this file are appended to flags specified 3 | # in /home/johannes/Develop/android-sdks/tools/proguard/proguard-android.txt 4 | # You can edit the include path and order by changing the proguardFiles 5 | # directive in build.gradle. 6 | # 7 | # For more details, see 8 | # http://developer.android.com/guide/developing/tools/proguard.html 9 | 10 | # Add any project specific keep options here: 11 | 12 | # If your project uses WebView with JS, uncomment the following 13 | # and specify the fully qualified class name to the JavaScript interface 14 | # class: 15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 16 | # public *; 17 | #} 18 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 18 | 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Snapdroid 2 | 3 | Snapcast control client and player for Android 4 | 5 | [![Github Releases](https://img.shields.io/github/release/badaix/snapdroid.svg)](https://github.com/badaix/snapdroid/releases) 6 | 7 | Snapdroid is using the [Snapcast JSON-RPC API](https://github.com/badaix/snapcast/blob/master/doc/json_rpc_api/v2_0_0.md) to control [Snapcast](https://github.com/badaix/snapcast) and bundles native Android ARM and X86 Snapclients for audio playback 8 | 9 | ![Snapcast for Android](https://raw.githubusercontent.com/badaix/snapcast/master/doc/snapcast_android_scaled.png) 10 | 11 | You can find the current APK for your device on the [releases-page](https://github.com/badaix/snapdroid/releases/latest) and on [Google Play](https://play.google.com/store/apps/details?id=de.badaix.snapcast). 12 | -------------------------------------------------------------------------------- /.idea/copyright/Snapcast.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | -------------------------------------------------------------------------------- /.idea/modules.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /Snapcast/Ressources/settings_24px.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /fastlane/metadata/android/en-US/full_description.txt: -------------------------------------------------------------------------------- 1 |

Snapcast is a Snapcast control client and player for Android. It uses the Snapcast JSON-RPC API to control your synchronous multi-room audio player.

2 |

This App is not meant for productive use and will only run when you have a Snapserver installed in your local network.

3 |

Snapcast is a multi-room client-server audio player, where all clients are time synchronized with the server to play perfectly synced audio. It’s not a standalone player, but an extension that turns your existing audio player into a Sonos-like multi-room solution.

4 |

The server’s audio input is a named pipe /tmp/snapfifo. All data that is fed into this file will be send to the connected clients. One of the most generic ways to use Snapcast is in conjunction with the music player daemon (MPD) or Mopidy, which can be configured to use a named pipe as audio output.

5 | -------------------------------------------------------------------------------- /gradle.properties: -------------------------------------------------------------------------------- 1 | # Project-wide Gradle settings. 2 | 3 | # IDE (e.g. Android Studio) users: 4 | # Gradle settings configured through the IDE *will override* 5 | # any settings specified in this file. 6 | 7 | # For more details on how to configure your build environment visit 8 | # http://www.gradle.org/docs/current/userguide/build_environment.html 9 | 10 | # Specifies the JVM arguments used for the daemon process. 11 | # The setting is particularly useful for tweaking memory settings. 12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m 13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 14 | 15 | # When configured, Gradle will run in incubating parallel mode. 16 | # This option should only be used with decoupled projects. More details, visit 17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects 18 | # org.gradle.parallel=true 19 | android.enableJetifier=true 20 | android.useAndroidX=true 21 | android.prefabVersion=1.1.2 22 | android.defaults.buildfeatures.buildconfig=true 23 | android.nonTransitiveRClass=false 24 | android.nonFinalResIds=false 25 | -------------------------------------------------------------------------------- /Snapcast/src/main/java/de/badaix/snapcast/control/json/JsonSerialisable.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of snapcast 3 | * Copyright (C) 2014-2018 Johannes Pohl 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package de.badaix.snapcast.control.json; 20 | 21 | import org.json.JSONObject; 22 | 23 | /** 24 | * Created by johannes on 08.01.16. 25 | */ 26 | public interface JsonSerialisable { 27 | void fromJson(JSONObject json); 28 | 29 | JSONObject toJson(); 30 | } 31 | -------------------------------------------------------------------------------- /fastlane/metadata/android/de/full_description.txt: -------------------------------------------------------------------------------- 1 |

Snapcast ist ein Snapcast Control-Client und Player für Android. Es verwendet die Snapcast JSON-RPC API zur Steuerung der synchronen Multi-Room Audio-Wiedergabe.

2 |

Diese App ist nicht für den produktiven Einsatz gedacht und wird nur funktionieren, wenn ein Snapserver im lokalen Netzwerk verfügbar ist.

3 |

Snapcast ist ein Multi-Room Client-Server Audio Player, der alle Clients zeitlich mit dem Server synchronisiert – um perfekt synchronisierte Audio-Wiedergabe zu ermöglichen. Es ist kein stand-alone Player – sondern eine Erweiterung, die bereits existierende Audio-Player zu einer Sonos-ähnlichen Multi-Room Lösung verbindet.

4 |

Die Audio-Eingabe des Servers ist eine so genannte „named pipe“, die unter /tmp/snapfifo zu finden ist. Alle dort eingespeisten Daten werden an alle verbundenen Clients gesendet. Ein weit verbreiteter Einsatz ist die Verwendung von Snapcast zusammen mit dem Music Player Daemon (MPD) oder Mopidy, die sich für die Verwendung einer „named pipe“ als Audio-Ausgabe konfigurieren lassen.

5 | -------------------------------------------------------------------------------- /Snapcast/src/main/java/de/badaix/snapcast/control/json/Snapclient.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of snapcast 3 | * Copyright (C) 2014-2018 Johannes Pohl 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package de.badaix.snapcast.control.json; 20 | 21 | import org.json.JSONObject; 22 | 23 | /** 24 | * Created by johannes on 06.01.16. 25 | */ 26 | public class Snapclient extends Snapcast { 27 | 28 | public Snapclient() { 29 | super(); 30 | } 31 | 32 | public Snapclient(JSONObject json) { 33 | super(json); 34 | } 35 | } 36 | 37 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/layout/activity_about.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 | 29 | 30 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable/volume_up_24px.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /Snapcast/Ressources/Speaker_Icon.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml 23 | 26 | 29 | 30 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable/ic_menu_overflow_material.xml: -------------------------------------------------------------------------------- 1 | 18 | 24 | 27 | 28 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/layout/fragment_group_list.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 24 | 25 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /.idea/jarRepositories.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | 10 | 14 | 15 | 19 | 20 | 24 | 25 | 29 | 30 | 34 | 35 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable/volume_off_24px.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/menu/menu_snapcast.xml: -------------------------------------------------------------------------------- 1 | 5 | 12 | 17 | 18 | 23 | 29 | 34 | 40 | 41 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Built application files 2 | *.apk 3 | *.ap_ 4 | *.aab 5 | 6 | # Files for the ART/Dalvik VM 7 | *.dex 8 | 9 | # Java class files 10 | *.class 11 | 12 | # Generated files 13 | bin/ 14 | gen/ 15 | out/ 16 | 17 | # Gradle files 18 | .gradle/ 19 | build/ 20 | 21 | # Local configuration file (sdk path, etc) 22 | local.properties 23 | 24 | # Proguard folder generated by Eclipse 25 | proguard/ 26 | 27 | # Log Files 28 | *.log 29 | 30 | # Android Studio Navigation editor temp files 31 | .navigation/ 32 | 33 | # Android Studio captures folder 34 | captures/ 35 | 36 | # IntelliJ 37 | *.iml 38 | .idea/workspace.xml 39 | .idea/tasks.xml 40 | .idea/gradle.xml 41 | .idea/assetWizardSettings.xml 42 | .idea/dictionaries 43 | .idea/libraries 44 | .idea/caches 45 | # Android Studio 3 in .gitignore file. 46 | .idea/caches/build_file_checksums.ser 47 | .idea/modules.xml 48 | 49 | # Keystore files 50 | # Uncomment the following lines if you do not want to check your keystore files in. 51 | #*.jks 52 | #*.keystore 53 | 54 | # External native build folder generated in Android Studio 2.2 and later 55 | .externalNativeBuild 56 | 57 | # Google Services (e.g. APIs or Firebase) 58 | # google-services.json 59 | 60 | # Freeline 61 | freeline.py 62 | freeline/ 63 | freeline_project_description.json 64 | 65 | # fastlane 66 | fastlane/report.xml 67 | fastlane/Preview.html 68 | fastlane/screenshots 69 | fastlane/test_output 70 | fastlane/readme.md 71 | 72 | # Version control 73 | vcs.xml 74 | 75 | # lint 76 | lint/intermediates/ 77 | lint/generated/ 78 | lint/outputs/ 79 | lint/tmp/ 80 | # lint/reports/ 81 | 82 | Snapcast/release/output.json 83 | 84 | Snapcast/.cxx 85 | Snapcast/libs/*.aar 86 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/xml/client_preferences.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 7 | 12 | 17 | 22 | 27 | 32 | 37 | 42 | 47 | 48 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/styles.xml: -------------------------------------------------------------------------------- 1 | 2 | #EEEEEE 3 | #37474F 4 | 5 | 9 | 10 | 23 | 24 | 29 | 30 | 38 | 39 | 43 | --> 44 | 45 | 46 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/drawable/settings_24px.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 25 | 28 | 29 | -------------------------------------------------------------------------------- /Snapcast/src/main/java/de/badaix/snapcast/AboutActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of snapcast 3 | * Copyright (C) 2014-2018 Johannes Pohl 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package de.badaix.snapcast; 20 | 21 | import android.content.pm.PackageInfo; 22 | import android.content.pm.PackageManager; 23 | import android.os.Bundle; 24 | import android.webkit.WebView; 25 | 26 | import androidx.appcompat.app.AppCompatActivity; 27 | 28 | import com.google.android.material.snackbar.Snackbar; 29 | 30 | public class AboutActivity extends AppCompatActivity { 31 | 32 | @Override 33 | protected void onCreate(Bundle savedInstanceState) { 34 | super.onCreate(savedInstanceState); 35 | setContentView(R.layout.activity_about); 36 | try { 37 | getSupportActionBar().setTitle(getString(R.string.about) + " Snapcast"); 38 | } catch (Exception e) { 39 | Snackbar.make(findViewById(R.id.webView), getText(R.string.action_bar_failed), Snackbar.LENGTH_LONG); 40 | } 41 | PackageInfo pInfo; 42 | try { 43 | pInfo = getPackageManager().getPackageInfo(getPackageName(), 0); 44 | getSupportActionBar().setSubtitle("v" + pInfo.versionName); 45 | } catch (PackageManager.NameNotFoundException e) { 46 | e.printStackTrace(); 47 | } 48 | WebView wv = findViewById(R.id.webView); 49 | wv.loadUrl("file:///android_asset/" + this.getText(R.string.about_file)); 50 | } 51 | } 52 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values-ja/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Snapcast 3 | Snapclient 開始しました 4 | Snapclient 5 | Snapclient は実行中です… 6 | 情報… 7 | 停止 8 | 詳細 9 | 削除 10 | 11 | Snapcast 12 | 13 | アプリについて… 14 | 設定… 15 | サーバーのスキャン 16 | クライアント一覧の更新 17 | オフラインのクライアントを非表示 18 | 19 | クライアント設定 20 | 名前 21 | MAC 22 | IP 23 | ホスト 24 | OS 25 | バージョン 26 | 最後の視聴 27 | レイテンシー 28 | オンライン 29 | 再生/停止 30 | クライアント %1$s を削除しました 31 | ストリームはネイティブのサンプリングレートではありません: %1$d\nネイティブのサンプリングレート: %2$d 32 | ネイティブのサンプリングレートではないストリームは同期して再生されないことがあります 33 | 元に戻す 34 | アプリについて 35 | files/about.html 36 | アプリについて 37 | 38 | ストリーム 39 | ホスト 40 | ストリーム ポート 41 | コントロール ポート 42 | Snapserver ホスト 43 | Snapclient を自動開始 44 | 45 | 46 | -------------------------------------------------------------------------------- /PRIVACY_POLICY.md: -------------------------------------------------------------------------------- 1 | # Snapdroid: Privacy policy 2 | 3 | This is an open source Android app developed by Johannes Pohl and [contributors](https://github.com/badaix/snapdroid/graphs/contributors). The source code is available on GitHub under the GPL-3.0; the app is also available on Google Play. 4 | 5 | As an avid Android user myself, I take privacy very seriously. 6 | I know how irritating it is when apps collect your data without your knowledge. 7 | 8 | I hereby state, to the best of my knowledge and belief, that I have not programmed this app to collect any personally identifiable information. 9 | 10 | ## Explanation of permissions requested in the app 11 | 12 | The list of permissions required by the app can be found in the `AndroidManifest.xml` file: 13 | 14 | https://github.com/badaix/snapdroid/blob/master/Snapcast/src/main/AndroidManifest.xml 15 | 16 |
17 | 18 | | Permission | Why it is required | 19 | | :---: | --- | 20 | | `android.permission.WAKE_LOCK` | Required to play audio in the background and while the screen is locked. Permission automatically granted by the system; can't be revoked by user. | 21 | | `android.permission.INTERNET` | Required to open a TCP connection to the Snapcast server. Permission automatically granted by the system; can't be revoked by user. | 22 | | `android.permission.FOREGROUND_SERVICE` | Enables the app to create spawn the native Snapcast client as a server, running independly from the control app. Permission automatically granted by the system; can't be revoked by user. | 23 | | `android.permission.RECEIVE_BOOT_COMPLETED` | This permission enables the app to receive a message from the system once the system has rebooted and to start the Snapcast client automatically, if "auto start" is enabled. Permission automatically granted by the system; can't be revoked by user. | 24 | | `android.permission.CHANGE_WIFI_MULTICAST_STATE` | Enables automatic discovery of the Snapcast server in the LAN via mDNS. Permission automatically granted by the system; can't be revoked by user. | 25 | | `android.permission.POST_NOTIFICATIONS` | Required to show a notification while audio is being played. | 26 | 27 |
28 | 29 | If you find any security vulnerability that has been inadvertently caused by me, or have any question regarding how the app protectes your privacy, please send me an email or post a discussion on GitHub, and I will surely try to fix it/help you. 30 | 31 | Yours sincerely, 32 | Johannes Pohl. 33 | Aachen, Germany. 34 | snapcast@badaix.de 35 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: [push, pull_request, workflow_dispatch] 4 | 5 | jobs: 6 | build: 7 | 8 | runs-on: ubuntu-24.04 9 | 10 | steps: 11 | - name: Checkout 12 | uses: actions/checkout@v4 13 | - name: Checkout submodules 14 | run: git submodule update --init --recursive 15 | - name: Download dependencies 16 | run: | 17 | LIBS_DIR="Snapcast/libs/" 18 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/boost-1.85.0.aar -P $LIBS_DIR 19 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/flac-1.4.2.aar -P $LIBS_DIR 20 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/oboe-1.9.0.aar -P $LIBS_DIR 21 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/ogg-1.3.5.aar -P $LIBS_DIR 22 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/opus-1.1.2.aar -P $LIBS_DIR 23 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/soxr-0.1.3.aar -P $LIBS_DIR 24 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/tremor-1.0.1.aar -P $LIBS_DIR 25 | wget https://github.com/badaix/snapcast-deps/releases/download/v0.29.0/vorbis-1.3.7.aar -P $LIBS_DIR 26 | 27 | - name: Build the app 28 | run: JAVA_HOME=$JAVA_HOME_17_X64 ./gradlew build 29 | 30 | - name: rename apk 31 | run: mv /home/runner/work/snapdroid/snapdroid/Snapcast/build/outputs/apk/release/Snapcast-release-unsigned.apk /home/runner/work/snapdroid/snapdroid/Snapcast/build/outputs/apk/release/Snapcast.apk 32 | 33 | - uses: filippoLeporati93/android-release-signer@v1 34 | if: github.event_name == 'push' 35 | name: Sign app APK 36 | # ID used to access action output 37 | id: sign_app 38 | with: 39 | releaseDirectory: /home/runner/work/snapdroid/snapdroid/Snapcast/build/outputs/apk/release 40 | signingKeyBase64: ${{ secrets.SIGNING_KEY }} 41 | alias: ${{ secrets.ALIAS }} 42 | keyStorePassword: ${{ secrets.KEY_STORE_PASSWORD }} 43 | keyPassword: ${{ secrets.KEY_PASSWORD }} 44 | env: 45 | # override default build-tools version (29.0.3) -- optional 46 | BUILD_TOOLS_VERSION: "35.0.0" 47 | 48 | - name: Archive artifacts 49 | if: github.event_name == 'push' 50 | uses: actions/upload-artifact@v4 51 | with: 52 | name: develop_snapshot-${{github.sha}} 53 | path: ${{steps.sign_app.outputs.signedReleaseFile}} 54 | -------------------------------------------------------------------------------- /Snapcast/src/main/java/de/badaix/snapcast/control/json/Snapserver.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of snapcast 3 | * Copyright (C) 2014-2018 Johannes Pohl 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package de.badaix.snapcast.control.json; 20 | 21 | import org.json.JSONException; 22 | import org.json.JSONObject; 23 | 24 | /** 25 | * Created by johannes on 06.01.16. 26 | */ 27 | public class Snapserver extends Snapcast { 28 | int controlProtocolVersion = 1; 29 | 30 | public Snapserver() { 31 | super(); 32 | } 33 | 34 | public Snapserver(JSONObject json) { 35 | super(json); 36 | } 37 | 38 | @Override 39 | public void fromJson(JSONObject json) { 40 | try { 41 | super.fromJson(json); 42 | controlProtocolVersion = json.getInt("controlProtocolVersion"); 43 | } catch (JSONException e) { 44 | e.printStackTrace(); 45 | } 46 | } 47 | 48 | @Override 49 | public JSONObject toJson() { 50 | JSONObject json = super.toJson(); 51 | try { 52 | json.put("controlProtocolVersion", controlProtocolVersion); 53 | } catch (JSONException e) { 54 | e.printStackTrace(); 55 | } 56 | return json; 57 | } 58 | 59 | public int getControlProtocolVersion() { 60 | return controlProtocolVersion; 61 | } 62 | 63 | @Override 64 | public boolean equals(Object o) { 65 | if (this == o) return true; 66 | if (o == null || getClass() != o.getClass()) return false; 67 | 68 | Snapserver that = (Snapserver) o; 69 | 70 | if (controlProtocolVersion != that.controlProtocolVersion) return false; 71 | return super.equals(o); 72 | } 73 | 74 | @Override 75 | public int hashCode() { 76 | int result = super.hashCode(); 77 | result = 31 * result + controlProtocolVersion; 78 | return result; 79 | } 80 | } 81 | 82 | -------------------------------------------------------------------------------- /Snapcast/src/main/java/de/badaix/snapcast/ClientSettingsActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of snapcast 3 | * Copyright (C) 2014-2018 Johannes Pohl 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package de.badaix.snapcast; 20 | 21 | import android.app.Activity; 22 | import android.content.Intent; 23 | import android.os.Bundle; 24 | import android.view.MenuItem; 25 | 26 | import androidx.activity.OnBackPressedCallback; 27 | import androidx.appcompat.app.AppCompatActivity; 28 | 29 | /** 30 | * Created by johannes on 11.01.16. 31 | */ 32 | public class ClientSettingsActivity extends AppCompatActivity { 33 | private ClientSettingsFragment clientSettingsFragment = null; 34 | 35 | @Override 36 | protected void onCreate(Bundle savedInstanceState) { 37 | super.onCreate(savedInstanceState); 38 | clientSettingsFragment = new ClientSettingsFragment(); 39 | clientSettingsFragment.setArguments(getIntent().getExtras()); 40 | 41 | // Display the fragment as the main content. 42 | getFragmentManager().beginTransaction() 43 | .replace(android.R.id.content, clientSettingsFragment) 44 | .commit(); 45 | 46 | getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { 47 | @Override 48 | public void handleOnBackPressed() { 49 | Intent intent = new Intent(); 50 | intent.putExtra("client", clientSettingsFragment.getClient().toJson().toString()); 51 | intent.putExtra("clientOriginal", clientSettingsFragment.getOriginalClientInfo().toJson().toString()); 52 | setResult(Activity.RESULT_OK, intent); 53 | finish(); 54 | } 55 | }); 56 | } 57 | 58 | @Override 59 | public boolean onOptionsItemSelected(MenuItem item) { 60 | if (item.getItemId() == android.R.id.home) { 61 | onBackPressed(); 62 | return true; 63 | } 64 | return false; 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /gradlew.bat: -------------------------------------------------------------------------------- 1 | @if "%DEBUG%" == "" @echo off 2 | @rem ########################################################################## 3 | @rem 4 | @rem Gradle startup script for Windows 5 | @rem 6 | @rem ########################################################################## 7 | 8 | @rem Set local scope for the variables with windows NT shell 9 | if "%OS%"=="Windows_NT" setlocal 10 | 11 | @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. 12 | set DEFAULT_JVM_OPTS= 13 | 14 | set DIRNAME=%~dp0 15 | if "%DIRNAME%" == "" set DIRNAME=. 16 | set APP_BASE_NAME=%~n0 17 | set APP_HOME=%DIRNAME% 18 | 19 | @rem Find java.exe 20 | if defined JAVA_HOME goto findJavaFromJavaHome 21 | 22 | set JAVA_EXE=java.exe 23 | %JAVA_EXE% -version >NUL 2>&1 24 | if "%ERRORLEVEL%" == "0" goto init 25 | 26 | echo. 27 | echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 28 | echo. 29 | echo Please set the JAVA_HOME variable in your environment to match the 30 | echo location of your Java installation. 31 | 32 | goto fail 33 | 34 | :findJavaFromJavaHome 35 | set JAVA_HOME=%JAVA_HOME:"=% 36 | set JAVA_EXE=%JAVA_HOME%/bin/java.exe 37 | 38 | if exist "%JAVA_EXE%" goto init 39 | 40 | echo. 41 | echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 42 | echo. 43 | echo Please set the JAVA_HOME variable in your environment to match the 44 | echo location of your Java installation. 45 | 46 | goto fail 47 | 48 | :init 49 | @rem Get command-line arguments, handling Windowz variants 50 | 51 | if not "%OS%" == "Windows_NT" goto win9xME_args 52 | if "%@eval[2+2]" == "4" goto 4NT_args 53 | 54 | :win9xME_args 55 | @rem Slurp the command line arguments. 56 | set CMD_LINE_ARGS= 57 | set _SKIP=2 58 | 59 | :win9xME_args_slurp 60 | if "x%~1" == "x" goto execute 61 | 62 | set CMD_LINE_ARGS=%* 63 | goto execute 64 | 65 | :4NT_args 66 | @rem Get arguments from the 4NT Shell from JP Software 67 | set CMD_LINE_ARGS=%$ 68 | 69 | :execute 70 | @rem Setup the command line 71 | 72 | set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar 73 | 74 | @rem Execute Gradle 75 | "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% 76 | 77 | :end 78 | @rem End local scope for the variables with windows NT shell 79 | if "%ERRORLEVEL%"=="0" goto mainEnd 80 | 81 | :fail 82 | rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of 83 | rem the _cmd.exe /c_ return code! 84 | if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 85 | exit /b 1 86 | 87 | :mainEnd 88 | if "%OS%"=="Windows_NT" endlocal 89 | 90 | :omega 91 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Snapcast 3 | Snapclient started 4 | Snapclient 5 | Snapclient is running… 6 | info… 7 | stop 8 | Details 9 | Delete 10 | Group 11 | 12 | Snapcast 13 | 14 | About… 15 | Settings… 16 | Scan for server 17 | Refresh client list 18 | Hide offline clients 19 | Cannot set ActionBar! 20 | 21 | Client settings 22 | Name 23 | MAC 24 | ID 25 | IP 26 | Host 27 | Operating system 28 | Version 29 | Last seen 30 | Latency 31 | online 32 | 33 | Group settings 34 | 35 | Cannot connect: host is not configured 36 | Play/Stop 37 | Client %1$s deleted 38 | Stream not in native sample rate: %1$d\nNative sample rate: %2$d 39 | Streams in non-native sample rate might not play in sync 40 | undo 41 | About 42 | files/about.html 43 | About 44 | 45 | Stream 46 | Host 47 | stream port 48 | control port 49 | Settings 50 | audio engine 51 | resample audio stream 52 | Auto start Snapclient 53 | Connect 54 | 55 | 56 | -------------------------------------------------------------------------------- /Snapcast/Ressources/Mute_Icon.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml 61 | 62 | 68 | 74 | -------------------------------------------------------------------------------- /Snapcast/src/main/java/de/badaix/snapcast/GroupSettingsActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * This file is part of snapcast 3 | * Copyright (C) 2014-2018 Johannes Pohl 4 | * 5 | * This program is free software: you can redistribute it and/or modify 6 | * it under the terms of the GNU General Public License as published by 7 | * the Free Software Foundation, either version 3 of the License, or 8 | * (at your option) any later version. 9 | * 10 | * This program is distributed in the hope that it will be useful, 11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | * GNU General Public License for more details. 14 | * 15 | * You should have received a copy of the GNU General Public License 16 | * along with this program. If not, see . 17 | */ 18 | 19 | package de.badaix.snapcast; 20 | 21 | import android.app.Activity; 22 | import android.content.Intent; 23 | import android.os.Bundle; 24 | import android.view.MenuItem; 25 | 26 | import androidx.activity.OnBackPressedCallback; 27 | import androidx.appcompat.app.AppCompatActivity; 28 | 29 | /** 30 | * Created by johannes on 06.12.16. 31 | */ 32 | 33 | public class GroupSettingsActivity extends AppCompatActivity { 34 | 35 | private GroupSettingsFragment groupSettingsFragment; 36 | 37 | @Override 38 | protected void onCreate(Bundle savedInstanceState) { 39 | super.onCreate(savedInstanceState); 40 | 41 | groupSettingsFragment = new GroupSettingsFragment(); 42 | groupSettingsFragment.setArguments(getIntent().getExtras()); 43 | // Display the fragment as the main content. 44 | getFragmentManager().beginTransaction() 45 | .replace(android.R.id.content, groupSettingsFragment).commit(); 46 | 47 | getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) { 48 | @Override 49 | public void handleOnBackPressed() { 50 | Intent intent = new Intent(); 51 | intent.putExtra("group", groupSettingsFragment.getGroup().getId()); 52 | if (groupSettingsFragment.didStreamChange()) 53 | intent.putExtra("stream", groupSettingsFragment.getStream()); 54 | if (groupSettingsFragment.didClientsChange()) 55 | intent.putStringArrayListExtra("clients", groupSettingsFragment.getClients()); 56 | setResult(Activity.RESULT_OK, intent); 57 | finish(); 58 | } 59 | }); 60 | } 61 | 62 | @Override 63 | public boolean onOptionsItemSelected(MenuItem item) { 64 | if (item.getItemId() == android.R.id.home) { 65 | onBackPressed(); 66 | return true; 67 | } 68 | return false; 69 | } 70 | } 71 | 72 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/values-de/strings.xml: -------------------------------------------------------------------------------- 1 | 2 | Snapcast 3 | Snapclient gestartet 4 | Snapclient 5 | Snapclient läuft… 6 | Info… 7 | Stop 8 | Details 9 | Löschen 10 | Gruppe 11 | 12 | Snapcast 13 | 14 | Über… 15 | Einstellungen… 16 | Suche nach Server 17 | Aktualisiere Client-Liste 18 | Verstecke offline Clients 19 | 20 | Client Einstellungen 21 | Name 22 | MAC 23 | ID 24 | IP 25 | Host 26 | Betriebssystem 27 | Version 28 | Zuletzt gesehen 29 | Latenz 30 | Online 31 | 32 | Gruppe 33 | 34 | Verbindung fehlgeschlagen: Host ist nicht konfiguriert 35 | Play/Stop 36 | Client %1$s gelöscht 37 | Stream ist nicht in nativer sample rate: %1$d\nNative sample rate: %2$d 38 | Streams in nicht-nativer sample rate sind evtl. nicht synchron 39 | Rückgängig 40 | Über 41 | files/about.html 42 | Über 43 | ActionBar kann nicht erstellt werden 44 | 45 | Stream 46 | Host 47 | Stream-Port 48 | Control-Port 49 | Audio engine 50 | Resample audio stream 51 | Einstellungen 52 | Auto-start Snapclient 53 | Verbinden 54 | 55 | 56 | -------------------------------------------------------------------------------- /Snapcast/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdk 35 5 | 6 | defaultConfig { 7 | applicationId "de.badaix.snapcast" 8 | minSdkVersion 21 9 | targetSdkVersion 35 10 | versionCode 2900 11 | versionName '0.29.0.0' 12 | multiDexEnabled true 13 | vectorDrawables.useSupportLibrary = true 14 | externalNativeBuild { 15 | cmake { 16 | version "3.22.1" 17 | cppFlags "-std=c++14" 18 | arguments '-DANDROID_STL=c++_static', '-DBUILD_SERVER=OFF', '-DBUILD_TESTS=OFF' 19 | abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' 20 | } 21 | } 22 | } 23 | buildFeatures { 24 | prefab true 25 | } 26 | buildTypes { 27 | release { 28 | minifyEnabled false 29 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 30 | } 31 | } 32 | externalNativeBuild { 33 | cmake { 34 | path 'src/main/cpp/snapcast/CMakeLists.txt' 35 | } 36 | } 37 | 38 | buildToolsVersion = '35.0.0' 39 | ndkVersion '27.0.12077973' 40 | lint { 41 | disable 'MissingTranslation' 42 | } 43 | namespace 'de.badaix.snapcast' 44 | compileOptions { 45 | sourceCompatibility JavaVersion.VERSION_17 46 | targetCompatibility JavaVersion.VERSION_17 47 | } 48 | } 49 | 50 | dependencies { 51 | implementation fileTree(include: ['*.jar'], dir: 'libs') 52 | testImplementation 'junit:junit:4.13.2' 53 | // https://dl.google.com/dl/android/maven2/index.html 54 | implementation 'androidx.appcompat:appcompat:1.7.0' 55 | implementation 'androidx.cardview:cardview:1.0.0' 56 | implementation 'androidx.legacy:legacy-support-v4:1.0.0' 57 | // compile 'com.android.support:recyclerview-v7:23.1.1' 58 | implementation 'com.google.android.material:material:1.12.0' 59 | implementation 'com.github.badaix:oboe:1.9.0@aar' 60 | implementation 'com.github.badaix:boost:1.85.0@aar' 61 | implementation 'com.github.badaix:flac:1.4.2@aar' 62 | implementation 'com.github.badaix:ogg:1.3.5@aar' 63 | implementation 'com.github.badaix:opus:1.1.2@aar' 64 | implementation 'com.github.badaix:soxr:0.1.3@aar' 65 | implementation 'com.github.badaix:tremor:1.0.1@aar' 66 | implementation 'com.github.badaix:vorbis:1.3.7@aar' 67 | } 68 | 69 | 70 | repositories{ 71 | flatDir{ 72 | dirs 'libs' 73 | } 74 | 75 | maven { 76 | name = "GithubPackages" 77 | url = uri("https://maven.pkg.github.com/badaix/snapcast-deps") 78 | credentials { 79 | username = project.findProperty("GITHUB_USER") ?: System.getenv("GITHUB_USER") 80 | password = project.findProperty("GITHUB_TOKEN") ?: System.getenv("GITHUB_TOKEN") 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Snapcast/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 18 | 19 | 27 | 28 | 33 | 34 | 35 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 55 | 56 |