Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/dulltools/ex_alsa
ALSA NIFs in C for Elixir.
https://github.com/dulltools/ex_alsa
alsa elixir elixir-library nif
Last synced: 28 days ago
JSON representation
ALSA NIFs in C for Elixir.
- Host: GitHub
- URL: https://github.com/dulltools/ex_alsa
- Owner: dulltools
- License: mit
- Created: 2021-12-13T01:19:23.000Z (about 3 years ago)
- Default Branch: main
- Last Pushed: 2024-01-22T19:28:51.000Z (11 months ago)
- Last Synced: 2024-11-04T13:38:11.786Z (about 1 month ago)
- Topics: alsa, elixir, elixir-library, nif
- Language: Elixir
- Homepage:
- Size: 32.2 KB
- Stars: 2
- Watchers: 0
- Forks: 0
- Open Issues: 3
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- fucking-awesome-elixir - ex_alsa - Elixir ALSA bindings (Audio and Sounds)
- awesome-elixir - ex_alsa - Elixir ALSA bindings. (Audio and Sounds)
README
# ExAlsa
ExAlsa is an ALSA NIF for Elixir. The purpose of this library is provide a low-latency and configurable interface to ALSA. Writing and capturing sound from devices with as low latency as possible in as deterministic way as possible is the primary goal of this library.
An additional goal is to provide enough documentation for implementors to configure their own ALSA handler properly for _their_ use case and to have some basic understanding of [PCM sound generation](https://en.wikipedia.org/wiki/Pulse-code_modulation).
## Requirements
* Linux >= 2.6## Installation
```elixir
def deps do
[
{:ex_alsa, "~> 0.1.0"}
]
end
```## Usage
```
{:ok, handler} = ExAlsa.open_handler("default")
{:ok, _options} = ExAlsa.set_params(%{
channels: 1,
rate: 44100,
buffeR_size:
})# Stream silence for the length of one buffer size
ExAlsa.write(List.duplicate(0, buffer_size))# See tests for a more interesting demo.
```# TODO
- [ ] Write ExAlsa module documentation
- [ ] Explore necessity of running on BEAM's dirty scheduler and implication of doing so
- [ ] Write ALSA configuration documentation (may live in a different repository)
- [ ] Brief overview of sampling, waves, PMC. Readers should walk away confident that they can produce sound by writing numbers in a vector.
- [ ] How to calculate the maximum sleep between writes
- [ ] A better description of each relevant ALSA config -- difference between SW params and HW params
- [ ] What are periods/frames/buffers
- [ ] Maybe some overview of Linux sound stack
- [ ] Finish writing configuration API
- [ ] Support different access methods
- [ ] Support different formats
- [ ] Capture sound## Influences/Alternative packages
Check out Mikael Karlsson's excellent https://github.com/karlsson/xalsa for an Erlang/Elixir solution using OTP.## Further ALSA Reading
A lot of the documentation here is referenced from the URLs below:* https://www.linuxjournal.com/article/6735
* https://alsa.opensrc.org/
* https://www.alsa-project.org/wiki/Tutorials_and_Presentations
* https://www.alsa-project.org/wiki/FramesPeriods
* https://stackoverflow.com/questions/24040672/the-meaning-of-period-in-alsa
* https://albertlockett.wordpress.com/2013/11/06/creating-digital-audio-with-alsa/
* https://www.spinics.net/lists/alsa-devel/msg58343.html