Giter Site home page Giter Site logo

snapdroid's People

Contributors

badaix avatar chatziko avatar delacor avatar derweihnachtsmann avatar gsalinaslopez avatar izzysoft avatar maweki avatar naofum avatar pmec avatar schrockblock avatar stijnvdb88 avatar yubiuser avatar z38 avatar zopieux avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

snapdroid's Issues

[Feature request] Basic Buttons to control an MPD server /next, play, back/ -

Hi Johannes

How feasible could be to integrate to snapclient mobile the mpd media buttons actions.

In androidOS the active audio app governs the media buttons (think bluetooth). It would be very useful to control the basic media buttons, at least when using mpd stream. This way, user wouldn't require to use the screen as often, not for a simple next. A real scenario would be driving.

-One app to rule all the bluetooth media buttons-

Usually is the case where there is mpd, there is also mpc. a button that tells snapserver to run 'mpc next', ...

Visually it would mean additional settings
field: [mpd host]
switch: toggle mpd buttons [on/off]
switch: toggle play_action to control [snapcast + mpd at same time / only snapcast]

I guess I'm not the first thinking about this, i wait for the feedback.

Thanks a lot, snapcast is great and fun.

Guerman

App can't connect to latest develop server

It's probably normal (it's a development version), but I thought you wanted to know: the latest Android app (Play Store) can't receive audio stream from the latest snapserver (develop branch). I'll have logs for you later.

Buzzing tone when stream interrupted or mopidy server restarted

Phone: Samsung Galaxy S10
OS: Android 10, Kernel 4.14.113-18242812, Build QP1A.190711.020.G973FXXS5CTD1, Security patch level May 2020.
Snapcast client for Android: v0.19.0
Back-end: Mopidy 3.0.2-1 / Mopidy-MPD 3.0.0-1 + Extensions.
Mopidy output stream: output = audioresample ! audioconvert ! audio/x-raw,rate=48000,channels=2,format=S16LE ! wavenc ! filesink location=/tmp/snapfifo

Symptom: Restarting the Mopidy back-end, changing current playing item (via a Web front-end), or roaming between in-home wifi points often causes the app to emit a continuous buzz until the app's stop button is pressed.

Steps to reproduce:

  1. Be playing something.
  2. Hit pause on a Mopidy Web interface or push something to 'play now' from a different source (eg: be playing a file from the server and switch to a radio stream) or on the Mopidy server, issue a systemctl restart mopidy (eg: after a config update).

Sound Sample: https://github.com/linker3000/Resources/blob/master/snapdroid-noise.m4a

android stream source

Hi! I have a use case that might be useful for others, but I'm not sure how feasible it is. I'd like to have my Android devices act as a stream source for snapcast, so that I can stream whatever audio is on my device.

I considered another option which was to set up a Bluetooth sink and connect that up to snapcast. It's then pretty easy to pipe all audio from android through that, but Bluetooth on linux is a pain.

Just wanted to document this idea, thanks.

Modern Redesign of the App

Hi there!

I like to do a bit of UI Design in my spare time and would be willing to "modernize" the looks of the app :)
Given that the UI is pretty simple, this shouldn't take too long either! While I'm at it, I could also integrate some of the open issues right-away, like #44, #6 or #37 (potentially also #30 or #18)

I was recently involved in a project where I did a lot of design work for an Android app, so I already have some experience, even though I'm not an actual Android dev :)

(PS: for consistency's sake I'd also be willing to update Snapweb's design so that it matches the "new" design. I am a web dev, so that shouldn't be too hard.)

@badaix I'd love to hear if you're interested or not :D

Android client: Need to scroll for second group

From @derglaus on April 5, 2018 20:0

In my Android client, only the snapclients in the first group are shown initially on the display. I need to scroll for the other clients, even if there is enough space. (seems like the height of the box to display the clients is calculated based on the first group and not the available space)
I use Android 7.1.1

Copied from original issue: badaix/snapcast#381

Client not show

Hello, first happy new year and you do really great work on this app.

I have 2 RSPI with balenasound all work perftectly.
When i use snapdroid, i can see mi master player and can mut/unmute and volume +/-.

If i use multiple player, 1 master and 1 client, i can use it for master but mi client dont show on app (android and windows snap.net).

When i publish music on mi master and all mi player is online i can hear sound on all mi room, but i want to volume +/- on each room.

Do you have any idea to how see mi master and client ?

Thx, have a good day.

No audio on Pixel 3

Have an issue where I can hear no audio on my pixel 3. I have the ability to control all my other clients but the pixel 3 does not show up as one of the devices but the Snapclient is showing running.... when I hit the play button.

SL_RESULT_MEMORY_FAILURE

I have snapdroid running 24/7 on my android device and after some time the music stops and you can see the following error:
Untitled

Close unexpectedly on local playback

When I press play at the top the App closes unexpectedly. The music is then playing perfectly fine while that error dialog ist still open but obviously stops as soon as I choose to close or restart the app.
This is on a oneplus 6 with Android 8.1.0/Oxygen OS 5.1.5

question: intent for tasker

Hi!
I'd like to toggle pause/play through an intent by using Tasker.
If this is possible could you please tell me which intent I can use?

Thank you

Allow HTTP connections

Hi!

To allow HTTP connection (for example to run snapdroid on a recent android TV device), clear text as to be allowed through AndroidManifest.xml

It's done by adding :

android:usesCleartextTraffic="true"

Can you give that a look @badaix ?

NB: what an awesome work you've done around snapcast !!

Static-like playback when using Snapdroid 0.20.0

Hi, I've been experiencing a bug ever since upgrading to version 0.20.0 of Snapdroid. I upgraded Snapserver and Snapdroid to 0.20.0 around the same time. However, when using Snapdroid for playback, all I get is a distorted sound similar to TV static. If I rollback Snapdroid to 0.19.0, everything works fine.

The Snapserver is running on a Raspberry Pi 4 under Raspbian.
Snapdroid is running on a Moto X4 running Android 9

Here is a client log captured using adb.

07-02 13:15:02.293 26610 26610 D Service : Running on a non-TV Device
07-02 13:15:02.295 26610 26610 D Service : startProcess
07-02 13:15:02.296 26610 26610 I Service : Configured engine: Auto, active engine: oboe, sampleformat: 48000:16:*
07-02 13:15:02.700 26610 28892 D Main    : onPlayerStart
07-02 13:15:02.701 26610 28892 D Main    : [Info] (Connection) Resolving host IP for: 10.0.0.93
07-02 13:15:02.701 26610 26610 D Main    : updateStartStopMenuItem: ic_media_stop
07-02 13:15:02.701 26610 28892 D Main    : [Info] (Connection) Connecting
07-02 13:15:02.723 26610 28892 D Main    : [Notice] (Connection) Connected to 10.0.0.93
07-02 13:15:02.723 26610 28892 D Main    : [Info] (Connection) My MAC: "00:00:00:00:00:00", socket: 7
07-02 13:15:02.742 26610 27870 D TCP     : Received Message: '{"jsonrpc":"2.0","method":"Client.OnConnect","params":{"client":{"config":{"instance":1,"latency":0,"name":"","volume":{"muted":false,"percent":100}},"connected":true,"host":{"arch":"arm64-v8a","ip":"10.0.0.85","mac":"00:00:00:00:00:00","name":"moto x4","os":"Android 9"},"id":"b6cd8afc-91aa-4839-90f5-261b44352590","lastSeen":{"sec":1593710104,"usec":634210},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.20.0"}},"id":"b6cd8afc-91aa-4839-90f5-261b44352590"}}'
07-02 13:15:02.744 26610 28892 D Main    : [Info] (Controller) ServerSettings - buffer: 1880, latency: 0, volume: 100, muted: 0
07-02 13:15:02.754 26610 28892 D Main    : [Info] (Controller) Codec: flac, sampleformat: 48000:24:2
07-02 13:15:02.754 26610 28892 D Main    : [Info] (Player) Player name: oboe, device: default, description: <none>, idx: -1, sharing mode: shared
07-02 13:15:02.754 26610 28892 D Main    : [Info] (Player) Mixer mode: software, parameters: <none>
07-02 13:15:02.754 26610 28892 D Main    : [Info] (Player) Sampleformat: 48000:24:2, stream: 48000:24:2
07-02 13:15:02.754 26610 28892 D Main    : [Info] (OboePlayer) Init start
07-02 13:15:02.754 26610 28892 D Main    : [Info] (OboePlayer) DefaultStreamValues::SampleRate: 48000, DefaultStreamValues::FramesPerBurst: 240
07-02 13:15:02.778 26610 28892 D Main    : [Info] (OboePlayer) BufferSizeInFrames: 480, FramesPerBurst: 240
07-02 13:15:02.778 26610 28892 D Main    : [Info] (OboePlayer) AudioApi: AAudio
07-02 13:15:02.778 26610 28892 D Main    : [Info] (OboePlayer) Init done
07-02 13:15:02.778 26610 28892 D Main    : [Info] (OboePlayer) Start
07-02 13:15:02.780 26610 28892 D Main    : [Info] (Stream) no chunks available
07-02 13:15:03.162 26610 28892 D Main    : [Info] (Controller) diff to server [ms]: -4.25172e+08
07-02 13:15:04.579 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       1       34      0
07-02 13:15:05.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       94      32      0
07-02 13:15:06.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       317     32      0
07-02 13:15:07.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:08.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:09.000 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     31      0
07-02 13:15:10.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:11.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:12.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:13.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:14.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:15.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:16.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:17.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:18.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:19.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:20.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:21.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:22.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:24.004 26610 28892 I chatty  : uid=10365(de.badaix.snapcast) Thread-28 identical 2 lines
07-02 13:15:25.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:26.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:27.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:28.004 26610 28892 I chatty  : uid=10365(de.badaix.snapcast) Thread-28 identical 1 line
07-02 13:15:29.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:30.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:31.002 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     29      0
07-02 13:15:32.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:33.006 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     30      0
07-02 13:15:34.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:35.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:36.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:37.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:38.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:39.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:40.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:41.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:42.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:43.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:44.004 26610 28892 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     32      0
07-02 13:15:44.637 26610 26610 D Service : stopPlayer
07-02 13:15:44.637 26610 26610 D Service : stopService
07-02 13:15:44.637 26610 26610 D Service : stop
07-02 13:15:44.637 26610 26610 D Service : stopProcess
07-02 13:15:44.638 26610 28892 D Main    : [Info] (Snapclient) Received signal 15: Terminated
07-02 13:15:44.638 26610 28892 D Main    : [Info] (OboePlayer) Stop
07-02 13:15:44.639 26610 28892 W System.err: java.io.IOException: Stream closed
07-02 13:15:44.639 26610 28892 W System.err:    at java.io.BufferedInputStream.getBufIfOpen(BufferedInputStream.java:172)
07-02 13:15:44.639 26610 28892 W System.err:    at java.io.BufferedInputStream.read(BufferedInputStream.java:338)
07-02 13:15:44.639 26610 28892 W System.err:    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:288)
07-02 13:15:44.639 26610 28892 W System.err:    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:351)
07-02 13:15:44.639 26610 28892 W System.err:    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:180)
07-02 13:15:44.639 26610 28892 W System.err:    at java.io.InputStreamReader.read(InputStreamReader.java:184)
07-02 13:15:44.639 26610 28892 W System.err:    at java.io.BufferedReader.fill(BufferedReader.java:172)
07-02 13:15:44.639 26610 28892 W System.err:    at java.io.BufferedReader.readLine(BufferedReader.java:335)
07-02 13:15:44.639 26610 28892 W System.err:    at java.io.BufferedReader.readLine(BufferedReader.java:400)
07-02 13:15:44.639 26610 28892 W System.err:    at de.badaix.snapcast.SnapclientService$1.run(SnapclientService.java:246)
07-02 13:15:44.639 26610 28892 W System.err:    at java.lang.Thread.run(Thread.java:764)
07-02 13:15:44.646 26610 26610 D Main    : onPlayerStop
07-02 13:15:44.646 26610 26610 D Main    : updateStartStopMenuItem: ic_media_play
07-02 13:15:46.425 26610 27870 D TCP     : Received Message: '{"jsonrpc":"2.0","method":"Client.OnDisconnect","params":{"client":{"config":{"instance":1,"latency":0,"name":"","volume":{"muted":false,"percent":100}},"connected":false,"host":{"arch":"arm64-v8a","ip":"10.0.0.85","mac":"00:00:00:00:00:00","name":"moto x4","os":"Android 9"},"id":"b6cd8afc-91aa-4839-90f5-261b44352590","lastSeen":{"sec":1593710147,"usec":285714},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.20.0"}},"id":"b6cd8afc-91aa-4839-90f5-261b44352590"}}'

f-droid

Please add the snapdroid to f-droid repository.

MAC is missing

When i connect a smartphone to the snapserver, the MAC is recognized as 00:00:00:00:00:00 in /var/lib/snapserver/server.json. Everything works normally and i can control the volume, but when i connect a second smartphone (same brand/model), the volume control is applied to both devices. They just act as they were one single snapclient, and they are both identified with the same name and are listed as one item.
(v0.17.1 directly installed from google playstore)

Feature Request: stream favorites

Heyo!
I'd really like to have 1-click possibility to switch between 2 or 3 streams. I use 2 different streams for 2 different spotify accounts and we switch between those regularly.
Right now, I need 4 clicks:

  • select group
  • click on stream
  • select new stream
  • leave group

Would be nice to have the option to select streams to appear on the main page (extra row below the current stream of the gorup?). That can then be activated with just one click.

Audio Drops on Android Clients

I'm not sure how best to troubleshoot this, what to look or even really where to look.

I have Snapserver running on a Ubuntu 18.04 VM (running on ESXi 6.5). There are no audio devices assigned to this VM.
I had Mopidy setup on this VM with Snapcast but it was incredibly unstable so I switched to MDP with Rompr as the frontend.

Currently I have 2 clients connected to the server, both are Android devices, one is a Samsung A5 which is running Snapcast V24.0 and the other is an older Marshmellow based Android device which is still running V22.0.
The Samsung is used for testing and the older Android phone is being used to supply my deck speakers.

I have always experience some audio drops when using Snapcast. Last week I updated the Snap server to: Version 0.24.0, revision 7eff45fd but the audio drops continue and they may have gotten worse.

Apart from the drops, the quality is great. I'd love to get the audio drops sorted out, I'm so close to having a great multi-room setup, but the drops are holding me back.

My snapserver.conf file is:

[server]
[http]
enabled = true
bind_to_address = 0.0.0.0
port = 1780
[tcp]
[stream]
source = pipe:///tmp/snapfifo?name=default
[logging]

I only have the HTTP section set for Rompr control but that isn't working very well on Rompr's end.

24-Bit Stream Does Not Play

Using a Pixel 3 running Android 10 and Snapdroid 0.17.1.2 (apk downloaded from the releases page), playback will not start with 24-bit streams. 16-bit streams (from the same server with the same number of channels and sampling rate) play fine.

release link to apk missing on readme.md

I could not find a link to download the apk for the 0.14 release on this project.
Only the "snapcast" project homepage features a link - I wouldn't have found the "release" tab under "code" otherwise.

Thanks for your work!

Android App can't connect to Snapserver host

I have 3 instances of Snapcast running on Raspberry Pi3 with Volumio and Hifiberry dacs and AMP. Snapcast appears to be running fine and all I can find one instance in the other instance as a host. So the hosts seem to be online and working fine.

However: when I use you Android app I can't find any Snapserver host.

  • Scanning for server gives no response
  • Using the hostname like it appears in the Volumio plugin (also tried for upper case / lower case / checked typos). All does not help ("error unknown host")
  • when I use the host IP (in my case 10.0.0.xx) I get the following error: "failed to connect to 10.0.0.xx (port 1704 from ;; (port 39970): connection failed: ECON.."

All my devices are in the same WIFI network.

Any help would be great!

compile snapcast server

Hello,

thank you for this nice project. I would love, if it would be possible, to compile snapcast server for android.

Idea/Background:
For University, I have to build an open source android project which uses Wifi-Direct/Bluetooth. My Idea:

Create an app, where you can connect multiple phones together (using Wifi Direct) and play music together.

How it works:
Phone A receives audio via a TCP Stream and acting as a server. Phone A is at the same time a client and connect to itself. Phone B (connected via Wifi) should work fine with snapdroid as it is now.

Problem:
When compiling snapdroid with BUILD_SERVER=ON. I get the Info: snapserver not yet supported for Android.

Question:
Is snapserver not supported because this app current does not make use of them? Or does snapcast in general not supported/compile on android?

If snapcast can be compiled for android, build instructions would be great. In the snapcast build documentation, it's only linked to this project. Therefore, I hope it correct asking here.

Thank you for any help.

Delay parameter shown in GUI not used after system restart

I am running the Android client on the Bluestacks Android Emulator.

I noticed a potential bug in the Android SnapClient: I have to re-enter the delay parameter after every restart of Bluestacks. It seems that the stored delay parameter shown in the Snapclient GUI is not taken into account after a system restart.

"error: Connection refused"

I installed Snapdroid on an older Phone with Android 7.1.2. My Snapserver seems to be set up ok and starts. Snapdroid finds the server and tries to connect, but always displays the above message. What am I doing wrong?

Change play/stop icons

This is probably the most minor issue ever, so feel free to close it right away, but I've noticed that for some users (n = 1) the play and stop icons are very confusing. It's easy to misunderstand as somehow controlling the music and not spawning a new player, especially if you didn't set up the system yourself (this all stems from me setting up Snapcast for my dad). Unfortunately I personally can't really think of a more appropriate icon, but I thought it's worth letting you know at least.

Can't install app

Hey!

Snapcast is a great project and I am sucessfully using it at home. Thanks for this awesome development!

The Android app though can't be successfully installed. I tried both version 14 and 15 but after trying to install, Android just states "App not installed". Did someone experience the same or similar problems?

I am running Android 8.01 using Lineage OS 15.1 on a FP2.

Any help would be highly appreciated!
Thanks!

0.20.0 stops playback when adding/removing 3.5mm cable. Recovery only by restarting the service

This is similar to the issue I had with the first Version of 0.19.0. Which was fixed after installing a Test Version.
With the newest 0.20.0 apk the Playback on my Android 10 Tablet stops after some time. The server still shows the Tablet as connected and playing, but there is no sound coming. Stopping and reconnecting fixes this.

Here is a log from just now:

06-26 08:20:06.020  6784 29500 I chatty  : uid=10018(de.badaix.snapcast) Thread-13 identical 4 lines
06-26 08:20:07.020  6784 29500 D Main    : [Info] (Stream) no chunks available
06-26 08:20:08.019  6784 29500 D Main    : [Info] (Stream) no chunks available
06-26 08:20:09.020  6784 29500 D Main    : [Info] (Stream) no chunks available
06-26 08:20:10.021  6784 29500 D Main    : [Info] (Stream) no chunks available
06-26 08:20:11.001  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_RESIZED_REPORT: frame=(0,0,2560,1600) ci=(0,54,0,34) vi=(0,54,0,34) or=2
06-26 08:20:11.018  6784 29500 D Main    : [Info] (Stream) no chunks available
06-26 08:20:11.068  6784  6784 E ViewRootImpl@2c404dd[MainActivity]: Surface is not valid.
06-26 08:20:11.081  6784  6807 W badaix.snapcas: Reducing the number of considered missed Gc histogram windows from 149 to 100
06-26 08:20:11.092  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: stopped(false) old=true
06-26 08:20:11.114  6784 18111 D OpenGLRenderer: destroyEglSurface : 0x7ca90a5180
06-26 08:20:11.116  6784 18111 D OpenGLRenderer: ~ReliableSurface : 0x7cb5680cc0
06-26 08:20:11.124  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=8 res=0x40001 s={true 535406936064} ch=true
06-26 08:20:11.124  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: RELAYOUT_RES_KEEP_ALIVE_SURFACE on 40001
06-26 08:20:11.125  6784 18111 D OpenGLRenderer: createReliableSurface : 0x7cb5680cc0(0x7ca8bd8000)
06-26 08:20:11.132  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x0 -> 0x7ca90a5c80
06-26 08:20:11.133  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: stopped(false) old=false
06-26 08:20:11.134  6784  6784 D Main    : lastRunVersion: 2000, version: 2000
06-26 08:20:11.171  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=11 res=0x40001 s={true 535406936064} ch=false
06-26 08:20:11.271  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1
06-26 08:20:11.271  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:20:11.271  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:20:11.274  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:20:11.274  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:20:11.274  6784  6784 V InputMethodManager: Starting input: tba=de.badaix.snapcast ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
06-26 08:20:11.274  6784  6784 D InputMethodManager: startInputInner - Id : 0
06-26 08:20:11.274  6784  6784 I InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
06-26 08:20:11.283  6784  6784 D InputTransport: Input channel destroyed: 'ClientS', fd=77
06-26 08:20:12.061  6784 29500 D Main    : [Info] (Stream) no chunks available
06-26 08:20:14.955  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 0
06-26 08:20:15.081  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 1
06-26 08:20:15.081  6784  6784 D AbsListView: onTouchUp() mTouchMode : 1
06-26 08:20:15.911  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 0
06-26 08:20:16.037  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 1
06-26 08:20:16.037  6784  6784 D AbsListView: onTouchUp() mTouchMode : 1
06-26 08:20:16.814  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 0
06-26 08:20:16.931  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 1
06-26 08:20:16.933  6784 28819 D TCP     : Sending: {"jsonrpc":"2.0","method":"Client.SetVolume","id":38,"params":{"id":"26c6d10e-cae9-44a1-ae47-0da4b7a36ea3","volume":{"percent":100,"muted":false}}}
06-26 08:20:16.938  6784 28817 D TCP     : Received Message: '{"id":38,"jsonrpc":"2.0","result":{"volume":{"muted":false,"percent":100}}}'
06-26 08:20:16.938  6784 28817 D RC      : Response to: Client.SetVolume
06-26 08:20:16.938  6784 29500 D Main    : [Info] (Controller) ServerSettings - buffer: 400, latency: -318, volume: 100, muted: 0
06-26 08:20:19.169  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_RESIZED_REPORT: frame=(0,0,2560,1600) ci=(0,54,0,34) vi=(0,54,0,34) or=2
06-26 08:20:19.190  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=7 res=0x40003 s={true 535406936064} ch=false
06-26 08:20:19.190  6784 18111 D OpenGLRenderer: createReliableSurface : 0x7ca900f5c0(0x7ca8bd8000)
06-26 08:20:19.190  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x7ca90a5c80 -> 0x0
06-26 08:20:19.190  6784 18111 D OpenGLRenderer: destroyEglSurface : 0x7ca90a5c80
06-26 08:20:19.193  6784 18111 D OpenGLRenderer: ~ReliableSurface : 0x7cb5680cc0
06-26 08:20:19.199  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x0 -> 0x7cb555c100
06-26 08:20:19.333  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 0
06-26 08:20:19.395  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 1
06-26 08:20:19.833  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 0
06-26 08:20:19.905  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 1
06-26 08:20:20.593  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 0
06-26 08:20:20.645  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 1
06-26 08:20:21.101  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 0
06-26 08:20:21.104  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme key 1
06-26 08:20:21.674  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_RESIZED_REPORT: frame=(0,0,2560,1600) ci=(0,54,0,34) vi=(0,54,0,34) or=2
06-26 08:20:21.696  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=4 res=0x40003 s={true 535406936064} ch=false
06-26 08:20:21.696  6784 18111 D OpenGLRenderer: createReliableSurface : 0x7ca8a1e840(0x7ca8bd8000)
06-26 08:20:21.697  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x7cb555c100 -> 0x0
06-26 08:20:21.697  6784 18111 D OpenGLRenderer: destroyEglSurface : 0x7cb555c100
06-26 08:20:21.698  6784 18111 D OpenGLRenderer: ~ReliableSurface : 0x7ca900f5c0
06-26 08:20:21.701  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x0 -> 0x7ca90a5400
06-26 08:20:44.303  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0 1
06-26 08:20:44.303  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:20:44.303  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:20:45.753  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1
06-26 08:20:45.753  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:20:45.753  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:20:45.778  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0 1
06-26 08:20:45.778  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:20:45.778  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:20:46.371  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x7ca90a5400 -> 0x0
06-26 08:20:46.372  6784 18111 D OpenGLRenderer: destroyEglSurface : 0x7ca90a5400
06-26 08:20:46.373  6784 18111 D OpenGLRenderer: ~ReliableSurface : 0x7ca8a1e840
06-26 08:20:46.381  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)8 dur=8 res=0x5 s={false 0} ch=true
06-26 08:20:46.396  6784  6784 D InputTransport: Input channel destroyed: 'ClientS', fd=74
06-26 08:20:46.418  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: stopped(true) old=false
06-26 08:20:46.455  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)8 dur=4 res=0x5 s={false 0} ch=false
06-26 08:28:32.696  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:28:32.696  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:28:32.696  6784  6784 V InputMethodManager: Starting input: tba=de.badaix.snapcast ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
06-26 08:28:32.696  6784  6784 D InputMethodManager: startInputInner - Id : 0
06-26 08:28:32.696  6784  6784 I InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
06-26 08:28:32.701  6784  6784 D InputTransport: Input channel destroyed: 'ClientS', fd=74
06-26 08:28:33.117  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: stopped(true) old=false
06-26 08:28:33.118  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x7cb555c500 -> 0x0
06-26 08:28:33.516  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 0 1
06-26 08:28:33.516  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:28:33.516  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:29:00.616  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_RESIZED_REPORT: frame=(0,0,2560,1600) ci=(0,54,0,34) vi=(0,54,0,34) or=2
06-26 08:29:00.655  6784  6784 E ViewRootImpl@2c404dd[MainActivity]: Surface is not valid.
06-26 08:29:00.669  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: stopped(false) old=true
06-26 08:29:00.688  6784 18111 D OpenGLRenderer: destroyEglSurface : 0x7cb555c500
06-26 08:29:00.689  6784 18111 D OpenGLRenderer: ~ReliableSurface : 0x7cb52d1800
06-26 08:29:00.696  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=6 res=0x40001 s={true 535618355200} ch=true
06-26 08:29:00.696  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: RELAYOUT_RES_KEEP_ALIVE_SURFACE on 40001
06-26 08:29:00.696  6784 18111 D OpenGLRenderer: createReliableSurface : 0x7cb52d1800(0x7cb5578000)
06-26 08:29:00.699  6784 18111 D OpenGLRenderer: makeCurrent EglSurface : 0x0 -> 0x7d02443000
06-26 08:29:00.700  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: stopped(false) old=false
06-26 08:29:00.700  6784  6784 D Main    : lastRunVersion: 2000, version: 2000
06-26 08:29:00.718  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=4 res=0x40001 s={true 535618355200} ch=false
06-26 08:29:00.732  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: MSG_WINDOW_FOCUS_CHANGED 1 1
06-26 08:29:00.732  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:29:00.732  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:29:00.733  6784  6784 D InputMethodManager: prepareNavigationBarInfo() DecorView@fb6098c[MainActivity]
06-26 08:29:00.733  6784  6784 D InputMethodManager: getNavigationBarColor() -855310
06-26 08:29:00.733  6784  6784 V InputMethodManager: Starting input: tba=de.badaix.snapcast ic=null mNaviBarColor -855310 mIsGetNaviBarColorSuccess true , NavVisible : true , NavTrans : false
06-26 08:29:00.733  6784  6784 D InputMethodManager: startInputInner - Id : 0
06-26 08:29:00.733  6784  6784 I InputMethodManager: startInputInner - mService.startInputOrWindowGainedFocus
06-26 08:29:00.735  6784  6784 D InputTransport: Input channel destroyed: 'ClientS', fd=75
06-26 08:29:02.091  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 0
06-26 08:29:02.226  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 1
06-26 08:29:02.649  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 0
06-26 08:29:02.712  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 1
06-26 08:29:02.728  6784  6784 D Service : stopPlayer
06-26 08:29:02.729  6784  6784 D Service : stopService
06-26 08:29:02.729  6784  6784 D Service : stop
06-26 08:29:02.729  6784  6784 D Service : stopProcess
06-26 08:29:02.731  6784 29500 W System.err: java.io.InterruptedIOException: read interrupted
06-26 08:29:02.736  6784 29500 W System.err:    at libcore.io.Linux.readBytes(Native Method)
06-26 08:29:02.736  6784 29500 W System.err:    at libcore.io.Linux.read(Linux.java:190)
06-26 08:29:02.736  6784 29500 W System.err:    at libcore.io.ForwardingOs.read(ForwardingOs.java:177)
06-26 08:29:02.736  6784 29500 W System.err:    at libcore.io.BlockGuardOs.read(BlockGuardOs.java:303)
06-26 08:29:02.736  6784 29500 W System.err:    at libcore.io.ForwardingOs.read(ForwardingOs.java:177)
06-26 08:29:02.736  6784 29500 W System.err:    at libcore.io.IoBridge.read(IoBridge.java:513)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.FileInputStream.read(FileInputStream.java:313)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.BufferedInputStream.read1(BufferedInputStream.java:286)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.BufferedInputStream.read(BufferedInputStream.java:347)
06-26 08:29:02.736  6784 29500 W System.err:    at sun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:291)
06-26 08:29:02.736  6784 29500 W System.err:    at sun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:355)
06-26 08:29:02.736  6784 29500 W System.err:    at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:181)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.InputStreamReader.read(InputStreamReader.java:184)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.BufferedReader.fill(BufferedReader.java:172)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.BufferedReader.readLine(BufferedReader.java:335)
06-26 08:29:02.736  6784 29500 W System.err:    at java.io.BufferedReader.readLine(BufferedReader.java:400)
06-26 08:29:02.736  6784 29500 W System.err:    at de.badaix.snapcast.SnapclientService$1.run(SnapclientService.java:246)
06-26 08:29:02.736  6784 29500 W System.err:    at java.lang.Thread.run(Thread.java:919)
06-26 08:29:02.855  6784 28817 D TCP     : Received Message: '{"jsonrpc":"2.0","method":"Client.OnDisconnect","params":{"client":{"config":{"instance":1,"latency":-318,"name":"Bett","volume":{"muted":false,"percent":100}},"connected":false,"host":{"arch":"arm64-v8a","ip":"192.168.10.107","mac":"08:ae:d6:5d:7f:ed","name":"SM-T835","os":"Android 10"},"id":"26c6d10e-cae9-44a1-ae47-0da4b7a36ea3","lastSeen":{"sec":1593152940,"usec":182057},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.20.0"}},"id":"26c6d10e-cae9-44a1-ae47-0da4b7a36ea3"}}'
06-26 08:29:03.395  6784  6784 D Main    : onPlayerStop
06-26 08:29:03.403  6784  6784 D Main    : updateStartStopMenuItem: ic_media_play
06-26 08:29:03.427  6784  6784 I Choreographer: Skipped 41 frames!  The application may be doing too much work on its main thread.
06-26 08:29:03.444  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: Relayout returned: old=(0,0,2560,1600) new=(0,0,2560,1600) req=(2560,1600)0 dur=10 res=0x40001 s={true 535618355200} ch=false
06-26 08:29:04.168  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 0
06-26 08:29:04.279  6784  6784 D ViewRootImpl@2c404dd[MainActivity]: ViewPostIme pointer 1
06-26 08:29:04.322  6784  6784 D Service : start host: 192.168.1.100, port: 1704
06-26 08:29:04.323  6784  6784 D Service : Running on a non-TV Device
06-26 08:29:04.326  6784  6784 D Service : startProcess
06-26 08:29:04.327  6784  6784 I Service : Configured engine: Auto, active engine: oboe, sampleformat: 48000:16:*
06-26 08:29:04.715  6784 32600 D Main    : onPlayerStart
06-26 08:29:04.716  6784 32600 D Main    : [Info] (Connection) Resolving host IP for: 192.168.1.100
06-26 08:29:04.716  6784 32600 D Main    : [Info] (Connection) Connecting
06-26 08:29:04.716  6784  6784 D Main    : updateStartStopMenuItem: ic_media_stop
06-26 08:29:04.720  6784 32600 D Main    : [Notice] (Connection) Connected to 192.168.1.100
06-26 08:29:05.996  6784 32600 D Main    : [Info] (Connection) My MAC: "08:ae:d6:5d:7f:ed", socket: 7
06-26 08:29:06.001  6784 28817 D TCP     : Received Message: '{"jsonrpc":"2.0","method":"Client.OnConnect","params":{"client":{"config":{"instance":1,"latency":-318,"name":"Bett","volume":{"muted":false,"percent":100}},"connected":true,"host":{"arch":"arm64-v8a","ip":"192.168.10.107","mac":"08:ae:d6:5d:7f:ed","name":"SM-T835","os":"Android 10"},"id":"26c6d10e-cae9-44a1-ae47-0da4b7a36ea3","lastSeen":{"sec":1593152943,"usec":327750},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.20.0"}},"id":"26c6d10e-cae9-44a1-ae47-0da4b7a36ea3"}}'
06-26 08:29:06.006  6784 32600 D Main    : [Info] (Controller) ServerSettings - buffer: 400, latency: -318, volume: 100, muted: 0
06-26 08:29:06.008  6784 32600 D Main    : [Info] (Controller) Codec: flac, sampleformat: 44100:16:2
06-26 08:29:06.008  6784 32600 D Main    : [Info] (Player) Player name: oboe, device: default, description: <none>, idx: -1, sharing mode: shared
06-26 08:29:06.008  6784 32600 D Main    : [Info] (Player) Mixer mode: software, parameters: <none>
06-26 08:29:06.008  6784 32600 D Main    : [Info] (Player) Sampleformat: 44100:16:2, stream: 44100:16:2
06-26 08:29:06.009  6784 32600 D Main    : [Info] (OboePlayer) Init start
06-26 08:29:06.009  6784 32600 D Main    : [Info] (OboePlayer) DefaultStreamValues::SampleRate: 48000, DefaultStreamValues::FramesPerBurst: 192
06-26 08:29:06.032  6784 32600 D Main    : [Info] (OboePlayer) BufferSizeInFrames: 1764, FramesPerBurst: 882
06-26 08:29:06.032  6784 32600 D Main    : [Info] (OboePlayer) AudioApi: AAudio
06-26 08:29:06.032  6784 32600 D Main    : [Info] (OboePlayer) Init done
06-26 08:29:06.032  6784 32600 D Main    : [Info] (OboePlayer) Start
06-26 08:29:06.032  6784 32600 D Main    : [Info] (Stream) no chunks available
06-26 08:29:06.296  6784 32600 D Main    : [Info] (Controller) diff to server [ms]: 2.0607e+09
06-26 08:29:07.005  6784 32600 D Main    : [Debug] (Stats) Chunk: -2    -2      -1      -1      28      89      0
06-26 08:29:08.007  6784 32600 D Main    : [Debug] (Stats) Chunk: -2    -2      -2      -2      100     87      0
06-26 08:29:09.005  6784 32600 D Main    : [Debug] (Stats) Chunk: 0     0       -2      -2      172     89      3
06-26 08:29:10.005  6784 32600 D Main    : [Debug] (Stats) Chunk: -1    -1      0       -1      243     89      1

I don't have the exact point of failure, the log doesn't seem to go back that far.
However, when it happens i get this when playing content (without sound)

06-26 07:46:10.686  6784 28817 D TCP     : Received Message: '{"jsonrpc":"2.0","method":"Client.OnVolumeChanged","params":{"id":"26c6d10e-cae9-44a1-ae47-0da4b7a36ea3","volume":{"muted":false,"percent":8}}}'
06-26 07:46:10.689  6784 28836 D Main    : [Info] (Controller) ServerSettings - buffer: 400, latency: -318, volume: 8, muted: 0
06-26 07:46:10.696  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:10.836  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 10 lines
06-26 07:46:10.836  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:10.855  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:11.576  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 51 lines
06-26 07:46:11.576  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:11.596  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:11.616  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:12.556  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 68 lines
06-26 07:46:12.576  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:12.596  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:12.836  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 18 lines
06-26 07:46:12.855  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:12.876  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:13.575  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 50 lines
06-26 07:46:13.576  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:13.595  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:13.635  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 2 lines
06-26 07:46:13.635  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:13.655  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:13.675  6784 28836 D Main    : [Info] (Stream) outputBufferDacTime > bufferMs: 2147483 > 718
06-26 07:46:13.676  6784 28836 I chatty  : uid=10018(de.badaix.snapcast) identical 1 line

After restarting the service it looks normal:

06-26 08:38:10.012  6784  5303 I chatty  : uid=10018(de.badaix.snapcast) Thread-16 identical 1 line
06-26 08:38:11.012  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:12.013  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:13.012  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:14.013  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:15.012  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:16.013  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:17.013  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:18.012  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:19.012  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:20.012  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0
06-26 08:38:21.014  6784  5303 D Main    : [Debug] (Stats) Chunk: 0     0       0       0       500     112     0

Could it be an issue with the buffer?

Feature request: Quicker stream change via dropdown (like Snapweb) or buttons

I recently upgraded my system from an old version and discovered Snapweb for the first time; I am very impressed by it, particularly the ability to change the stream on a client or group with a drop-down menu; this makes it very quick and easy to select different "channels" per client.

I was hoping this feature would also be available in Snapdroid; currently, it takes four taps (gear, current stream, new stream, back) to change stream. So either a dropdown like Snapweb (two taps), or, even better, just a list of streams horizontally as radio buttons at the top, on the left of the gear, where the current stream name is, would make changing very quick.

I'm afraid my Java-foo is non-existent so I'm not sure how much help I could be coding this, but happy to give it a go is someone can point me in the right direction.

Build Snapdroid in Windows 10

Hello,
I have problem when build the Snapdroid in Windows 10
I used :

  • NDK Version 24.0.8215888
  • CMake Version 3.22.1

I have set maven credentials (username and password) and sync the Gradle. but I getting error:

Task :prepareKotlinBuildScriptModel UP-TO-DATE
C/C++: debug|x86 :CMake Error at D:/android-sdk/cmake/3.22.1/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
C/C++: debug|x86 : Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
C/C++: debug|x86 :Call Stack (most recent call first):
C/C++: debug|x86 : D:/android-sdk/cmake/3.22.1/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
C/C++: debug|x86 : D:/android-sdk/cmake/3.22.1/share/cmake-3.22/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
C/C++: debug|x86 : CMakeLists.txt:151 (find_package)
[CXX1405] error when building with cmake using D:\Workspace Android\snapdroid\Snapcast\src\main\cpp\snapcast\CMakeLists.txt: Build command failed.
Error while executing process D:\android-sdk\cmake\3.22.1\bin\cmake.exe with arguments {-HD:\Workspace Android\snapdroid\Snapcast\src\main\cpp\snapcast -DCMAKE_SYSTEM_NAME=Android -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_SYSTEM_VERSION=19 -DANDROID_PLATFORM=android-19 -DANDROID_ABI=x86 -DCMAKE_ANDROID_ARCH_ABI=x86 -DANDROID_NDK=D:\android-sdk\ndk\24.0.8215888 -DCMAKE_ANDROID_NDK=D:\android-sdk\ndk\24.0.8215888 -DCMAKE_TOOLCHAIN_FILE=D:\android-sdk\ndk\24.0.8215888\build\cmake\android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=D:\android-sdk\cmake\3.22.1\bin\ninja.exe -DCMAKE_CXX_FLAGS=-std=c++14 -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=D:\Workspace Android\snapdroid\Snapcast\build\intermediates\cxx\Debug\57n3r2m2\obj\x86 -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=D:\Workspace Android\snapdroid\Snapcast\build\intermediates\cxx\Debug\57n3r2m2\obj\x86 -DCMAKE_BUILD_TYPE=Debug -DCMAKE_FIND_ROOT_PATH=D:\Workspace Android\snapdroid\Snapcast.cxx\Debug\57n3r2m2\prefab\x86\prefab -BD:\Workspace Android\snapdroid\Snapcast.cxx\Debug\57n3r2m2\x86 -GNinja -DANDROID_STL=c++_static -DBUILD_SERVER=OFF -DBUILD_TESTS=OFF}
-- Android: Targeting API '19' with architecture 'x86', ABI 'x86', and processor 'i686'
-- Android: Selected unified Clang toolchain
-- The CXX compiler identification is Clang 14.0.1
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Check for working CXX compiler: D:/android-sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/windows-x86_64/bin/clang++.exe - skipped
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The C compiler identification is Clang 14.0.1
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working C compiler: D:/android-sdk/ndk/24.0.8215888/toolchains/llvm/prebuilt/windows-x86_64/bin/clang.exe - skipped
-- Detecting C compile features
-- Detecting C compile features - done
-- Performing Test HAVE_CXX_ATOMICS_WITHOUT_LIB
-- Performing Test HAVE_CXX_ATOMICS_WITHOUT_LIB - Success
-- Configuring incomplete, errors occurred!
See also "D:/Workspace Android/snapdroid/Snapcast/.cxx/Debug/57n3r2m2/x86/CMakeFiles/CMakeOutput.log".

CMake Error at D:/android-sdk/cmake/3.22.1/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:230 (message):
Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
Call Stack (most recent call first):
D:/android-sdk/cmake/3.22.1/share/cmake-3.22/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)
D:/android-sdk/cmake/3.22.1/share/cmake-3.22/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)
CMakeLists.txt:151 (find_package)

BUILD SUCCESSFUL in 26s

Please help me resolve the error.
Thank you

Can connect with IP but not with hostname

Hi,

Snapdroid 0.24.0 detects my Snapcast server by its hostname and prefills the host field, and the ports fields (1704+1705). But it can not connect to the server.

Using the IP of the server instead of the hostname works. With other clients such as https://github.com/cristianpb/muse, using the hostname works. Everything else seems fine, though :)

My Snapserver is v0.23.0 (cannot compile the v0.24.0). Previously it was v0.15.0 and Snapdroid 0.24.0 was working with it too.

Also, thanks for this very cool stuff !

FR: Dark theme for Android

From @gerroon on January 16, 2018 17:44

Hi

It would be nice f we have a simple dark theme for Android . The current android features seems to be sufficient for now. We just need a dark theme for night use.

thanks

Copied from original issue: badaix/snapcast#346

Support for opus codec

The Android app can't play opus audio streams. I guess it's because the opus decoder it's not native to all versions of Android?

No sound on android client

I am having trouble with my android clients. If I start the playback on any android device, it plays sound for less then a second und then is silent forever. I have no clue why. This happens with version 0.27 and 0.26 on Android 13 and a five year old android. The sever is only throwing errors, after I hit the stop button in the app.

Here is what the snapserver says on connect:

Sep 21 21:03:37 mopsam snapserver[2130895]: StreamServer::NewConnection: 192.168.0.72
Sep 21 21:03:37 mopsam snapserver[2130895]: Hello from 8c60dc36-671d-4124-9b17-0da45115e3a4, host: SM-S911B, v0.27.0, ClientName: Snapclient, OS: Android 13, Arch: arm64-v8a, Protocol version: 2

And this is shown, after I stop the playback again:

Sep 21 21:04:02 mopsam snapserver[2130895]: Error reading message header of length 0: End of file
Sep 21 21:04:02 mopsam snapserver[2130895]: onDisconnect: 8c60dc36-671d-4124-9b17-0da45115e3a4
Sep 21 21:04:02 mopsam snapserver[2130895]: Error in socket shutdown: Transport endpoint is not connected

Can anyone please help?

Snapdroid does not play any audio

When playing some audio with Snapdroid 24.0.0 on my Android 10 (LineageOS), my phone keeps being quiet. The audio perfectly plays on my RaspberryPi with Snapclient.
I started playing while tracing the log of the app with:
adb shell pidof -s de.badaix.snapcast
adb logcat --pid=xxxxx
The Android app cannot successfully contact the Snapserver, although everything is properly configured (see below). After hitting the play button in Snapdroid, it changes to a stop button but nothing else happens.
Does anybody know, what might cause such a problem?
Many thanks!

Nuesel

--------- beginning of main
04-10 19:41:10.401 26506 26506 W main : type=1400 audit(0.0:35480): avc: denied { write } for name="tasks" dev="tmpfs" ino=6046 scontext=u:r:zygote:s0 tcontext=u:object_r:device:s0 tclass=file permissive=0 app=de.badaix.snapcast
04-10 19:41:10.401 26506 26506 W main : type=1300 audit(0.0:35480): arch=40000028 syscall=334 per=8 success=no exit=-13 a0=ffffff9c a1=e7043a40 a2=2 a3=0 items=0 ppid=3439 auid=4294967295 uid=0 gid=10145 euid=0 suid=0 fsuid=0 egid=10145 sgid=10145 fsgid=10145 ses=4294967295 tty=(none) exe="/system/bin/app_process32" subj=u:r:zygote:s0 key=(null) app=de.badaix.snapcast
04-10 19:41:10.510 26506 26506 I MultiDex: VM with version 2.1.0 has multidex support
04-10 19:41:10.510 26506 26506 I MultiDex: Installing application
04-10 19:41:10.510 26506 26506 I MultiDex: VM has multidex support, MultiDex support library is disabled.
04-10 19:41:22.789 26506 26506 W ActivityThread: handleWindowVisibility: no activity for token android.os.BinderProxy@2af5461
04-10 19:41:24.588 26506 26506 D GroupList: onCreateView: GroupListFragment{85c511a (f380fd66-9b78-42f0-8ea8-23a0564f7216) id=0x7f09008e}
04-10 19:41:24.593 26506 26506 D Main : Samplerate: 8000
04-10 19:41:24.597 26506 26506 D Main : Samplerate: 8000, buffer: 1408
04-10 19:41:24.597 26506 26506 D Main : Samplerate: 11025
04-10 19:41:24.597 26506 26506 D Main : Samplerate: 11025, buffer: 1920
04-10 19:41:24.597 26506 26506 D Main : Samplerate: 16000
04-10 19:41:24.597 26506 26506 D Main : Samplerate: 16000, buffer: 2816
04-10 19:41:24.597 26506 26506 D Main : Samplerate: 22050
04-10 19:41:24.598 26506 26506 D Main : Samplerate: 22050, buffer: 3840
04-10 19:41:24.598 26506 26506 D Main : Samplerate: 44100
04-10 19:41:24.598 26506 26506 D Main : Samplerate: 44100, buffer: 7552
04-10 19:41:24.598 26506 26506 D Main : Samplerate: 48000
04-10 19:41:24.598 26506 26506 D Main : Samplerate: 48000, buffer: 8192
04-10 19:41:24.599 26506 26506 D Main : Samplerate: 48000
04-10 19:41:24.613 26506 26630 D RC : onConnecting
04-10 19:41:24.694 26506 26626 D mali_winsys: EGLint new_window_surface(egl_winsys_display*, void*, EGLSurface, EGLConfig, egl_winsys_surface**, egl_color_buffer_format*, EGLBoolean) returns 0x3000, [1080x1920]-format:1
04-10 19:41:24.700 26506 26626 W Gralloc3: mapper 3.x is not supported
04-10 19:41:24.702 26506 26630 D TCP : Connecting to 192.168.84.20:1705
04-10 19:41:24.704 26506 26626 E ion : ioctl c0044901 failed with code -1: Invalid argument
04-10 19:41:24.708 26506 26630 D RC : onConnected
04-10 19:41:24.710 26506 26646 D TCP : Sending: {"jsonrpc":"2.0","method":"Server.GetStatus","id":0}
04-10 19:41:24.718 26506 26630 D TCP : Received Message: '{"id":0,"jsonrpc":"2.0","result":{"server":{"groups":[{"clients":[{"config":{"instance":1,"latency":0,"name":"","volume":{"muted":false,"percent":100}},"connected":false,"host":{"arch":"aarch64","ip":"192.168.84.149","mac":"e4:5f:01:87:46:59","name":"Musikbox","os":"Debian GNU/Linux 11 (bullseye)"},"id":"e4:5f:01:87:46:59","lastSeen":{"sec":1649612299,"usec":9058},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.26.0"}},{"config":{"instance":1,"latency":0,"name":"Ubuntu Laptop","volume":{"muted":false,"percent":100}},"connected":false,"host":{"arch":"x86_64","ip":"192.168.84.110","mac":"98:2c:bc:39:06:57","name":"ubuntu","os":"Linux Mint 20.3"},"id":"98:2c:bc:39:06:57","lastSeen":{"sec":1644178156,"usec":25267},"snapclient":{"name":"Snapclient","protocolVersion":2,"version":"0.26.0"}}],"id":"59bc600a-2ea4-c332-e1af-b0aa759174fe","muted":false,"name":"","stream_id":"default"}],"server":{"host":{"arch":"x86_64","ip":"","mac":"","name":"george","os":"Ubuntu 20.04.2 LTS"},"snapserver":{"controlProtocolVersion":1,"name":"Snapserver","protocolVersion":1,"version":"0.26.0"}},"streams":[{"id":"default","properties":{"canControl":false,"canGoNext":false,"canGoPrevious":false,"canPause":false,"canPlay":false,"canSeek":false},"status":"playing","uri":{"fragment":"","host":"","path":"/tmp/snapfifo","query":{"chunk_ms":"40","codec":"flac","name":"default","sampleformat":"48000:16:2"},"raw":"pipe:////tmp/snapfifo?chunk_ms=40&codec=flac&name=default&sampleformat=48000:16:2","scheme":"pipe"}}]}}}'
04-10 19:41:24.719 26506 26630 D RC : Response to: Server.GetStatus
04-10 19:41:24.737 26506 26506 D Main : updateStartStopMenuItem: ic_media_play
04-10 19:41:35.009 26506 26506 D Service : start host: 192.168.84.20, port: 1704
04-10 19:41:35.010 26506 26506 D Service : Running on a non-TV Device
04-10 19:41:35.021 26506 26506 D Service : startProcess
04-10 19:41:35.022 26506 26506 I Service : Configured engine: Auto, active engine: oboe, sampleformat: 48000:16:*
04-10 19:41:35.041 26506 26659 D Main : onPlayerStart
04-10 19:41:35.041 26506 26506 D Main : updateStartStopMenuItem: ic_media_stop

error: Host unreachable

I'm running Snapserver on a different network, and I can connect to it fine from another network on both laptop and desktop by running snapclient -h <address of remote server>. However, when trying to connect my phone from the last network, it just reports "error: Host unreachable". Ports are standard and port forwarded so I'm not sure what's happening. Is there any way I can debug this?

Choppy playback over bluetooth

Hey there,
I'm having an issue where playback is fairly choppy over bluetooth on the android app, but plays normally over a wired connection to the same speaker (also plays fine from builtin phone speaker). I have tested this with 3 different bluetooth devices (headphones, and 2 speakers) with the same results. I also verified that spotify plays normally over the bluetooth without snapcast, so it seems snapcast/snapdroid/android is the issue, and not wifi or bluetooth connections.

I realize bluetooth will add latency to the playback, but for my purposes this is not an important feature. is the added bluetooth latency being calculated by the server or client and could this be the cause of the issue. if so, could we get an option to not worry about the sync of certain specified devices, and prioritize smooth playback? I'm just trying to listen to my phonograph in different rooms of the house, and/or on my bluetooth headphones.

server side: phono > rca/usb input(archlinux pc) > parec > fifo.
client side: snapdroid > bluetooth speaker

issue persists with all different codecs. my rca input device only supports 48k, so i haven't tried other rates. s16le

let me know if this is known behavior, or if i should provide any logs, or audio recordings of the issue.

19.0 Audio Issues

Hello, yesterday i tried the new 19.0 update.
This however, also added some new audio issues.

2 examples:

  1. When playing audio and switching the delay: Often there is no more music but a loud clicking noise coming from the speaker.
  2. Today i was muting one speaker and instead of silence, there was coming the same loud clicking noise.

Both can be fixed by stopping and restarting the connection from the menu.

Android: Snapdroid thin client

Hello,

Could I clone this code of yours, to make a very thin client of the snapdroid app, with no other client control, volume control?
I'd like to build a version that I will eventually install my garage with a old Android phone, that does not need the extra volume controls, etc. The plan is to also give my parents the same app, that they can listen to it as well, and not have them meddle around with other client volumes, etc.

Like to dumb it down as far as possible, with only a play/stop button in the app, but keep the other settings screens.
I do have only one server playing music, almost like webradio, so no need to have multi-audio grouping required.

Android client can only control another android once

From @gerroon on January 16, 2018 17:41

Hi

I seem to be able to control another android device's volume when I open the android apps . However after initial fiddling with another android device volume, I loose the ability to do so. I restart it works again.

On the otherhand the android client can control the Debian Snapclient no problem. This seems to be an android to android only.

thanks

Copied from original issue: badaix/snapcast#345

Add option to show ID instead of HOST Field in Stream Overview

Currently the host field is displayed as client name. When running snapcast client in docker it is an alphanumeric string like ad8901j9fd0.

As there is an unused unique id field that defaults to the macadress it shouldn't be hard to add and option to display the id field instead of the host field

or

a really simple approach would be to change the layout to display the ID by default.

Start/ Stop client with ADB

Hey there, I really love your project.
I've been using Snapcast for a while now and due to a recent update on my setup I've been wondering if there is a way to control snapdroid with adb commands. I am able to start and stop the app itself but I was hoping I could turn on/off the client as well. I'm planning on building my device into another setup so this would be immensely helpful. Otherwise I would always have to dis- and reassemble everything, if the client stops.

According to the SnapclientService.java and MainActivity.java files, I figured the intent must be something like ACTION_START or ACTION_STOP, but it doesn't work. The closest reaction I've got, seemed to be reopening the MainActivity on top of the existing one.

adb shell am broadcast -a android.intent.action.ACTION_START -d de.badaix.snapcast/.MainActivity --es "<snapserver-ip>" --ei 1704

Any help on this is highly appreciated.

Terminate if server goes down

I currently use the client on a tablet in the bathroom.
Once I'm done and going to bed, I turn of my HTPC and therefore also the snapcast server.
As such, it would be nice if the android client would stop trying to reconnect after some time (a minute sounds reasonable to me) as otherwise I'd imagine the battery would drain a lot more quickly.

This should only apply if Auto connect is not enabled of course.

Snapclient.so not found

Hello,

After successfully cloning your repos and stuff to build my own snapcast APK, it breaks when I try to start the snapclient.so binary, it says no such file, running on Android 13 on my Nothing Phone 1.

Lib location: /data/app/~~Rm6FJWhL1HQjzfEctD2Imw==/com.xx.snapdroid-wc7bYVFX2WlWqchndwCfAA==/lib/arm64
2023-04-06 23:10:48.710 10256-10256 System.err              com.xx.snapdroid          W  java.io.IOException: Cannot run program "/data/app/~~Rm6FJWhL1HQjzfEctD2Imw==/com.xx.snapdroid-wc7bYVFX2WlWqchndwCfAA==/lib/arm64/libsnapclient.so": error=2, No such file or directory

I can confirm with binwalk that the APK being built does have the library for all the architectures (x86, armeabi-v7a, x86_64 and arm64-v8a)

feature request: add a Start/Stop Button for remote clients

Wouldn´t it be great to be able stop a client ?

When using snapclient on less ore more headless Android TV devices, the Android App on another mobile in the same network is perfect as "remote control", except off "stopping" the client. Of course, the client can be muted, but that´s not the same I guess.

Funny thing is, that pressing mute/unmute re-starts the client again. Maybe the "Stop" isn´t far away...

Moreover, an additional Checkbox in the Snapclient Settings like "Auto start Snapclient" like i.e. "Start Snapclient in stopped mode" could be helpful.

A headless device with a snapclient on it auto-starts, but remains in stopped mode, so it can be (re-)activated by another Snapcast App on a mobile, etc.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.