A simple desktop audio player built on maolan-engine and [maolan-widgets](iced 0.14 widgets). It plays through the same engine and audio backends as the Maolan DAW, with a playlist and basic transport controls.
- Playlist with add-files / add-folder (recursive) import, removal, and click-to-select; persisted to
~/.config/maolan-player/playlist.json. - Transport: play, pause, stop, previous song, next song. "Previous"/"next" switch songs rather than seeking. Playback auto-advances at the end of a song.
- Audio settings screen (gear button): audio backend, output device, and buffer size — the same
audio_setupwidget as the Maolan editor's start screen. Settings persist to~/.config/maolan-player/settings.json. - Decode via maolan-engine: WAV/PCM, FLAC, MP3, Ogg FLAC (OxideAV) with a Symphonia fallback (Ogg Vorbis, AAC, ALAC, MP4/M4A).
Requires a Rust toolchain (edition 2024). Debug builds work but the engine is heavy — release is recommended for actual listening:
cargo build --release
cargo run --releaseThe audio device is chosen with this precedence:
- First command-line argument, e.g.
maolan-player /dev/dsp5 - The
MAOLAN_PLAYER_DEVICEenvironment variable - Saved settings from the settings screen
- Per-OS default:
- FreeBSD: OSS device for the
hw.snd.default_unitsysctl (e.g./dev/dsp5); falls back to/dev/dsp - Linux: ALSA
default - Windows: WASAPI
default - macOS: CoreAudio default output device
- JACK is available on Unix via any of the overrides above (
jack)
- FreeBSD: OSS device for the
| Button | Action |
|---|---|
| File-plus | Add audio files (multi-select dialog) |
| Folder | Add a folder recursively |
| Skip-back | Previous song in the playlist |
| Play / Pause / Square | Play / pause / stop |
| Skip-forward | Next song in the playlist |
| Trash | Remove selected song from the playlist |
| Gear | Audio settings (backend, device, buffer size) |
- On FreeBSD OSS, large buffer sizes (periods above ~1024 frames) can play back slower than realtime with some device setups (observed with virtual_oss): the playhead crawls and audio drops out. The default picks a small period; if you raise the buffer in settings and hit this, lower it again. The engine-side root cause is not yet fixed.
- Double-click-to-play is not implemented; select a row and press play.
- Applying new audio settings restarts the engine client in place (the engine only tears down its hardware worker cleanly for JACK).
src/main.rs— iced application entry, per-OS default device, tokio executorsrc/app.rs— engine client wiring, transport state, UI update/viewsrc/playlist.rs— playlist model, recursive folder import, persistencesrc/settings.rs— backend/device model, discovery, settings persistencesrc/buffer.rs— buffer-size ladders per backendexamples/playback_repro.rs— headless playback check (engine open + play + transport sampling)