Skip to main content

rockbox-ffi (Python)

PyPI Python FFI uv License

Python bindings for the Rockbox DSP, metadata, codecs, and playback engine, via cffi (ABI mode) over the prebuilt librockbox_ffi shared library.

📖 Sound settings reference — the equalizer, tone, crossfeed, compressor and other DSP controls mirror Rockbox's own. See the official Rockbox manual — Sound Settings.

Setup

Build the shared library once (from the repo root):

cargo build --release -p rockbox-ffi

Then install the Python package with uv:

cd bindings/python
uv venv
uv pip install -e .
uv run python examples/smoke.py

The library is located automatically by walking up to target/release/librockbox_ffi.{dylib,so}. Override with the ROCKBOX_FFI_LIB environment variable.

Interactive console

uv pip install -e '.[dev]'      # installs IPython
uv run python console.py

Drops into IPython with rb, metadata, Dsp, Player, the enums, and a FIXTURE sample track preloaded (falls back to the plain REPL without IPython):

metadata.read(str(FIXTURE))["title"]        # 'Speak'
p = Player(volume=0.6)
p.set_queue([str(FIXTURE)]); p.play()
p.status()["state"]                          # 'playing'

Usage

import rockbox_ffi as rb
from rockbox_ffi import Dsp, Player, metadata
from rockbox_ffi.enums import DspReplayGainMode, ReplayGainMode, CrossfadeMode

# --- metadata ---------------------------------------------------------
meta = metadata.read("song.flac")
print(meta["artist"], "—", meta["title"], meta["duration_ms"], "ms")
print(metadata.probe("track.opus"))          # -> "Opus"

# --- DSP (interleaved stereo int16) -----------------------------------
with Dsp(44100) as dsp:
    dsp.eq_enable(True)
    dsp.set_eq_band(0, cutoff_hz=60, q=0.7, gain_db=3.0)
    dsp.set_replaygain(DspReplayGainMode.TRACK, noclip=True, preamp_db=0.0)
    dsp.set_replaygain_gains(track_gain_db=-6.02)   # halves amplitude
    processed = dsp.process(samples)                # array('h')

# --- codecs (decode a file to PCM, one chunk at a time) ---------------
from rockbox_ffi import Decoder

with Decoder("song.flac") as dec:
    print(dec.metadata()["title"])                  # tags from the open file
    for samples, sample_rate in dec.chunks():       # array('h'), Hz
        ...                                          # interleaved-stereo int16 PCM
    print(dec.finished())                           # (True, 0)  (0 = clean end)

# --- playback (needs an output device) --------------------------------
with Player(volume=0.8) as player:
    player.set_replaygain(ReplayGainMode.TRACK, preamp_db=0.0, prevent_clipping=True)
    player.set_crossfade(CrossfadeMode.ALWAYS)
    # Queue entries may be local files, http(s):// URLs to remote media,
    # or live-radio / streaming URLs — mix and match freely.
    player.set_queue(["a.flac", "https://example.com/b.mp3", "http://radio.example/stream"])
    player.play()
    print(player.status())     # {'state': 'playing', 'index': 0, ...}

API

Module Contents
rockbox_ffi.metadata read(path) -> dict, probe(filename) -> str | None
rockbox_ffi.Dsp EQ / tone / surround / compressor / ReplayGain, process(samples)
rockbox_ffi.Decoder codec engine: metadata(), chunks() / next_chunk(), seek_ms(), finished()
rockbox_ffi.Player queue + transport + crossfade + ReplayGain, status() -> dict
rockbox_ffi.enums DspReplayGainMode, ReplayGainMode, CrossfadeMode, MixMode, …

Two ReplayGain encodings

The DSP and player use different mode integers (a quirk of the C ABI):

  • Dsp.set_replaygainDspReplayGainMode (TRACK=0, ALBUM=1, SHUFFLE=2, OFF=3)
  • Player.set_replaygainReplayGainMode (OFF=0, TRACK=1, ALBUM=2)

Use the named enums and you won't have to remember which is which.

Memory

All heap allocations crossing the FFI boundary (JSON strings, sample buffers) are freed inside the wrappers — you never call a *_free yourself.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rockbox_ffi-0.5.0.tar.gz (15.0 kB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

rockbox_ffi-0.5.0-py3-none-manylinux_2_38_x86_64.whl (2.4 MB view details)

Uploaded Python 3manylinux: glibc 2.38+ x86-64

rockbox_ffi-0.5.0-py3-none-manylinux_2_38_aarch64.whl (2.5 MB view details)

Uploaded Python 3manylinux: glibc 2.38+ ARM64

rockbox_ffi-0.5.0-py3-none-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

rockbox_ffi-0.5.0-py3-none-macosx_10_12_x86_64.whl (2.2 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file rockbox_ffi-0.5.0.tar.gz.

File metadata

  • Download URL: rockbox_ffi-0.5.0.tar.gz
  • Upload date:
  • Size: 15.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.13

File hashes

Hashes for rockbox_ffi-0.5.0.tar.gz
Algorithm Hash digest
SHA256 3af1897f2827a6dfe5a8205d383cf300f44fdcc06ca4464ba837235ae082b512
MD5 4f73e95a620b5915d2e333435b1315c3
BLAKE2b-256 90a04d87cc45b53150ca0b95fd55a885c43e835fafbb0386113e7721f8f586f4

See more details on using hashes here.

File details

Details for the file rockbox_ffi-0.5.0-py3-none-manylinux_2_38_x86_64.whl.

File metadata

File hashes

Hashes for rockbox_ffi-0.5.0-py3-none-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 971ebc074810c535e59494a987d91c67a0739c7adca1ba69de5889c19a3b4823
MD5 e4538d9f66b4e371a2500f8a962fc12c
BLAKE2b-256 b4a231b752dab7b6a3d808098ff649c116c480503124615ef668439b89baf791

See more details on using hashes here.

File details

Details for the file rockbox_ffi-0.5.0-py3-none-manylinux_2_38_aarch64.whl.

File metadata

File hashes

Hashes for rockbox_ffi-0.5.0-py3-none-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 97ea5cf8e2ad72aa1fb458ee110c68892e80fc4568f7c0e84b153afa7b7d0f58
MD5 169d2bbe7dc9ffc14247eee2a6dfd97e
BLAKE2b-256 84c5ba9498910488b982030ab7df3a098fb9c0327bfab2ff161916195d00ef71

See more details on using hashes here.

File details

Details for the file rockbox_ffi-0.5.0-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for rockbox_ffi-0.5.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e387dcc8001d32741a4110e125afdb1cfcb14b766636dd60d9b1d10cf8cdf53b
MD5 f3a7ff4423049e3d03e4094131e5722a
BLAKE2b-256 49ea771069236430cbd2771d8ce66dcacd107c03db61c67a6a4dad71bc41e99b

See more details on using hashes here.

File details

Details for the file rockbox_ffi-0.5.0-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for rockbox_ffi-0.5.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 6346d6c1bac83e8ebbc97ff3f6b947a5303b92c4b4946e46f8c6435ac2751e5f
MD5 0164a427968afb3a5f2cb76795872168
BLAKE2b-256 27a6ed39ee7e8fca5b3da73868e04004b76c632434a7c79478b40c46963ac226

See more details on using hashes here.

Release history Release notifications | RSS feed

0.6.0

5 files

0.5.1

5 files

This release

0.5.0 This release

5 files

0.4.0

5 files

0.3.0

5 files

0.2.0

5 files

0.1.2

5 files

0.1.0

6 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page