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.6.0.tar.gz (15.5 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.6.0-py3-none-manylinux_2_38_x86_64.whl (2.5 MB view details)

Uploaded Python 3manylinux: glibc 2.38+ x86-64

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

Uploaded Python 3manylinux: glibc 2.38+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

rockbox_ffi-0.6.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.6.0.tar.gz.

File metadata

  • Download URL: rockbox_ffi-0.6.0.tar.gz
  • Upload date:
  • Size: 15.5 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.6.0.tar.gz
Algorithm Hash digest
SHA256 dee6acb88ea2dfba94325c649aef64f70710bd140918b7b9374e8e0d00371c5e
MD5 db6859535391feaf2d7345e154dc7edc
BLAKE2b-256 b36589477d013100c85e997448d142b34411e8c8c349f3d2f643aa17c606555f

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rockbox_ffi-0.6.0-py3-none-manylinux_2_38_x86_64.whl
Algorithm Hash digest
SHA256 4707391acbc81d7611957b7ce00cdfbb7f4345571413d5e0974d8852aaabd3ae
MD5 daf39c77a9cca050b37910feaefaf911
BLAKE2b-256 7c196b752a7010491b18cae92a74ee5218b2679fc327f5e8a414ad67cbe9e838

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rockbox_ffi-0.6.0-py3-none-manylinux_2_38_aarch64.whl
Algorithm Hash digest
SHA256 0ab71a6c8b00e94bfbba2e27925a3cbb083cfdce402307d873899b4925cd2189
MD5 c630bc927dec44e7e88af1ffaa6ef54a
BLAKE2b-256 b796b6408ed975c5cf2610b17f4907104f2ccce653161754a17e8e4aa7fc4cb5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rockbox_ffi-0.6.0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 c7012d949cacefec4e492f7f8a6c8813adb81d299273bcc8e685b7928fddf211
MD5 15ca37dea69f6fc419376892795db4ee
BLAKE2b-256 303f955050c925d09b8fe20d653ba6ba5660994f09ed01765fa92117b8f64551

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for rockbox_ffi-0.6.0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 759307254a547d63d653b5af593969cb9da71484e4ef692de940df4d40d3aeda
MD5 5f7c0e3b33261167336db8f88a0bc80a
BLAKE2b-256 83e1e77a9d3a3921841265d7906347ee13274bfe282f3ca4e9fd974435137d8e

See more details on using hashes here.

Release history Release notifications | RSS feed

This release

0.6.0 This release

5 files

0.5.1

5 files

0.5.0

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