Skip to content

Repository files navigation

xubamp

A from-scratch, native-Wayland reimplementation of the classic Winamp 2.9x player, built for one target: Ubuntu 26.04. No Wine, no XWayland, no widget toolkit. One 4.4 MB binary in a 1.5 MB deb that depends on libc, libgcc, PipeWire, and xkbcommon.

Install

Download the latest deb from Releases, then:

sudo apt install ./xubamp_*_amd64.deb
xubamp song.mp3

amd64, Ubuntu 26.04. It starts on a built-in clean-room skin; point it at any classic .wsz on the command line (xubamp skin.wsz *.mp3) or switch at runtime from Preferences. No skins ship with it (see License).

It needs a Wayland session. There is no X11 backend: xubamp talks xdg-shell and writes its own pixels into wl_shm buffers, with no toolkit underneath to provide a second one, and XWayland runs X11 clients on Wayland rather than the other way round. GNOME 50 is Wayland only, and Plasma drops its X11 session in 6.8, so on 26.04 you are almost certainly already there. If you are on an X11 login, pick a Wayland session at the greeter, or run xubamp inside a nested compositor (sudo apt install weston, weston --backend=x11, then launch xubamp from a terminal inside it).

Showcase

Classic .wsz skins, loaded at runtime:

Skin switching

The equalizer and playlist dock to the main window and drag anywhere (they are Wayland child surfaces, so the cluster moves like the original):

Dragging the windows

Windowshade mode on every pane:

Windowshade

The classic menus:

Menus

Native GNOME Preferences:

Preferences

The visualizer options: analyzer styles, bands, peaks, falloffs, 10 to 70 fps:

Visualization options

File info with editable ID3v1 tags:

File info

What works

  • Classic .wsz skins rendered pixel for pixel: main window, equalizer, resizable playlist, windowshade modes on all three, double-size mode (Ctrl+D).
  • MP3, WAV, FLAC, and Ogg Vorbis decoded with Symphonia, played through PipeWire, with gapless seek.
  • The visualizer is a faithful port of the XMMS/Audacious classic analyzer: log bands, 40 dB range, normal/fire/line styles, thick or thin bands, peaks, five falloff speeds, 10 to 70 fps refresh.
  • The 10-band equalizer with preamp, the 17 classic presets, and EQF load/save.
  • Playlist editor with working ADD/REM/SEL/MISC/LIST clusters, .m3u/.pls save and load, right-click track menu, per-track times, mini clock and mini transport, a skinned scrollbar, and a resize grip. Drop files onto it from the file manager to append them, as many at once as you like; folders are skipped, since ADD > DIR is where the recursion and sort preferences live. The playlist survives close and reopen.
  • Jump-to-file (j) searches every tag the file carries, not just the shown title.
  • Marquee shows the tagged "N. Artist - Title (M:SS)" (ID3v2, Vorbis comments, RIFF INFO; file name when untagged), next to kbps/kHz readouts and the elapsed/remaining clock with the classic paused blink.
  • Shuffle and repeat retrace the real play order, so Previous works under shuffle.
  • File info box with the stream facts and an editable ID3v1 tag form for MP3s.
  • Classic hotkeys (z x c v b transport, r s, l, j, arrows for volume and seek, Ctrl+T/D/P, Alt+3) and mouse wheel for volume, balance, seek, and list scroll. Click into the playlist and Up/Down walk its rows instead of the volume.
  • Menus, Preferences, Jump, and file info are native GNOME dialogs (Adwaita, light and dark); everything else is skin-rendered.
  • Every window drags from any free surface, not just the 14px title strip.

No album art, no library view, no URL streaming (its menu item is disabled), no modern chrome, on purpose.

Out of scope: X11, other compositors or distros, Windows, macOS. Tuned for Ubuntu 26.04 (GNOME 50, Mutter, Wayland, PipeWire) and nothing else; targeting one platform is what keeps it small.

Why

I kept hitting the same walls with the players I tried. Strawberry makes the classic hotkeys complicated to set up, and my muscle memory presses B for next and J to jump to a track, so I fought it constantly. Audacious had trouble with moving its window on Wayland. And I wanted something genuinely lightweight. Winamp 2.9x did a lot with almost nothing: a 275x116 bitmap UI, a software blitter, instant startup on 2003 hardware. Reproducing that today should come out smaller, not heavier, so xubamp draws the skin bitmaps straight into Wayland shared memory with no toolkit in between.

Playing the same library, xubamp sits at 47 MB across 7 threads; Strawberry at 206 MB across 67:

xubamp 47 MB and 7 threads vs Strawberry 206 MB and 67 threads

Wayland notes

Wayland does not let a client position its own windows, so two things work differently:

  • The equalizer and playlist are child surfaces of the main window: they dock, edge-snap (threshold in Preferences), and travel with it like the classic cluster. Dialogs are ordinary top-level windows placed by the compositor.
  • Always on top is a manual GNOME action (Super plus right-click), because Mutter gives applications no stacking control; the clutterbar's A button shows a notice saying so.

Build

Needs Rust 1.96:

cargo build --release
cargo test

The UI and skin crates build and test on the host with no system libraries. Playback and in-window keyboard input sit behind the audio and keyboard features (PipeWire, libxkbcommon); a dev container keeps those off the host and runs the app against the host's Wayland and PipeWire sockets:

scripts/dev-docker.sh run skins/your-skin.wsz ~/Music/song.mp3

Layout

A small Cargo workspace, one job per crate: skin (wsz/BMP decode, sprite geometry), render (pure framebuffer composition and hit testing, heavily unit-tested), audio (Symphonia decode, PipeWire output, lock-free ring into the realtime thread), wl (smithay-client-toolkit windows, input, shm blit), dsp (equalizer filters and presets), config (settings file), library (audio path scanning), portal (XDG portals), xubamp (the binary). Design notes live in docs/ARCHITECTURE.md.

License

GPL-2.0-or-later; see LICENSE. This is an independent, clean-room implementation written from public format documentation. It contains no Winamp code and ships no Winamp skins, names, or artwork.

About

Classic Winamp 2.9x player rebuilt from scratch in Rust for Ubuntu 26.04: native Wayland client (no toolkit, no Wine, no XWayland), PipeWire audio, classic .wsz skins, XMMS-style visualizer, 10-band EQ, playlists. 1.5 MB deb.

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages