GithubHelp home page GithubHelp logo

philippe44 / airconnect Goto Github PK

View Code? Open in Web Editor NEW
3.4K 66.0 213.0 2.31 GB

Use AirPlay to stream to UPnP/Sonos & Chromecast devices

License: Other

Makefile 3.09% C 89.31% Shell 3.46% C++ 3.99% Batchfile 0.15%
upnp chromecast airplay sonos dlna dlna-upnp dlna-player bridge

airconnect's People

Contributors

alcayaga avatar codepeon avatar giof71 avatar hofyyy avatar philippe44 avatar pwt avatar rtgoodwin avatar serpentdrago avatar timtn avatar timwaddell 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  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

airconnect's Issues

Audio never restarts if AirConnect is restarted when iPhone is playing

I've noticed a strange behavior around restarts that continues on v0.2.0.2.

Steps to reproduce:

  1. Stream from an iPhone to a Sonos speaker via AirConnect
  2. Hit "pause" on the iPhone
  3. Restart AirConnect
  4. Observe that the iPhone still is waiting to stream to the Sonos
  5. Hit "play" on the iPhone

Expected:

Audio eventually starts to play

Actual:

Silence

Stuck on binding

Running airupnp on my Mac seems to get stuck early on at a 'Binding to' stage and go no further. Any ideas what I'm doing wrong? Thanks

Audio dropouts with macOS / Sonos (UPnP)

Music will stop playing for 1-3 seconds and then resume. It happens 2-3 or more times per song, or it may not happen at all after the next song. I have also seen that it crashes after several songs, it just stops.

This is what I can see during dropouts:

[23:22:29.669381] rtp_thread_func:624 [0x10081ea00]: Sending packets too slow -6 (skip: 0)
[23:22:30.130258] buffer_get_frame:753 [0x10081ea00]: buffer drain status [level:1] [W:30050 R:30049]
[23:22:30.321599] buffer_put_packet:433 [0x10081ea00]: buffer fill status [level:0] [W:30073 R:30073]
[23:22:34.221215] buffer_get_frame:753 [0x10081ea00]: buffer drain status [level:1] [W:30562 R:30561]
[23:22:34.407918] buffer_put_packet:433 [0x10081ea00]: buffer fill status [level:0] [W:30585 R:30585]
[23:22:38.305061] buffer_get_frame:753 [0x10081ea00]: buffer drain status [level:1] [W:31074 R:31073]
[23:22:38.495137] buffer_put_packet:433 [0x10081ea00]: buffer fill status [level:0] [W:31097 R:31097]
[23:22:42.398193] buffer_get_frame:753 [0x10081ea00]: buffer drain status [level:1] [W:31586 R:31585]
[23:52:16.649045] buffer_get_frame:763 [0x10081ea00]: created zero frame (fill:10,  W:56964 R:56953)
[23:52:16.649103] buffer_get_frame:763 [0x10081ea00]: created zero frame (fill:9,  W:56964 R:56954)
[23:52:16.649375] buffer_get_frame:763 [0x10081ea00]: created zero frame (fill:8,  W:56964 R:56955)
[23:52:16.649416] buffer_get_frame:763 [0x10081ea00]: created zero frame (fill:7,  W:56964 R:56956)
[23:52:16.649442] buffer_get_frame:763 [0x10081ea00]: created zero frame (fill:6,  W:56964 R:56957)
[23:52:16.649555] buffer_get_frame:763 [0x10081ea00]: created zero frame (fill:5,  W:56964 R:56958)

Volume needs to be adjusted after the script starts before Sonos starts playing anything

In my quest to stream audio from my computer (macOS 10.13.2) to my Sonos PLAY:1 over ethernet, I have to say this is by far the best solution that I have tried so far so thank you!

While u sing v0.1.5.2 I have noticed that, after starting the script, my SONOS only seems to start actually playing the audio after I have hit either of the volume adjust keys on my keyboard.

This is just something I happened to notice and shouldn't be too major as I presume many people start this running once and forget about it.

Thanks for an awesome script!
DeveloperACE

UPnP will not start on Mac

Hi philippe44, hoping you might be able to assist. I followed your instructions, but when I run the executable, I am getting the attached message. Am I missing something?
screenshot 2018-02-27 23 18 18

BOSE SoundTouch (not an issue - just an information)

Thanks for the awesome software! Just wanted to inform you, that is working like a charm with my bose SoundTouch devices. Maybe something you can add to the overall information. It seems that a lot of SoundTouch users are searching for such an solution. Regards, christian

Access only for specific MAC addresses

Hi,

In my opinion AirConnect is the only good working solution for AirPlay on Sonos. But I'm having one problem with AirConnect. When we are having guests in our home and they are connected to our WLAN, they are having automatically access to our Sonos speakers with their smartphones and (audio)apps. Would it be possible to add inside the config.xml a value to only grand access to specific MAC addresses? It wouldn't be a problem when guests could see our Sonos speakers, but I don't want them to be able to play something on them.

Thanks in advance.

Use with Docker?

Hi there, is there a documented way of getting this to work inside docker?

Playback reliably stops after 10-20 minutes with iTunes/Mac/Sonos PLAY:1

First - thanks for this project, really appreciate it.

Problem: Playback from iTunes on iMac to Sonos PLAY:1 reliably stops after 10-20 minutes.

macOS: 10.11.6 (El Capitan)
iTunes: 12.7.3.46
Sonos: up-to-date firmware as of 2/15/2018
AirConnect: 5faf953 0.2.0.3
Command: bin/airupnp-osx-multi -l 1500:3000

Basically I start airupnp, it loads up and runs fine. I hit play in iTunes and everything goes fine for 15-20 minutes. Then it just stops.

Here are the logs -- Audio stops at just about 8:06:06 - there's lots of log spew just after that
https://gist.github.com/anonymous/0f81501c1b976b2b50c0ca8f1ad4de8b

Happy to do any diagnostics or try anything to help solve this. The PLAY:1 was a gift but is pretty useless to us without AirPlay ๐Ÿ˜„

Name config

Changing 'name' or 'friendly name' in config doesn't modify the device name in AirPlay.

Sample config.xml

Can you provide a sample (or default) xml file that can then be customized? That would help those of us a little less tech savvy. In my case, I am running this on OSX (and it works very well, thank you!). I want to create a simple startup and config file so that I can install this on family computers of users who are not tech savvy at all. A sample xml would help considerably.

Thanks.

html_parse problem with airupnp and aircast crashes the apps

Hi Philippe, thanks a lot for this great project!!

one problem here:

I have compiled both aircast and airupnp from source on an
ubuntu trusty x86_64 system, installed some init scripts and have both running
as daemon processes, with an lms 7.9.1 server on the same system,..

everything works quite nicely, but from time to time there are problems like this when I stream
remotely from an iTunes server on an mac to a sonos play5 with airupnp:

[14:56:15.379919] handle_rtsp:512 [0x7f745c009990]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 7

[14:56:15.384438] http_parse:932 Request failed, bad header
*** Error in `/usr/bin/airupnp': double free or corruption (fasttop): 0x00007f7448173290 ***

and the daemon is dead and must get restartet,...

when I stream with aircast to a chromecast audio to the analog in of the sonos play5
its the same problem there:

[18:25:35.965617] handle_rtsp:341 [0x7fda600011f0]: received SET_PARAMETER
[18:25:35.965791] handle_rtsp:512 [0x7fda600011f0]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 52

[18:25:35.969446] http_parse:932 Request failed, bad header
*** Error in `../bin/aircast-x86-64': double free or corruption (fasttop): 0x00007fda60001c00 ***
than the daemons are dead and have to be restarted,..

this can be tracked down to the http_parse function in common/util.c when
the http socket is analysed and a string compare for ":" ends unsuccessfull,.. mmh,

this also happens with the original precompiled binaries in your package,
that is also why I have compiled both apps natively on my server, but this has not changed it..

please have a look into the problem, best wishes pbg4

Huge latency

Hi, I can start the server and everything is working fine but there is a big 10 seconds of latency from the time I press play on my iOS device and I can hear the sound from my Sonos speaker.

For listening to music it's not so bad (but you need to wait 10 seconds for the sound to stop when you press pause).
But for watching a video it is simply unusable.

is there a way to make the the video in sync or it is how AirPlay / the protocol works?

Thanks

autostart with custom config file?

I build a .service file to autostart the program with my own config file:

[Unit]
Description=AirUPnP bridge
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
ExecStart=/var/lib/airconnect/airupnp-arm -x configfile
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target

It was just a try, but it doesn't work at all. Is there a possibility to autostart the program with a custom config file?

How do I say thank-you?

I just got AirConnect working beautifully on a Raspberry Pi with very little effort, connecting to Sonos.

Perhaps you're too modest to have a tip-jar in the README, but I'd love a way to say thank-you for all your hard work, @philippe44. A PayPal or Amazon wishlist link would be ideal ;-)

Matthew

Config file not found when running as a service on RPi3

Hi,
First of all, Thanks for creating this. I am using it for a day and it is working great.

I have Aiconnect installed on my Raspberry Pi 3 and can send the songs to my Sonos devices. I decided to try and run this as a service so it is always on.

I have a configuration file created in the same directory as the executable that sets the latency and ignores some devices.

When i set as a service, I see the message "main:1209 no config file, using defaults" in the log file.

I was wondering if there is a way to make it run as a service and read the config file.

I initially started with the Airconnect directory in my Home directory and then moved it to /var/lib. Same issue in both cases.

Thanks for your help

Stream stops after group change? v0.2.0.2

Updated to v0.2.0.2 this morning, thanks for your work around player group addition! Stream reliability seems a bit better, but I did seem to hit a snag with group change/joining on Sonos.

Attempt 1 (and associated log)

  1. Stream was playing fine (iPhone X 11.3 pub beta 1 to AirConnect on macOS High Sierra, Sonos firmware Version: 8.3 (build 40549090)) to a group of 5 players (2 Play1, and 2 Play1 linked in Stereo, plus SUB).
  2. I added my last Play1 to the group, and shortly after that the stream stopped. I think the log entry with the group change is the Remove XXXX slave?
  3. At this point I can't seem to kill airupnp. I brought it to fg, tried Ctrl-C, but eventually it to kill -9 it.

See the terminal log below, and the error about description.xml, which seemed to correspond with AirConnect losing the audio stream. (The player on the iPhone continued playing silently.) AirConnect seems to try to recover, but the Sonos players never show up again in. I can load the description.xml fine in the browser, and have attached it to the issue. I'm not sure if anything is really sensitive in there; let me know and I can redact it.

device_description.xml.txt

Terminal log for Attempt 1 ```05:24 $ ./airupnp-osx-multi [05:25:37.278574] main:1185 Starting airupnp version: v0.2.0.2 (Jan 30 2018 @ 22:09:19) [05:25:37.281300] Start:945 Binding to 172.16.1.104:49152 [05:25:37.308677] AddMRDevice:861 [0x100079510]: adding renderer (Hopper(Master Bedroom)) [05:25:37.324654] MasterHandler:567 [0x100079510]: subscribe success [05:25:37.524226] AddMRDevice:861 [0x10007b0c0]: adding renderer (Master Bedroom) [05:25:37.538315] MasterHandler:567 [0x10007b0c0]: subscribe success [05:25:37.569767] ProcessEvent:376 [0x10007b0c0]: UPnP Volume local change 36 [05:25:37.645160] AddMRDevice:861 [0x10007cc70]: adding renderer (Lindsey Room) [05:25:37.660997] MasterHandler:567 [0x10007cc70]: subscribe success [05:25:37.686554] ProcessEvent:376 [0x10007cc70]: UPnP Volume local change 55 [05:25:41.966976] AddMRDevice:861 [0x10007e820]: adding renderer (Hopper(Living Room 1)) [05:25:41.972789] MasterHandler:567 [0x10007e820]: subscribe success [05:25:54.213235] rtsp_thread:296 got RTSP connection 14 [05:25:54.302536] handle_rtsp:340 [0x100203260]: challenge AqTASP9yZfUduTcT400kdQ== [05:25:54.333761] handle_rtsp:333 [0x100203260]: received ANNOUNCE [05:25:54.338340] handle_rtsp:504 [0x100203260]: responding: RTSP/1.0 200 OK Audio-Jack-Status: connected; type=analog CSeq: 3

[05:25:54.346064] handle_rtsp:333 [0x100203260]: received SETUP
[05:25:54.347063] hairtunes_init:275 [0x102008a00]: Using FLAC
[05:25:54.347397] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Transport: RTP/AVP/UDP;unicast;mode=record;control_port=57549;timing_port=59738;server_port=50811
Session: DEADBEEF
Audio-Jack-Status: connected; type=analog
CSeq: 4

[05:25:54.357447] handle_rtsp:333 [0x100203260]: received RECORD
[05:25:54.357479] callback:270 [0x10007b0c0]: Stream
[05:25:54.357518] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Latency: 44100
Audio-Jack-Status: connected; type=analog
CSeq: 5

[05:25:54.364542] handle_rtsp:333 [0x100203260]: received SET_PARAMETER
[05:25:54.364570] handle_rtsp:488 [0x100203260]: SET PARAMETER volume -19.127512
[05:25:54.364578] CtrlSetVolume:253 uPNP volume 36 for http://172.16.1.128:1400/MediaRenderer/GroupRenderingControl/Control (cookie 0x0)
[05:25:54.364684] callback:310 [0x10007b0c0]: Volume[0..100] 36
[05:25:54.364783] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 6

[05:25:54.372708] rtp_thread_func:581 [0x102008a00]: 1st sync packet received
[05:25:54.397363] handle_rtsp:333 [0x100203260]: received SET_PARAMETER
[05:25:54.397442] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 7

[05:25:54.407307] handle_rtsp:333 [0x100203260]: received SET_PARAMETER
[05:25:54.407358] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 8

[05:25:54.414773] handle_rtsp:333 [0x100203260]: received SET_PARAMETER
[05:25:54.414984] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 9

[05:25:54.433084] rtp_thread_func:581 [0x102008a00]: 1st sync packet received
[05:25:54.439885] handle_rtsp:333 [0x100203260]: received FLUSH
[05:25:54.439922] hairtunes_flush:353 [0x102008a00]: FLUSH ignored as seqno (63951) <= ab_read (0)
[05:25:54.439978] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 10

[05:25:54.462014] handle_rtsp:333 [0x100203260]: received SET_PARAMETER
[05:25:54.462101] handle_rtsp:504 [0x100203260]: responding:
RTSP/1.0 200 OK
Audio-Jack-Status: connected; type=analog
CSeq: 11

[05:25:54.462609] buffer_put_packet:445 [0x102008a00]: fill status [level:65535] [W:63950 R:63951]
[05:25:55.269735] search_remote_cb:542 [0x100203260]: found ActiveRemote for D28859BD2FB1EB71 at 172.16.1.166:62038
[05:25:56.323450] AVTSetURI:91 uPNP setURI http://172.16.1.104:59211/stream.flac for http://172.16.1.128:1400/MediaRenderer/AVTransport/Control (cookie 0x1)
[05:25:56.323907] AVTPlay:151 uPNP play for http://172.16.1.128:1400/MediaRenderer/AVTransport/Control (cookie 0x2)
[05:25:56.323978] CtrlSetVolume:253 uPNP volume 36 for http://172.16.1.128:1400/MediaRenderer/GroupRenderingControl/Control (cookie 0x2)
[05:25:56.351423] ActionHandler:413 [0x10007b0c0]: Waited action SetAVTransportURIResponse
[05:25:56.384887] ActionHandler:413 [0x10007b0c0]: Waited action SetGroupVolumeResponse
[05:25:56.398672] ActionHandler:413 [0x10007b0c0]: Waited action PlayResponse
[05:25:56.404463] http_thread_func:860 [0x102008a00]: got HTTP connection 20 (silent frames 250)
[05:25:56.405216] handle_http:996 [0x102008a00]: received GET
[05:25:56.405268] handle_http:1013 [0x102008a00]: responding:
HTTP/1.0 200 OK
Server: HairTunes
Content-Type: audio/flac
Connection: close

[05:25:56.410846] buffer_get_frame:780 [0x102008a00]: drain status [level:243] [W:64194 R:63951] [R:0 S:0]
[05:25:56.460588] ActionHandler:443 [0x10007b0c0]: uPNP transition
[05:25:56.972684] ActionHandler:452 [0x10007b0c0]: uPNP playing
[05:25:58.542371] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:64462 R:64462]
[05:25:58.547883] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:64464 R:64463] [R:0 S:0]
[05:26:02.622194] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:64974 R:64974]
[05:26:02.629962] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:64976 R:64975] [R:0 S:0]
[05:26:06.586074] buffer_put_packet:445 [0x102008a00]: fill status [level:9] [W:65486 R:65477]
[05:26:06.621855] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:65488 R:65487] [R:0 S:0]
[05:26:10.812721] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:462 R:462]
[05:26:10.822551] buffer_get_frame:780 [0x102008a00]: drain status [level:4] [W:467 R:463] [R:0 S:0]
[05:26:14.891999] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:974 R:974]
[05:26:14.899514] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:976 R:975] [R:0 S:0]
[05:26:18.972700] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:1486 R:1486]
[05:26:18.981893] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:1488 R:1487] [R:0 S:0]
[05:26:22.921001] UpdateThread:676 [0x10007cc70]: remove Sonos slave: Lindsey Room Sonos
[05:26:23.052827] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:1998 R:1998]
[05:26:23.058575] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:2000 R:1999] [R:0 S:0]
[05:26:27.132796] buffer_put_packet:445 [0x102008a00]: fill status [level:3] [W:2510 R:2507]
[05:26:27.140875] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:2512 R:2511] [R:0 S:0]
[05:26:31.242542] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:3022 R:3022]
[05:26:31.249114] buffer_get_frame:780 [0x102008a00]: drain status [level:4] [W:3027 R:3023] [R:0 S:0]
[05:26:35.321699] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:3534 R:3534]
[05:26:35.325201] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:3536 R:3535] [R:0 S:0]
[05:26:39.401454] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:4046 R:4046]
[05:26:39.406719] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:4048 R:4047] [R:0 S:0]
[05:26:43.485033] buffer_put_packet:445 [0x102008a00]: fill status [level:3] [W:4558 R:4555]
[05:26:43.493860] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:4560 R:4559] [R:0 S:0]
[05:26:47.592497] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:5070 R:5070]
[05:26:47.598655] buffer_get_frame:780 [0x102008a00]: drain status [level:4] [W:5075 R:5071] [R:0 S:0]
[05:26:51.671852] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:5582 R:5582]
[05:26:51.674735] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:5584 R:5583] [R:0 S:0]
[05:26:55.751961] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:6094 R:6094]
[05:26:55.756870] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:6096 R:6095] [R:0 S:0]
[05:26:59.831398] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:6606 R:6606]
[05:26:59.841238] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:6608 R:6607] [R:0 S:0]
[05:27:03.912815] buffer_put_packet:445 [0x102008a00]: fill status [level:3] [W:7118 R:7115]
[05:27:03.917780] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:7120 R:7119] [R:0 S:0]
[05:27:08.022104] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:7630 R:7630]
[05:27:08.022424] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:7632 R:7631] [R:0 S:0]
[05:27:12.101082] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:8142 R:8142]
[05:27:12.105825] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:8144 R:8143] [R:0 S:0]
[05:27:16.181227] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:8654 R:8654]
[05:27:16.185113] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:8656 R:8655] [R:0 S:0]
[05:27:20.263196] buffer_put_packet:445 [0x102008a00]: fill status [level:3] [W:9166 R:9163]
[05:27:20.266174] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:9168 R:9167] [R:0 S:0]
[05:27:24.371843] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:9678 R:9678]
[05:27:24.383087] buffer_get_frame:780 [0x102008a00]: drain status [level:4] [W:9683 R:9679] [R:0 S:0]
[05:27:28.453619] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:10190 R:10190]
[05:27:28.455092] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:10192 R:10191] [R:0 S:0]
[05:27:32.531069] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:10702 R:10702]
[05:27:32.539023] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:10704 R:10703] [R:0 S:0]
[05:27:36.610861] buffer_put_packet:445 [0x102008a00]: fill status [level:0] [W:11214 R:11214]
[05:27:36.615126] buffer_get_frame:780 [0x102008a00]: drain status [level:1] [W:11216 R:11215] [R:0 S:0]

[1]+ Stopped ./airupnp-osx-multi
โœ˜-145 ~/AirConnect/bin [master|โœš 1โš‘ 3]
05:27 $ [05:28:29.965599] UpdateThread:689 Error obtaining description http://172.16.1.123:1400/xml/device_description.xml -- error = -207

[05:28:30.437523] http_thread_func:877 HTTP close 20
./airupn[05:29:02.242682] UpdateThread:689 Error obtaining description http://172.16.1.123:1400/xml/device_description.xml -- error = -207

[05:29:50.292854] UpdateThread:689 Error obtaining description http://172.16.1.126:1400/xml/device_description.xml -- error = -207

[05:30:17.534861] read_line:1119 fd: 14 read error: Connection reset by peer
[05:30:17.534992] http_parse:1039 cannot read method
[05:30:17.535008] rtsp_thread:311 RTSP close 14
05:27 $ [05:34:11.338099] ActionHandler:466 Error in action callback -- -119 (cookie 0x133)
[05:34:51.147260] ActionHandler:448 [0x10007b0c0]: uPNP stopped

[05:34:51.147260] ActionHandler:448 [0x10007b0c0]: uPNP stopped
[05:39:11.731379] MasterHandler:545 [0x10007b0c0]: Auto-renewal failed, re-subscribing
[05:39:16.184365] MasterHandler:545 [0x100079510]: Auto-renewal failed, re-subscribing
[05:40:05.333559] MasterHandler:570 [0x10007b0c0]: subscribe fail, re-trying 1
[05:40:48.847999] MasterHandler:567 [0x100079510]: subscribe success
[05:40:57.200836] buffer_put_packet:445 [0x102008a00]: fill status [level:386] [W:11726 R:11340]
[05:41:04.708756] MasterHandler:567 [0x10007e820]: subscribe success
[05:41:13.311159] MasterHandler:545 [0x10007e820]: Auto-renewal failed, re-subscribing
[05:41:13.311214] MasterHandler:567 [0x10007b0c0]: subscribe success
[05:43:59.419601] MasterHandler:545 [0x10007b0c0]: Auto-renewal failed, re-subscribing
[05:43:59.419796] ProcessEvent:376 [0x10007b0c0]: UPnP Volume local change 40
[05:43:59.440782] MasterHandler:567 [0x10007b0c0]: subscribe success
[05:43:59.457284] ProcessEvent:376 [0x10007b0c0]: UPnP Volume local change 40
[05:44:00.073772] UpdateThread:633 [0x10007b0c0]: removing unresponsive player (Master Bedroom Sonos)
[05:44:00.093393] http_thread_func:940 [0x102008a00]: terminating
[05:44:00.093393]093446] rtp_thread_func:659 [0x102008a00]: terminating```

Attempt 2

Trying again, with all players grouped, then removing a group item Bathroom seemed to work fine, but did report the description.xml error again with UpdateThread:689 Error obtaining description http://169.254.178.48:49311/device.xml -- error = -204. (Note the different IP address range) Stream failed again shortly after, with more xml errors. (And again note the different IP address range.) My network is a Plume wifi, and all wireless and wired devices are DHCP in the 172.x range. I can't grab the referenced xml files for these other devices as the reported IPs are out of range. At no time was I attempted to play to the Dish Hopper (the device marked unresponsive).

End of terminal log for Attempt 2 ```[05:54:40.055185] UpdateThread:689 Error obtaining description http://169.254.178.48:49311/device.xml -- error = -204

[05:54:40.055213] UpdateThread:633 [0x100079510]: removing unresponsive player (Hopper(Master Bedroom))
[05:54:40.289121] UpdateThread:633 [0x10007b0c0]: removing unresponsive player (Master Bedroom Sonos)
[05:54:40.299267] http_thread_func:940 [0x102008200]: terminating
[05:54:40.300827] rtp_thread_func:659 [0x102008200]: terminating
[05:54:40.345178] UpdateThread:633 [0x10007cc70]: removing unresponsive player (Hopper(Living Room 1))
[05:54:40.599021] AddMRDevice:861 [0x100079510]: adding renderer (Master Bedroom)
[05:54:40.613064] MasterHandler:567 [0x100079510]: subscribe success
[05:54:40.642868] AddMRDevice:861 [0x10007b0c0]: adding renderer (Bathroom)
[05:54:40.658376] MasterHandler:567 [0x10007b0c0]: subscribe success
[05:54:40.666865] ProcessEvent:376 [0x100079510]: UPnP Volume local change 33
[05:54:40.682036] ProcessEvent:376 [0x10007b0c0]: UPnP Volume local change 45
[05:54:42.761741] AddMRDevice:861 [0x10007cc70]: adding renderer (Hopper(Living Room 1))
[05:54:42.773679] MasterHandler:567 [0x10007cc70]: subscribe success
[05:54:43.198627] AddMRDevice:861 [0x10007e820]: adding renderer (Hopper(Master Bedroom))
[05:54:43.213636] MasterHandler:567 [0x10007e820]: subscribe success
[05:54:54.792461] UpdateThread:689 Error obtaining description http://192.168.49.1:47365/upnp/dev/93ae2173-5cb3-b007-ffff-ffff887625df/desc -- error = -204

[05:54:59.794262] UpdateThread:689 Error obtaining description http://192.168.49.1:47365/upnp/dev/93ae2173-5cb3-b007-ffff-ffff887625df/desc -- error = -204```

FreeBSD version?

Hi,

just wanted to ask, if its possible to get a binary that runs on FreeBSD?

Sonos disappears after few minutes

Airupnp on BSD, Sonos is correctly found and works perfectly with Youtube app from iOS.

After few minutes, Sonos disappears from the list of devices on iOS.

Launching airupnp with all=sdebug reports nothing particular.

This is repeatable and happens after 3-5 minutes from airupnp launch.

(version 1.6.1)

Not Appearing in Sonos or AirPlay

I noticed my speakers weren't appearing in AirPlay, so I updated to 0.2.0.2, but now they don't appear in AirPlay, and airupnp does not appear in the "now playing" section of the Sonos app.
Log file:

[20:32:58.501313] main:1201 Starting airupnp version: v0.2.0.2 (Jan 30 2018 @ 22:09:20)
[20:32:58.501653] main:1209 no config file, using defaults
[20:32:58.504707] Start:961 Binding to 192.168.1.111:49153
[20:32:58.927528] AddMRDevice:874 [0x697a40]: adding renderer (Back Room)
[20:32:58.936814] MasterHandler:574 [0x697a40]: subscribe success
[20:32:58.959497] ProcessEvent:383 [0x697a40]: UPnP Volume local change 31
[20:32:59.005699] AddMRDevice:874 [0x6995d8]: adding renderer (Bedroom)
[20:32:59.015117] MasterHandler:574 [0x6995d8]: subscribe success
[20:32:59.031508] ProcessEvent:383 [0x6995d8]: UPnP Volume local change 13

I rebooted my computer, and updated my speakers (which may actually be the issue), and I'm still getting the same problem and the same log. My computer and speakers are on the same network.

Right way to run on Raspberry Pi startup

Do you have a suggestion on how to properly startup bin/airupnp-arm after the PI boots?

I currently have this line (which works when I run it from a terminal) in my /etc/rc.local file:

/absolute/path/to/repos/AirConnect/bin/airupnp-arm -l 1000:2000 -z &

I have made the file executable with chmod +x and confirmed it runs properly when I run it manually, however, it does not seem to run on startup. There is also no process running when I try ps aux | grep airupnp. I find it strange since this is the same place I run airsonos from as well.

I thought maybe its because the network is not setup yet, so was considering putting a script in /etc/network/if-up.d/ but have not tried it yet.

Thx.

Glitchy Playback

After launching airpnp-osx-multi on my mac, music plays fine for a bit then gets glitchy. Eventually, it stops, and terminal displays line after line similar to this:

[14:43:12.471951] http_thread_func:919 [0x101001c00]: spent 54 ms in send!
[14:43:12.590509] http_thread_func:919 [0x101001c00]: spent 54 ms in send!
[14:43:13.433228] http_thread_func:919 [0x101001c00]: spent 66 ms in send!
[14:43:13.552526] http_thread_func:919 [0x101001c00]: spent 78 ms in send!
[14:43:14.410851] http_thread_func:919 [0x101001c00]: spent 858 ms in send!
[14:43:14.523966] http_thread_func:919 [0x101001c00]: spent 108 ms in send!
[14:43:14.623907] http_thread_func:919 [0x101001c00]: spent 66 ms in send!

Occasionally, their is a line similar to:

[14:46:29.582538] rtp_thread_func:640 [0x101001c00]: Sending packets too slow -6 (skip: 0)

I tried adjusting the latency, but it had no effect. I am not well versed in this stuff, but I have no idea what to do.

Musl versions instead of Glibc?

It would be pretty useful to run this stuff in Docker.

In order to keep the Docker images small as possible, Alpine is much used.
Nevertheless, Alpine does not have glibc, but is instead based on musl.

Could you provide binaries for this?

$ ldd airupnp-x86-64
	/lib64/ld-linux-x86-64.so.2 (0x7f51567bf000)
	libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f51567bf000)
	libcrypto.so.1.0.0 => /lib/libcrypto.so.1.0.0 (0x7f515639f000)
	libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f51567bf000)
	librt.so.1 => /lib64/ld-linux-x86-64.so.2 (0x7f51567bf000)
	libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f51567bf000)
	libz.so.1 => /lib/libz.so.1 (0x7f5156188000)
Error relocating airupnp-x86-64: __strncpy_chk: symbol not found
Error relocating airupnp-x86-64: __fprintf_chk: symbol not found
Error relocating airupnp-x86-64: __printf_chk: symbol not found
Error relocating airupnp-x86-64: __memcpy_chk: symbol not found
Error relocating airupnp-x86-64: __vsnprintf_chk: symbol not found
Error relocating airupnp-x86-64: __strcat_chk: symbol not found
Error relocating airupnp-x86-64: __asprintf_chk: symbol not found
Error relocating airupnp-x86-64: __vfprintf_chk: symbol not found
Error relocating airupnp-x86-64: __vsprintf_chk: symbol not found
Error relocating airupnp-x86-64: __strcpy_chk: symbol not found
Error relocating airupnp-x86-64: __fread_chk: symbol not found
Error relocating airupnp-x86-64: __sprintf_chk: symbol not found
Error relocating airupnp-x86-64: __snprintf_chk: symbol not found
Error relocating airupnp-x86-64: __fdelt_chk: symbol not found

Stuck under Windows

Hi, Thanks for the project, looking really promising!

When loading it seems to gets stuck under windos 10 or indeed Windows Home Server 2011 with the following output:

C:\Users\Administrator\Desktop\ircast>aircast-win.exe
[06:09:01.128] main:826 Starting aircast version: v0.1.4.3 (Dec 10 2017 @ 21:27:
56)
[06:09:01.128] main:834 no config file, using defaults
[06:09:01.752] Start:630 Binding to 192.168.1.14

No matter how long you wait it doesn't seem to get further. Run as admin and disabled firewall to no avail?

AirUPNP: ALAC support

Please add ALAC "passthrough" support.

My streamer supports the ALAC codec, so it basically does not need transcoding and could be fed the ALAC codec'ed audio stream from AirPlay directly.

Compiling on Windows needs clarification

First of all, thanks for your project!

Since there's no Makefile for Windows it would be great to get some hints on how to compile on Windows.

From the dlls I guess you use a Borland C++ compiler. Is that right?

SIGSEGV in airupnp.c

It seems you can have a NULL pointer at airupnp.c:569, you should place the 's = ' assignment out of the if function and make sure you do not access s when it is NULL ;-)

Thread 8 "airupnp-x86-64" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff39aa700 (LWP 8910)]
MasterHandler (EventType=<optimized out>, _Event=0x7ffff39a9c30,
    Cookie=<optimized out>) at ./src/airupnp.c:576
576                             }
(gdb) bt
#0  MasterHandler (EventType=<optimized out>, _Event=0x7ffff39a9c30,
    Cookie=<optimized out>) at ./src/airupnp.c:576
#1  0x00005555555bcc5d in UpnpThreadDistribution (Param=0x7fffe00359b0)
    at src/api/upnpapi.c:3642
#2  0x00005555555d1637 in WorkerThread (arg=0x5555558252e0 <gSendThreadPool>)
    at src/ThreadPool.c:576
#3  0x00007ffff7bc151a in start_thread (arg=0x7ffff39aa700)
    at pthread_create.c:465
#4  0x00007ffff6aa63ef in clone ()
    at ../sysdeps/unix/sysv/linux/x86_64/clone.S:95
(gdb) p s
$1 = (struct sService *) 0x0
(gdb) p *Event
$2 = {Sid = "uuid:aa3bf976-0b69-11e8-9792-d3ba1d388811\000\000", ErrCode = 0,
  PublisherUrl = "http://192.168.1.231:1835/RenderingControl/a9dc8ad5-4f97-c37f-9002-2f7b00eddfd8/event.xml", '\000' <repeats 166 times>, TimeOut = 1800}

config.xml

you need to provide an example config.xml file.

Sonos surround configuration not recognized

Hi Philippe,

I'm new to AirConnect, used airsonos until now and have to admit: Great work!

Unfortunately AirConnect only works for a part of my configuration. I have several Play:1 spreaded across my rooms in standalone and stereo configurations. Those speakers are recognized correctly. But there is also a surround configuration (Playbase + 2x Play:1) which isn't recognized. If I remove surround configuration all speakers are recognized as expected.

Do you have any idea how to find the source of this problem?

Thanks in advance for your help,
Lameth

aircast ignoring device definitions in config

This manifests 2 ways:

aircast -i castconfig.xml generates a config file but exits before scan occurs, so the config file has no devices listed. aircast -x castconfig.xml -I stays up and performs discovery but still doesn't add device definitions.

If I do airupnp -i pnpconfig.xml I am able to generate device definitions (and successfully disable/rename certain ones). If I use the <device> definitions there as a guide and manually add the the Chromecast/Google Home devices' MAC addresses to my aircast config, they seem to be ignored and all devices are discovered and enabled, regardless of config's names or enabledness.

Option for force bitrate-resolution

Hi,

My environment is like this: one ChromeAudio connected via SPDIF (optical output) to a receiver (DD & DTS compatible).

Now, I have this good project working (Thank you to the developer!). ๐Ÿ˜„

However, I like to have "bit-perfect" output over the optical output. To check this, I use DTSWAV files (one DTS bitstream encapsulated over an standard PCM 44.1/16bit file). At time, all my test will fail! Using one Airport Express with the same configuration I don't have any problem to play these files using iTunes and configuring it for not change the audio stream. However, I can't do it with this tool. My assumption is that the Chromecast it's using 48KHz/24bit (or similar) and this tool is reencoding. So, I suggest to enable the option for force the bitrate-resolution (in my case: 44.1/bit). With this will be possible to have a bit-perfect output (required for DTS CD).

If you need some testing files, you can download free samples from here:
http://www.ambisonic.net/nimbus-sample.html
(get the DTS-WAV file at http://www.ambisonic.net/decodes/elgar-excerpt-dts.wav).

Regards.

aircast very high cpu usage while streaming.

Hi Philippe, I'm really liking the new aircast bridge. I've been using it the last couple days with a chromecast audio firmware 1.25.90308 with great success. I noticed that the aircast-x86 build consistantly spins a cpu near 100% usage while streaming from an ipad 10.3.3 or itunes 12.6.2. I suspect there's a spinning loop causing this issue, but I haven't been able to track it down.

13351 squeezeb 20 0 73396 3784 1924 S 95.6 0.0 0:38.43 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 100.1 0.0 0:39.61 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 95.7 0.0 0:40.78 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 101.1 0.0 0:41.97 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 101.0 0.0 0:43.14 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 100.1 0.0 0:44.32 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 101.2 0.0 0:45.50 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 102.0 0.0 0:46.67 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 100.1 0.0 0:47.85 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 94.6 0.0 0:49.02 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 100.2 0.0 0:50.21 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 93.9 0.0 0:51.38 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 88.8 0.0 0:52.55 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 100.1 0.0 0:53.73 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 101.0 0.0 0:54.91 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 93.6 0.0 0:56.07 aircast-x86
13351 squeezeb 20 0 73396 3784 1924 S 93.9 0.0 0:57.25 aircast-x86

CPU usage doesn't even register in vmstat when idle.

13351 squeezeb 20 0 73396 3876 2004 S 0.0 0.0 9:28.63 aircast-x86
13351 squeezeb 20 0 73396 3876 2004 S 0.0 0.0 9:28.63 aircast-x86
13351 squeezeb 20 0 73396 3876 2004 S 0.0 0.0 9:28.63 aircast-x86
13351 squeezeb 20 0 73396 3876 2004 S 0.0 0.0 9:28.63 aircast-x86
13351 squeezeb 20 0 73396 3876 2004 S 0.0 0.0 9:28.63 aircast-x86

Ideas?

Thanks,
Ralphy.

Error obtaining description http://192.168.xxx.xxx:8080/upnp

Hi,

first of all, thanks again for this great tool.

I just installed version 0.2x for the first time and I keep getting this error in the logs. Since I installed it remotely and I'm not at home, this might be a minor thing. I just wanted to give you feedback (as mentioned in the ReadMe).

[11:45:07.990612] main:1210 Starting airupnp version: v0.2.0.1 (Jan 29 2018 @ 18:40:58)
[11:45:07.993615] Start:970 Binding to 192.168.178.50:49152
[11:45:17.032813] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:45:17.053236] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:45:17.068755] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:46:17.040811] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:46:17.057575] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:46:17.071634] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:47:17.046148] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:47:17.060542] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

[11:47:17.074454] UpdateThread:705 Error obtaining description http://192.168.178.50:8080/upnp -- error = -108

"Stop Receiver" parameter

Please, can you explain the behaviour of the "Stop Receiver" parameter in the config file?

I can't see it the the README page.

Thank you!

License file?

It looks like the code in this repo is licensed under the GPL v3; would you mind adding a license file to the repo to confirm?

AirUPNP: UPNP volume control erroneous when rapidly changing AirPlay host volume setting

If you change the volume in the AirPlay host app (e.g. iTunes) rapidly (like, moving the iTunes volume slider instantly from left to right and vive versa) , then the UPNP volume control can't "catch up" and starts to "stutter" and gets unsynchronised from the AirPlay host volume setting.

If you change the AirPlay host volume slowly (e.g., using the iTunes volume up/down keyboard shortcuts), the UPNP volume is adjusted correctly.

[macOS High Sierra 10.13.2, airupnp-osx-multi 0.1.3.2, Naim NAC-N 172 XS streaming pre-amp]

Can't change name permanently

Changing 'name' parameter in config only changes the name in AirPlay temporarily. Seems after 30 seconds, rescan overrides the name set in the config and the generated name with IP address replaces it. If I then do a 'save config.xml' from the command line the original names are in the newly saved config file.
example:
'Kitchen' changes to '192.168.xx.xx - Sonos PLAY:1'
Thanks

-z parameter not working as expected

First, this is awesome. Thank you for maintaining this project, it's fills such a sweet spot in my life until AirPlay 2 is ready. Kudos!

Is there an example of what the command with non-interacive "-z" option enabled should look like? I've been using: ./airupnp-osx-multi -z -l 500:500. The command runs, but I don't think it's running in the background because I still see a long list of logs as I play to my Sonos through iTunes on my MBP. Also, when I close the tab in iTerm2, the process quits. I can no longer play audio through the Sonos on my MBP.

AirPlay 2 support?

Is this something possible for a future release?
Thank you so much for such a great work with this project.

Expected audio lag

Great work on this project. I just had a quick question. I'm running AirConnect as you mention in the readme with the 1 second RTP buffer and the 2 Second Http buffer. I was expecting that to create a lag of 3 seconds for obvious reasons. I'm running VLC and inserting a lag under the Track Synchronization settings so that can watch video. The synchronization lag that works is 4 seconds. I'm wondering if you have any idea why this is or if theres something different I should be doing.

Raspbian Errors

Tried running aircast-arm on Raspbian. After chmod +x, first error I got was:
./aircast-arm: error while loading shared libraries: libssl.so.1.0.0: cannot open shared object file: No such file or directory

Ran these to install libssl.so.1.0.0:

sudo wget http://ftp.nl.debian.org/debian/pool/main/o/openssl/libssl1.0.0_1.0.1t-1+deb8u6_armhf.deb
sudo dpkg -i libssl1.0.0_1.0.1t-1+deb8u6_armhf.deb

Now I get the error:
Illegal instruction

airupnp on mac os x - no "-z" option?

Hi,

I'm running AirConnect on a Raspberry Pi which works perfect. I also tried the Mac OSX binary which works as well, except the "-z" option? Isn't it available there? It just won't run in the background and stops everytime I close the terminal or push CMD-C.

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.