{"id":19611357,"url":"https://github.com/philippe44/libraop","last_synced_at":"2025-04-27T22:33:27.186Z","repository":{"id":45096940,"uuid":"64992143","full_name":"philippe44/libraop","owner":"philippe44","description":"RAOP player and library (AirPlay)","archived":false,"fork":false,"pushed_at":"2024-04-02T22:53:45.000Z","size":300048,"stargazers_count":101,"open_issues_count":9,"forks_count":33,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-04-05T04:12:18.869Z","etag":null,"topics":["airplay"],"latest_commit_sha":null,"homepage":null,"language":"Perl","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/philippe44.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2016-08-05T05:50:48.000Z","updated_at":"2025-03-31T13:05:02.000Z","dependencies_parsed_at":"2023-01-29T19:31:04.091Z","dependency_job_id":"69bac5ab-1dae-49e8-9235-ecb7938850b5","html_url":"https://github.com/philippe44/libraop","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippe44%2Flibraop","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippe44%2Flibraop/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippe44%2Flibraop/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philippe44%2Flibraop/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philippe44","download_url":"https://codeload.github.com/philippe44/libraop/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":251219600,"owners_count":21554444,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["airplay"],"created_at":"2024-11-11T10:38:28.996Z","updated_at":"2025-04-27T22:33:22.175Z","avatar_url":"https://github.com/philippe44.png","language":"Perl","funding_links":[],"categories":[],"sub_categories":[],"readme":"## RAOP player and library (AirPlay)\n\nThis is a RAOP (airplay) player and library for the v2 protocol (with synchro). It works for Windows, OSX, Linux x86 and ARM.\nThere is a small player can can play raw pcm form any file or stdin (useful for use pipes with a decoder like lame, flac or ffmpeg)\n\nThe player is just and example how to use the library, but it has a few interesting options:\n\n```text\nusage: ./build/raop_play \u003coptions\u003e \u003cserver_ip\u003e \u003cfilename ('-' for stdin)\u003e\n\t[-ntp \u003cfile\u003e] write current NTP in \u003cfile\u003e and exit\n\t[-p \u003cport number\u003e]\n\t[-v \u003cvolume\u003e (0-100)]\n\t[-l \u003clatency\u003e (frames]\n\t[-w \u003cwait\u003e]  (start after \u003cwait\u003e milliseconds)\n\t[-n \u003cstart\u003e] (start at NTP \u003cstart\u003e + \u003cwait\u003e)\n\t[-nf \u003cstart\u003e] (start at NTP in \u003cfile\u003e + \u003cwait\u003e)\n\t[-e] (encrypt)\n\t[-s \u003csecret\u003e] (valid secret for AppleTV)\n\t[-r] (do interactive pairing with AppleTV)\n\t[-d \u003cdebug level\u003e] (0 = silent)\n\t[-i] (interactive commands: 'p'=pause, 'r'=(re)start, 's'=stop, 'q'=exit, ' '=block)\n```\n\nIt's possible to send synchronous audio to multiple players by using the NTP options (optionally combined with the wait option).\nEither get the NTP of the master machine from any application and then fork multiple instances of raop_play with that NTP and\nthe same audio file, or use the -ntp option to get NTP to be written to a file and re-use that file when calling the instances of\nraop_play\n\n## Building using CMake\n\n```sh\n# install build libreries \napt-get install build-essential cmake  libssl-dev\n\n# Fetch all dependencies\n# git submodule update --init\ngit submodule update --force --recursive --init --remote\n\n# Create build directory\nmkdir build\ncd build\n\n# Build project\ncmake ..\nmake\n```\nNote that this is a cross-compiler CMake file so it's better to run it and define HOST and PLATFORM options (see the build.sh) but it's not mandatory.\nTo better understand how my cross-compilation works, see [here](https://github.com/philippe44/cross-compiling)\n## Building using Make\n\nMakefiles are provided for OSX, Linux (x86 and ARM). Under Windows, there is a VS2022 project. You'll need some libraires:\n\n- ALAC codec: https://github.com/macosforge/alac and\n- Curve25519 crypto: https://github.com/msotoodeh/curve25519\n\nYou need pthread for Windows to recompile the player / use the library here: https://www.sourceware.org/pthreads-win32\n\n## Misc\nIt's largely inspired from https://github.com/chevil/raop2_play but limit the playback to pcm as it focuses on creating a library and optimizing AirPlay synchronization\n\nSince iOS 10.2, pairing is required with AppleTV. Here is a description of the protocol https://htmlpreview.github.io/?https://github.com/philippe44/RAOP-Player/blob/master/doc/auth_protocol.html\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilippe44%2Flibraop","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilippe44%2Flibraop","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilippe44%2Flibraop/lists"}