{"id":16153890,"url":"https://github.com/hinto-janai/sansan","last_synced_at":"2025-07-14T23:08:26.485Z","repository":{"id":192086422,"uuid":"619820325","full_name":"hinto-janai/sansan","owner":"hinto-janai","description":"Real-time music engine (WIP)","archived":false,"fork":false,"pushed_at":"2024-01-31T17:31:55.000Z","size":8436,"stargazers_count":13,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-27T18:18:50.234Z","etag":null,"topics":["audio","audio-player","audio-processing","engine","linux","macos","media","metadata","music","real-time","rust","windows"],"latest_commit_sha":null,"homepage":"https://sansan.cat","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hinto-janai.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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":"2023-03-27T13:48:00.000Z","updated_at":"2025-03-14T12:37:28.000Z","dependencies_parsed_at":"2023-11-25T04:21:44.081Z","dependency_job_id":"448a7e77-96e4-4030-915d-f4a9c1713039","html_url":"https://github.com/hinto-janai/sansan","commit_stats":null,"previous_names":["hinto-janai/sansan"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/hinto-janai/sansan","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hinto-janai%2Fsansan","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hinto-janai%2Fsansan/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hinto-janai%2Fsansan/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hinto-janai%2Fsansan/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hinto-janai","download_url":"https://codeload.github.com/hinto-janai/sansan/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hinto-janai%2Fsansan/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265365696,"owners_count":23753379,"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":["audio","audio-player","audio-processing","engine","linux","macos","media","metadata","music","real-time","rust","windows"],"created_at":"2024-10-10T01:14:50.561Z","updated_at":"2025-07-14T23:08:26.460Z","avatar_url":"https://github.com/hinto-janai.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n![CI](https://github.com/hinto-janai/sansan/actions/workflows/ci.yml/badge.svg) [![crates.io](https://img.shields.io/crates/v/sansan.svg)](https://crates.io/crates/sansan) [![docs.rs](https://docs.rs/sansan/badge.svg)](https://docs.rs/sansan)\n\n\u003cimg src=\"https://github.com/hinto-janai/sansan/assets/101352116/5c77d0aa-2f9b-4579-8d3c-b9e00e225179\" width=\"60%\"/\u003e\n\n\u003c/div\u003e\n\n## About\n`sansan` is a real-time music playback library.\n\nThis library is for:\n- Queue-based, real-time music playback\n- Live audio state reading/writing without blocking\n- Audio metadata reading (`ID3/Vorbis` tags)\n- OS media control integration\n\nThis library is not:\n- A general purpose audio playback library\n\n`sansan` is built with music players in-mind - it is meant to be the part\nof the system that handles the real-time audio decoding/playback,\nwhile exposing an audio state read/write API that is non-blocking.\n\nAlthough `sansan` _can_ be used for general purpose audio playback,\nit does not include general purpose audio APIs like mixing, filters, multiple tracks, etc.\n\n## Documentation\nThe book at [`https://sansan.cat`](https://sansan.cat) is the main user documentation. It holds all the information needed to get started with `sansan` - what things there are, what they do, how to use them.\n\nThe library documentation at [`https://docs.rs/sansan`](https://docs.rs/sansan) is the API reference, documenting inputs and outputs and other note-worthy things about the API, although, it does not contain detailed commentary on usage, how things work together, etc.\n\n## Example\nFor more example usage of `sansan`, see [`examples/`](examples).\n\nThis example shows some basic usage of `sansan`:\n- Creating the `Engine`\n- Adding music to the queue\n- Sending signals to the `Engine` (play, next)\n- Reading/writing live audio state without blocking\n\n```rust\n// TODO\n```\n\n## Design\n`sansan`'s abstract design is documented in [`DESIGN.md`](DESIGN.md).\n\nThis purpose of `DESIGN.md` is to act as a reference to allow for easier changes in the future.\n\nAlthough, it mostly covers the system-wide view and does not include implementation details. For example, the real-time audio sample buffer - how big should it be?\n\nThese types of things are loosely defined in the code instead (with comments and reasoning) instead and within [`src/README.md`](src/README.md) - this document gives a more practical view on how `sansan` is organized, what files do what, where things are, why things do `x` instead of `y`, etc.\n\n## Audio Dependencies\nThis table summarizes the **audio-specific** libraries used by `sansan` and their purpose.\n\n| Dependency              | Owner                                                       | Purpose |\n|-------------------------|-------------------------------------------------------------|---------|\n| `audio_thread_priority` | [Mozilla](https://github.com/mozilla/audio_thread_priority) | Real-time audio thread promotion\n| `cubeb`                 | [Mozilla](https://github.com/mozilla/cubeb-rs)              | Audio device output\n| `cpal`                  | [RustAudio](https://github.com/rustaudio/cpal)              | Audio device output\n| `souvlaki`              | [Sinono3](https://github.com/Sinono3/souvlaki)              | OS media control interface\n| `symphonia`             | [Pdeljanov](https://github.com/pdeljanov/Symphonia)         | Audio demuxing/decoding/metadata\n| `rubato`                | [HEnquist](https://github.com/HEnquist/rubato)              | Audio resampling\n\n## Supported Targets\nOnly 64-bit targets (`x86_64`, `ARM64`, etc) are supported.\n\n32-bit targets may work but are not tested on.\n\n- Windows (WASAPI)\n- macOS (CoreAudio)\n- Linux (PulseAudio)\n\n## Supported Audio\n`sansan` uses [`symphonia`](https://github.com/pdeljanov/Symphonia) for audio decoding \u0026 metadata.\n\nThe supported audio codecs are:\n\n- `AAC-LC`\n- `ADPCM`\n- `ALAC`\n- `FLAC`\n- `MP1/MP2/MP3`\n- `Vorbis`\n- `Opus`\n- `WavPack`\n\nThe supported audio metadata formats are:\n\n- `ID3v1`\n- `ID3v2`\n- `ISO/MP4`\n- `RIFF`\n- `Vorbis comment` (FLAC \u0026 OGG)\n\n## MSRV\nThe `Minimum Supported Rust Version` is `1.70.0`.\n\n## License\n`sansan` is licensed under the [MIT License](https://github.com/hinto-janai/sansan/blob/main/LICENSE).\n\nAs of `v0.0.0`, `sansan`'s dependency tree includes the following licenses:\n- `Apache-2.0`\n- `BSD-2-Clause`\n- `BSD-3-Clause`\n- `ISC`\n- `MIT`\n- `MPL-2.0`\n- `Unicode-DFS-2016`\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhinto-janai%2Fsansan","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhinto-janai%2Fsansan","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhinto-janai%2Fsansan/lists"}