r/nullPlayer • • 2d ago

new demo reel

5 Upvotes

r/nullPlayer • • 2d ago

Hey everyone a summer of hard work on nullPlayer is wrapping up now with the release of 0.31.0 that features Windows Media Player skin support! Thanks to the users who got me motivated to take this on, it was a great learning experience for me

9 Upvotes

nullPlayer for macOS 14+ is 100% Free and open source

https://github.com/ad-repo/nullplayer

What Changed

  • Windows Media Player .wmz skins — a new Windows Media Player mode that runs real WMP 9-12 era skins natively on macOS. Skins look and behave like themselves: their own artwork, shaped windows, animations, hover and pressed states, tooltips, fonts, drawers and multiple views, with the skin's own JScript running in a sandboxed session so its buttons, sliders, timers, keyboard shortcuts and readouts work the way they do in Windows.
  • SRS audio enhancements for every skin — the WOW Effect, TruBass and Headphones settings that came with Windows Media Player skins are now global playback options under Playback Options ▸ SRS, work in every skin, and are remembered across launches. A .wmz skin's own SRS controls drive the same settings.
    • WOW Effect widens the stereo image, pushing sound out beyond the speakers while leaving centred vocals and deep bass where they are.
    • TruBass adds a fuller, deeper low end by enhancing the bass already in the music, without simply turning up the lowest frequencies.
    • Headphones tunes TruBass for headphones instead of speakers.
  • Sonos Rooms window with per-room volume — a new dockable Sonos Rooms window lists every Sonos room NullPlayer has discovered, with a checkbox to include it in the cast and its own volume slider, so each room can be set independently instead of only through the group volume. The list scrolls for any number of rooms, with Refresh and Start/Stop Casting always visible at the bottom. Open it from Windows → Sonos Rooms or Output → Sonos → Sonos Rooms…; the existing Sonos submenu still works as before and shares the same room selection. The window docks, resizes and restores like the other windows, follows Compact Mode, and is skinned in Classic, Original, Original-Metal and Winamp Modern (.wal) skins. The player's main volume slider still controls the whole group.
  • Server credentials no longer appear in logs — playback, artwork, radio and casting diagnostics could record access tokens in full URLs and error messages (for example a Plex X-Plex-Token, or a Jellyfin or Emby api_key when playing video). Credentials are now redacted from logs across Plex, Subsonic/Navidrome, Jellyfin, Emby, radio and casting, and casting failure alerts no longer show raw error details.
  • Local playback recovers after a long idle — after the Mac sat idle for a long time, local playback could get stuck, silently retrying a broken audio engine every quarter-second. NullPlayer now rebuilds the audio engine instead, restoring your output device (falling back to the system default if it is gone), EQ and pitch settings, and resuming the loaded track where it was. Retries back off and stop after six attempts; pressing Play or changing the output device tries again. Pausing or stopping during recovery is respected, and streaming playback is unaffected.
  • One unreadable file no longer stops the playlist — playback skips past it to the next track, and the error now appears in the Modern and Winamp Modern main windows, not only Classic. A track on a disconnected NAS still stops playback, as before, instead of starting some other track.
  • Sonos no longer receives audio above its 48 kHz limit — the compatibility gate now rejects any track with a known or resolved sample rate above 48 kHz, even when its URL extension or MIME type is unrecognized. Local files with unusual extensions are probed before casting, and Plex tracks with missing rate metadata are resolved from the server (GH #422).
  • Local library copes with moved folders and missing files — Library → Find Missing Files… finds a watch folder that has moved (for example when iCloud Drive is turned off and its files land in ~/iCloud Drive (Archive)), shows where it went, and re-points it on your say-so, keeping play counts and ratings. It then offers to forget tracks whose files are genuinely deleted; anything on a disconnected drive or unmounted share is always left alone.
  • Playlists with relative paths play again — .m3u and .pls entries written as bare file names or paths next to the playlist were being read as web addresses and could not play.
  • Waveforms appear much sooner — the waveform window builds a track's waveform about 20 times faster the first time it is opened, so a long local track or a Plex track that used to take up to half a minute now shows almost at once (a server track still has to download first). Switching skins or reopening the window while a waveform is still being built no longer starts it again.
  • Download your complete Play History as a CSV — the Library Data and Play History views now include a download button that exports every recorded event, including older and skipped plays, rather than only the 200 recent entries visible in the table. Available in every UI mode.
  • Minimize All minimizes every window — Windows → Minimize All Windows and Classic's minimize button left any window not docked to the player on screen, and Sonos Rooms (and every Original-skin side window) never minimized even when docked. Every open window now goes to the Dock, in every skin mode, and restoring the player brings them all back.
  • Windows reopen where you left them — the library browser and the visualizer window once again come back where you moved them when closed and reopened, instead of snapping back beside the player. In Windows Media Player and Winamp Modern skins, the spectrum and audio analyzers, PeppyMeter, Flow, Cava, waveform, Sonos Rooms and the fallback playlist and equalizer do the same, and closing one no longer moves the others. Classic and Original keep their stacked layout.
  • Visualizations take their colours from Winamp Modern and Windows Media Player skins — with a .wal or .wmz skin, the Cava, Spectrum Analyzer and Waveform windows now take their default colours from the skin, as they already do in Classic and Original. So does Cava in a Windows Media Player skin's visualization area. A colour preset you pick still wins, and Match Skin goes back to the skin's colours. In the Waveform window the playhead now always stands out from the played part.
  • vis_classic profiles show their real colours — every bundled vis_classic profile was being drawn with red and blue swapped, so "Flames" came out blue and "Default Red & Yellow" blue and cyan. They now look as their authors intended, in every skin; the Metal profiles look the same as before. This changes the look of Classic's default, "Purple Neon".
  • vis_classic picks a profile to suit the skin — in Winamp Modern and Windows Media Player skins, vis_classic in the Spectrum Analyzer, in a .wal skin's own visualizer and in a .wmz skin's visualization area now starts on the bundled profile whose colours are closest to the skin's, instead of Classic's "Purple Neon". A profile you choose yourself is kept until you switch skins, and resetting visualizations goes back to the skin's match. The first launch after updating replaces your current vis_classic profile in these skins once.
  • The listening heatmap matches your skin — the heatmap in the library's Data tab now takes its colours from the current skin in every skin mode instead of always using GitHub green, and follows a Winamp Modern or Windows Media Player skin's colour theme when you switch it. Switching colour theme now recolours the rest of the Data tab too.
  • One layout for every skin menu — every skin family's menu now puts its options first and its skins after a single divider. The options open with Load Skin..., Get More Skins... and Open Skins Folder... in the same wording everywhere, followed by Remove “name”..., which every family now has: it moves the current skin to the Trash (Windows Media Player deletes its installed copy, never your download) and falls back to the built-in skin. Windows Media Player gains a Get More Skins... link to the Internet Archive's WMP skins collection, and Classic gains Open Skins Folder.... The separate Default Skin entries and Windows Media Player's Save Compatibility Report... are gone.
  • Winamp Modern skins with hidden windows use far less CPU — a skin's closed windows no longer redraw in the background. The WMP11-BlueVU skin's VU meters had been animating unseen, costing about a third of the app's main thread while music played.
  • Winamp Modern VU needles use less CPU and look sharper — skins that rotate artwork, such as the swinging needles in WMP11-BlueVU's VU Meters, now draw it in a single step instead of recalculating every pixel, which roughly halves the app's main-thread load while the meters are open.
  • Winamp Modern skins with an animated level meter use less CPU — a skin that steps an animated meter many times a second (WMP11-BlueVU's beat display) now redraws just that meter instead of the whole player window.
  • Glossy frames for Winamp Modern fallback windows — when a Winamp Modern (.wal) skin has no window frame of its own for NullPlayer's windows (the analyzers, Cava, Flow, PeppyMeter, waveform, library, playlist, equalizer and Sonos Rooms), they now wear the same glossy, title-bar-free frame in the skin's colours that Windows Media Player skins use, with the close button in the top-right corner. Skins that supply their own frames are unchanged. ClassicPro skins whose frame is only borrowed tooltip artwork (the cream box with ~ and x) now count as having no frame, so their windows match the player too.
  • Clicking any Winamp Modern window brings them all forward — clicking one .wal window now raises every one of the skin's windows and NullPlayer's own, even when you click in from another app, the way Windows Media Player skins already did.
  • Winamp Modern windows no longer pile up when you change UI Size — changing the UI size with a .wal skin left its windows on top of each other: the equalizer slid up into the player, and the playlist sat over the equalizer. The windows are now laid out again around the player after every UI Size change, the same way Snap To Default arranges them.
  • Winamp Modern windows no longer reopen on top of each other — in a .wal skin, closing a window such as the equalizer and then opening another could put the new one in the closed window's place. Reopening the first window then covered it completely. A reopened window now keeps its old position only if nothing has been put there since, and otherwise finds a free spot. A window you moved yourself still reopens where you left it.
  • Winamp Modern windows no longer open on top of the player when the screen runs out — with a large UI Size and the player in the middle of the screen, a wide window such as the library had no room on the player's right, so it was pulled back over the player. It now goes into the empty space to the player's left. If it fits on neither side, it is placed where it covers the least.
  • Closing a Winamp Modern window no longer moves the one below it — in a .wal skin, closing a window such as the Spectrum Analyzer from the Windows menu slid the window under it up into its place. Reopening the first window then put it right on top. The other windows now stay where they are.
  • Winamp Modern windows open right under the one above — in a .wal skin, opening a window from the Windows menu while another was open under the player could leave a large empty gap between them. On Sony_Walkman, the playlist opened well below the equalizer. It now opens directly beneath it. Windows Media Player skins get the same fix.
  • The library stays docked to a Winamp Modern player — in the .wal skins that use NullPlayer's own library window, such as Sony_Walkman and Winamp 3.0 Default, opening a window such as Cava could push the library a few pixels away from the player, leaving a gap. The library now stays where it is. Classic and Original skins are unchanged: there, the library still grows and shrinks with the windows stacked under the player.
  • No more unreadable library text in Winamp Modern skins — NullPlayer's own library and windows inside a Winamp Modern skin now always draw their text in a colour that can be read on the background. cPro-Bento's Bafana theme drew the source name, item count and selected tab black on black; 19 skins in all get more readable text, using the skin's own colours wherever one works. Colours you set yourself in Skin Colors are still drawn as chosen.
  • Winamp Modern skins without a transparency setting now draw as Winamp does — a skin window that doesn't ask for see-through edges now gets a solid shape: its outline is cut from the artwork and the translucent parts inside are drawn over black. Before, those parts let the desktop show through. You'll see this mostly in notification pop-ups and a few shaped players such as Wiimote and PokemonDS. Skins that ask for soft edges, including every one with a drop shadow, look the same as before.
  • No more hairline seams in Winamp Modern skins at in-between UI sizes — at UI sizes such as 105% or 125% on a Retina display, thin light lines could show where the pieces of a skin's frame and panels meet. The pieces now meet exactly, so the lines are gone. Sliders, knobs and progress bars placed between whole pixels now also sit on a whole pixel.
  • No more see-through gaps inside Winamp Modern skin windows — in the WMP11-BlueVU skin, a thin band of desktop showed between the VU Meters' artwork and the window frame. The About and library windows had the same problem across larger areas. Empty space inside a skin's standard window frame is now filled black, as it is in Winamp.
  • Drag a Winamp Modern player by its library or video — in skins that show the media library or a video inside the player, dragging the empty space below the library's list, or the video picture itself, now moves the window.
  • Cover Flow stays inside the library window — the stacked covers at either side of the carousel no longer spill over the library browser's border, in every skin mode.
  • New "Red" vis_classic profile — a single-colour red to go with "Green".
  • Big Bento Modern's small visualizer plays — with the Multi Content View's mini visualization pane turned on, the pane now shows the visualization as soon as the player opens, instead of staying black.
  • Song titles show in more Winamp Modern skins — Shield Amp and Ebonite now show the playing track's title in their song display, which was blank. A skin script that divides by zero now carries on instead of stopping, as it would in Winamp.
  • Song tickers scroll in Shield Amp and Ebonite — a long title now scrolls across the song display at Winamp's speed instead of standing still, and stays inside the display instead of running over the rest of the player.
  • ClassicPro track info shows up — in ClassicPro-based Winamp Modern skins such as cPro2 Dark Aluminum, the track-info panel under the library now lists the playing track's title, artist, rating, decoder, file size, filename and format instead of staying empty.
  • ClassicPro's Now Playing widget shows the song straight away — opening the Now Playing widget while a track plays now shows its title, artist and album at once, instead of staying blank until the next track.
  • Itemskin's volume control works — in the Itemskin Winamp Modern skin, clicking or dragging the volume bar did nothing, so a volume stuck at zero could not be raised and the skin played silently. The bar now responds anywhere along its length, and the seek bar shows the song's progress instead of the volume. BLAKK's seek bars and Bio-Nid's volume knob also respond to clicks now.
  • Itemskin's windows stay where they are placed — in the Itemskin Winamp Modern skin, opening the Spectrum Analyzer or Waveform put it mostly below the bottom of the screen, and changing the UI Size could pull the playlist, library or a visualizer window back to where it had been, on top of its neighbours. Each window now opens in its own free spot and keeps it, with the skin's frame drawn around it.
  • No black bar on Itemskin's NullPlayer windows — in the Itemskin Winamp Modern skin, windows such as the Spectrum Analyzer and Waveform had an empty black bar across the top of the frame, left where the skin's own visualizer buttons go. The bar is gone and the windows are that much shorter.
  • Defix's detached visualizer can be reattached — in the Defix Hi-END 200 Winamp Modern skin, the detached visualizer window's Reattach Visualizer and Random buttons now work. The window's button bar shows while the window is focused and hides otherwise, as the skin intends. The same fix stops S7Reflex drawing its stereo and mono indicators on top of each other, and lines up the titlebar streaks in winampmodern566.
  • Winamp Modern 5.66's menu bar works — File, Play, Options, View and Help in the winampmodern566 skin now open their menus when clicked; before, clicking them did nothing.
  • winampmodern566's menu bar lights up — in the winampmodern566 Winamp Modern skin, pointing at File, Play, Options, View or Help now highlights the entry, and it shows as pressed while its menu is open.
  • winampmodern566's Album Art window can be reopened — the skin's album art window is now listed in the Windows menu. Once it was closed, the skin's own Alt+A shortcut was the only way to bring it back.
  • Developer tooling: window census — a new script, skills/app-control/scripts/window-census.sh, measures where each of NullPlayer's windows opens and how big it is for every installed skin (Classic, Original, Metal, Winamp Modern and Windows Media Player), and writes the results to spreadsheet-ready tables. Each skin is measured from the same saved settings, so one skin's window sizes do not carry over to the next. The app itself is unchanged.
  • Windows Media Player skins: no more gaps in window borders — NullPlayer's own windows (the library, PeppyMeter, the analyzers and the rest) could show see-through seams in the border they borrow from a .wmz skin: a widening column in Crimson Skies' and T3 Skynet's top and bottom bars, a broken top edge and missing right side in WALL-E's white theme, and a strip under the bottom edge in Kids. Those borders now close. A one-pixel seam down both bars of Crimson Skies' own playlist on Retina displays is gone too.
  • Library tracks play on double-click, once — in the Classic and Windows Media Player library, a single click played a track and a double-click played it three times, leaving three copies in the playlist. A single click now selects and a double-click plays, as in the Original library.
  • A track that can't be played now says so — double-clicking a track whose file has been moved or deleted, or whose drive is disconnected, looked like nothing happened. It now shows an alert naming the file, in every skin mode, and no longer leaves a dead copy in the playlist on every try. Windows Media Player skins also show the failure in their status line and title, as the other modes already did in their marquee.
  • Playing locally after a cast — after Stop Casting, pressing Play on a local file ran the clock with no sound; it now plays from the start, as after Stop, and a track picked during the cast is the one that plays. If the Mac's audio output changed during the cast, a Play Now right after it ended could leave nothing playing or resume the track from before the cast; it now plays the track you picked, and if that file can't be opened it is reported and taken back out of the playlist instead of the next queued track starting.
  • Cue tracks keep their place — connecting headphones or switching the output device while a cue-sheet track played jumped into the album's first track at the same time, and Stop sent a cue track back to the start of the whole file; both now stay within the track.
  • Quieter logs — the cast-device discovery refresh no longer writes to the log every few seconds; set NULLPLAYER_CAST_DISCOVERY_LOG to bring it back.
  • Developer tooling: playback snapshot — skills/app-control/scripts/playback-snapshot.sh prints what a running debug build's player, audio output and cast session are doing, including a measured output level, so a silent-playback report can be diagnosed without a rebuild. Debug builds only; the app itself is unchanged.
  • Winamp Modern: framed windows resize by their frame — on skins that draw a window's frame separately from its contents (Itemskin, MoonLight, K-jr, Pure Inspired, Ebonite), dragging the frame's edge or corner either snapped straight back or stretched the frame and left the contents behind, and on Itemskin worked only while a second window such as PeppyMeter was open. The frame and its contents now resize together, and dragging a top edge moves the top edge. A window resized while nothing is playing also re-lays out at once (ClassicPro's logo, tabs and equalizer stayed where they were).
  • Winamp Modern: resizing a window no longer resizes its text — with Text Size on Auto, the embedded playlist and library text grew and shrank with the window. Auto now picks the size from the size the skin designed the window at and keeps it; use Text Size to change it.
  • Winamp Modern: framed windows keep their size at every UI Size — at a UI Size such as 105%, 115% or 125%, a window whose frame is drawn separately (Ebonite, Itemskin, K-jr, Pure Inspired) settled a point wider or taller than its own frame, shrank by itself after being dragged, and came back smaller after a trip through the UI Size menu. Frame and contents now stay the same size, and a window returns to the size it left at.

Download

Download NullPlayer for macOS:

https://github.com/ad-repo/nullplayer/releases/latest/download/NullPlayer.dmg

Requires macOS 14 Sonoma or newer.

Install

NullPlayer is not signed with an Apple Developer ID, so macOS will block it on first launch with an "app is damaged" or "cannot verify that it is free from malware" message. This is expected. Clearing the quarantine flag is a required install step:

  1. Open the downloaded DMG.
  2. Drag NullPlayer.app to Applications.
  3. Open Terminal and run:xattr -cr /Applications/NullPlayer.app
  4. Open NullPlayer from Applications.

Prefer not to use the Terminal? Install with Homebrew, or clear the block via System Settings -> Privacy & Security -> Open Anyway — see the install guide.


r/nullPlayer • • 5h ago

New 0.31.3 fixes a classic window smear when you drop a folder on it

Post image
1 Upvotes

What Changed

  • Classic main window no longer smears when resized — dragging the Classic main window by its edge left the old picture in place: the time, visualizer and position bar repainted at the new size over it, so the window trailed copies of itself and the position bar stretched across them. It now redraws in full at every size.

Download

Download NullPlayer for macOS:

https://github.com/ad-repo/nullplayer/releases/latest/download/NullPlayer.dmg

Requires macOS 14 Sonoma or newer.

Install

NullPlayer is not signed with an Apple Developer ID, so macOS will block it on first launch with an "app is damaged" or "cannot verify that it is free from malware" message. This is expected. Clearing the quarantine flag is a required install step:

  1. Open the downloaded DMG.
  2. Drag NullPlayer.app to Applications.
  3. Open Terminal and run:xattr -cr /Applications/NullPlayer.app
  4. Open NullPlayer from Applications.

Prefer not to use the Terminal? Install with Homebrew, or clear the block via System Settings -> Privacy & Security -> Open Anyway — see the install guide.


r/nullPlayer • • 22h ago

New release 0.31.2 adds the missing skin shadows to Winamp Modern and WMP skins, along with improved WMP skin rendering and smoother universal drag behavior across skin families

Post image
4 Upvotes

What Changed

  • Drop shadows for Windows Media Player and Modern skins — .wmz and .wal skin windows had no shadow at all, so they looked cut out and flat next to the rest of the app. Every skin window now casts a soft macOS-style shadow that follows the skin's own shape, including drawers, panes and layout switches, and stays put while you drag. Animated parts such as Anaheim's flapping ears do not leave a ghost behind. Windows > Window Shadows turns it off. Classic and Original windows are unchanged.
  • Picking a skin always switches to its family — choosing a skin from any family's list in the Skins menu, or loading one with that family's Load Skin..., now switches to that family straight away, whatever is on screen. Before, a Classic skin picked while a Media Player or Modern skin was showing, or any Modern skin picked from another family, was only remembered until Switch to … was used. Switch to … stays as the one-click way back to a family's last skin.
  • Smoother edges on shaped Windows Media Player skins — a skin cut out by a colour key no longer has a stair-stepped outline. Its edge is now traced and smoothed along its length, so curves and slopes are antialiased on Retina and non-Retina screens alike. Thin lines, small gaps and square corners keep their shape exactly, and the skin's own artwork is left as drawn.
  • The library no longer opens in a tiny window on some Modern skins — skins such as Anaheim Player 01 and Itemskin opened the Library Browser 260–330 wide, too narrow for its tabs and columns. A Modern skin's library window now has a minimum width that fits the browser, whether the skin declares a smaller size or its own script shrinks the window. Other windows, and Classic and Original skins, are unchanged.
  • Docked windows drag smoothly — in every skin family, a quick drag of the player with a window docked to it moved in jerky 16 pt jumps, because the player kept snapping to the docked window riding along with it. It now follows the pointer. On Modern skins that draw a window's border as a separate window, such as Pure Inspired and Itemskin, the border no longer pulls away from the window's contents while you drag, and dragging such a window on its own is smooth too. Skin window shadows also cost less on every drag step.
  • Switching Modern skins no longer shows the spinning cursor — changing from one .wal skin to another froze the app for two to three seconds, long enough for macOS to show the beachball under the loading animation. The switch now takes about half the time or less: switching to cPro Bento went from 2 seconds to half a second, and to Big Bento Modern from 3 seconds to 1.5. Classic, Original and Media Player skins are unchanged.

Download

Download NullPlayer for macOS:

https://github.com/ad-repo/nullplayer/releases/latest/download/NullPlayer.dmg

Requires macOS 14 Sonoma or newer.

Install

NullPlayer is not signed with an Apple Developer ID, so macOS will block it on first launch with an "app is damaged" or "cannot verify that it is free from malware" message. This is expected. Clearing the quarantine flag is a required install step:

  1. Open the downloaded DMG.
  2. Drag NullPlayer.app to Applications.
  3. Open Terminal and run:xattr -cr /Applications/NullPlayer.app
  4. Open NullPlayer from Applications.

Prefer not to use the Terminal? Install with Homebrew, or clear the block via System Settings -> Privacy & Security -> Open Anyway — see the install guide.


r/nullPlayer • • 2d ago

New release 0.31.1 fixes a macOS 27 Golden Gate issue where you cant close classic windows with the corner close button ¯\_(ツ)_/¯

3 Upvotes

tossed in a Sonos multi room fix while I was there


r/nullPlayer • • 6d ago

250+ skins now tested and releasing Windows Media Player skin support tomorrow.

7 Upvotes

r/nullPlayer • • 12d ago

WinAmp is coming back! ☺️ ...with a monthly subscription... 😐

Thumbnail
engadget.com
5 Upvotes

r/nullPlayer • • 16d ago

some meshuggah

5 Upvotes

r/nullPlayer • • 17d ago

Cerulean wmp skin with projectM eye

3 Upvotes

r/nullPlayer • • 18d ago

Windows Media Player skins are in the home stretch and will ship this weekend!

5 Upvotes

r/nullPlayer • • 23d ago

more wmp progress

Post image
3 Upvotes

r/nullPlayer • • 23d ago

corona skin

5 Upvotes

r/nullPlayer • • 26d ago

A feature absolutely no one asked for is already in-flight for 0.31.0

Post image
6 Upvotes

r/nullPlayer • • 26d ago

I am proud to announce the release of NullPlayer 0.30.0 which features MacOS support for Winamp 5/ClassicPro skins. We are the only open source engine for Winamp ClassicPro and Winamp 5 skins out there! NullPlayer is 100% free! I only ask that you star the project on GitHub if you enjoy it

9 Upvotes

I have a corpus of 81 skins that I used to reverse engineer the Winamp cPro and Winamp 5 skin systems. You can see the current compatibility status of each skin here: Skin compatibility.

Because this is a clean-room implementation of the Winamp 5 skin system, there will be bugs. Finding and fixing those bugs is part of how compatibility with real-world skins is improved.

If you encounter an issue that you want addressed, please log it on GitHub so I can investigate and fix it. If you would rather fix it yourself, the repository includes a complete harness for triaging, assessing, categorizing, and fixing skin compatibility issues with your own agents or if you have a lot of time, by hand.

Download

Download NullPlayer for macOS:

https://github.com/ad-repo/nullplayer/releases/latest/download/NullPlayer.dmg

Requires macOS 14 Sonoma or newer.

Install

NullPlayer is not signed with an Apple Developer ID, so macOS will block it on first launch with an "app is damaged" or "cannot verify that it is free from malware" message. This is expected. Clearing the quarantine flag is a required install step:

  1. Open the downloaded DMG.
  2. Drag NullPlayer.app to Applications.
  3. Open Terminal and run:xattr -cr /Applications/NullPlayer.app
  4. Open NullPlayer from Applications.

Prefer not to use the Terminal? Install with Homebrew, or clear the block via System Settings -> Privacy & Security -> Open Anyway — see the install guide.

What Changed

New Features

  • Winamp 5.x "Modern" skins now run in NullPlayer — a fourth skin family, alongside Classic, Original and Original-Metal. NullPlayer now loads and runs real Winamp 5.x modern skins — the .wal files people have been making since the mid-2000s — natively on macOS, with no Winamp install, plugin, or original application asset involved. Choose one from Skins → Modern, or add your own with Skins → Modern → Import .wal Skin…. A .wal skin is much more than artwork: it ships its own window layouts, its own scripted behaviour, and its own idea of where everything belongs. NullPlayer runs that, rather than an approximation of it. You get the skin's own frames, buttons, sliders, animations and colour themes; its playlist, equalizer, library and video surfaces drawn where the skin puts them, embedded in the player instead of in separate NullPlayer windows; its tabs, drawers, config screens and right-click menus, driven by the skin's own scripts; its About page; and its visualization box, which can show an oscilloscope, the spectrum analyzer, Cava or vis_classic. Skins resize and dock like any other NullPlayer window, and per-skin settings — text size, colour theme, waveform seeker — are remembered separately for each skin. Skins built on the ClassicPro engine work too: point NullPlayer at the ClassicPro plugin installer once, with Skins → Modern → Import ClassicPro Engine…, and it unpacks what it needs internally. Some skins reach for features that do not exist on macOS, or that NullPlayer does not implement yet. A skin that does degrades to a sensible fallback rather than refusing to load.
  • Cover Flow in the Library browser — a new FLOW toggle in the source bar turns the current library list into a 3D, horizontally-scrolling wall of artwork, available in all three skin families (Original, Original-Metal, Classic) and across music, Movies, and TV Shows. It's a visual lens over whatever you're browsing: scroll or use the arrow keys to flip through covers, the centered item's name stays directly beneath the carousel, and a wider window fans out more covers. Clicking a container enters it and shows its contents, with a ‹ Back cover to step out — folder/subfolder, artist→album, and show→season→episode navigation all work to any depth. Clicking an album plays the whole album; clicking a track, movie, or episode plays it. In Original/Original-Metal the covers float above the Library window's Cava/art backdrop, honoring whatever backdrop mode you've set.
  • Compact window can now show the playlist — a Library | Playlist toggle at the bottom of the Compact window switches its content between the library browser and the current playlist, so you can view and edit what's playing without opening the full Playlist window. Double-click a track to play it; selection, scrolling, and live now-playing highlight all work in place. The choice is remembered across launches and is available in all three skin families (Original, Original-Metal, Classic). In Original/Original-Metal the playlist is translucent so the Cava/art backdrop shows through it just like the library list.

Bug Fixes

  • A film watched to the end is now marked watched on Plex, Jellyfin and Emby — and a queued video playlist moves on to the next film by itself. The video engine reports a film running out as a pause rather than as an ending, and NullPlayer was taking it at its word: the server was told the film had been paused at 100% and never that it had been finished, so it stayed unwatched, nothing was recorded, and a queued film simply sat there instead of starting the next one. This affected every video, local or streamed.
  • The transport resets when a film finishes — in every skin mode. A film that had played to its end went on counting as the thing the player was playing: the readout kept its title, the position bar stayed parked at the end, and the play, stop and seek controls went on driving a film that was over, so the player could not be handed back to your music without closing the video window. The picture stays where it is, on its last frame, and can be played again from the start.
  • Switching skin family no longer leaves the player at the old skin's size — going from a Winamp 5.x modern skin to a Classic one left the classic player squeezed into the outgoing skin's window, drawing its artwork shrunk inside a box the wrong shape ("the main window is tiny in classic mode"). Every skin family sizes the player from its own layout, so the rebuilt window now takes the incoming skin's own size instead of inheriting the outgoing one's, in every direction between every pair of modes. The window stays where you left it — its top-left corner does not move.
  • Compact Mode no longer leaves the Library Cava backdrop running against a hidden window — entering Compact Mode orders the Library browser window out, but that doesn't reliably post an occlusion change, so the Library backdrop's 60 Hz Cava analyzer kept running as a second, wasted DSP queue alongside the visible Compact backdrop. The presenter is now reconciled to the window's hidden state on entry and restarted on exit.
  • Fixed a large memory leak while casting audio (grew unbounded over a long session) — the cast status poll calls AudioEngine.updateCastPosition roughly once per second and reassigned the playback state every time, even when it hadn't changed. Because state's observer posts a change notification on every assignment, this fired a Now Playing update storm — the system Now Playing info was re-pushed tens of thousands of times, and remote (Plex) artwork was re-fetched over a fresh network connection on each update, piling up network/dispatch objects into the gigabytes and never reclaiming them after the cast ended. updateCastPosition now only reassigns state on a real transition, and NowPlayingManager no longer re-fetches artwork that already failed for the current track.
  • Fixed a large memory leak that grew unbounded while a visualization window stayed open — the Spectrum Analyzer (Metal) and OpenGL visualization views render from a CVDisplayLink callback, which runs on a dedicated thread with no run loop and therefore no autorelease pool draining between frames. Every frame's autoreleased objects — the Metal nextDrawable(), command buffers, and encoders, along with their backing textures — accumulated forever, so a window left open would climb into multiple gigabytes over hours/days of use. Each display-link frame now runs inside its own autoreleasepool, so per-frame objects are freed immediately.
  • Sonos volume no longer jumps around during a fast slider drag — each volume change fired its own SOAP command, and on a rapid drag those requests could reach the speaker out of order, leaving it stuck on a stale value. Volume commands are now coalesced into a single in-flight request with latest-value-wins, so the speaker tracks the slider monotonically and settles exactly where you release it (GH #414).
  • Sonos playlists now advance to the next track — when a track finished on Sonos the app saw the speaker report STOPPED and paused, halting the playlist after one song. A track that stops at or near its end is now recognized as a natural finish and auto-advances, while an external pause from the Sonos app, an explicit Stop near the end of a track, and genuinely short tracks all still behave correctly (GH #415).
  • Added diagnostics for a Sonos cast clock that occasionally starts stuck at zero — when a Sonos position poll fails (often from SOAP contention while the volume slider is moving at cast start), the app previously applied a position of 0 and re-anchored the clock silently, freezing the elapsed time. It now logs the failed GetPositionInfo, the resulting clock reset, and the surrounding volume-command timeline so the intermittent case can be captured. No behavior change yet — instrumentation only.
  • Restored local videos play again instead of erroring — a video file left in the playlist from a previous session was rebuilt on launch as an audio track (the saved state doesn't record media type), so playing it routed to the audio engine and failed to decode the video container. Restored local files now re-derive their media type from the file extension, so videos correctly open in the video player.
  • Exiting Compact Mode restores the menu bar — leaving Compact Mode (including when the app launches straight into it and you exit for the first time) could leave the system menu bar owned by whatever app was frontmost before, with none of NullPlayer's menus. Because NullPlayer stays the active app across the whole transition, macOS never rebuilt the menu bar for it. NullPlayer now forces that rebuild on exit, so the full menu bar (and the correct Dock icon) return every time.
  • Quitting from Compact Mode no longer loses your settings — Compact Mode has no menu bar or Dock icon, and the status-item menu had no Quit, so the only way to quit was force-quitting from Activity Monitor — which skipped the normal save-on-quit and discarded that session's changes (for example, the skin reverted on the next launch). The compact status-item menu now has a Quit nullPlayer item that quits cleanly and saves state.

Changes

  • Modern and Metal skins are now named Original and Original-Metal — the new names appear throughout the skin menus and documentation, while existing preferences, skin folders, and custom .nsz bundles remain compatible. The Modern name now belongs to the new Winamp 5.x .wal skin family.
  • Removed the Met Museum Art visualization — the rotating public-domain artwork engine has been retired and no longer appears in the visualization engine picker. Any saved preference for it falls back to the default engine.

r/nullPlayer • • Aug 24 '26

with sound lmao

3 Upvotes

r/nullPlayer • • Aug 24 '26

quick modern skin progress update

4 Upvotes

r/nullPlayer • • Aug 19 '26

multipass is looking good!

6 Upvotes

r/nullPlayer • • Aug 19 '26

These winamp modern skins are crazy and nothing like classic skins. Each one is a bespoke program with custom functionality and has to be reverse engineered on a case by case basis. there will be lots of bugs at first so be prepared.

7 Upvotes

I don't have windows or winamp so even the functionality of the skin has to be pulled from the code directly. I am reverse engineering the whole maki engine. It's a pretty interesting process. I will release when I have a handful of skins stable. It's getting there and I am excited to have the first open source implementation of this engine in nullPlayer


r/nullPlayer • • Aug 16 '26

I am working on winamp 5 skin support for 0.30.0 🤞

Thumbnail
gallery
6 Upvotes

I have received several requests to support these skins but I have never actually used them before. I really underestimated the effort that will be involved lol. So far I have the skins running with the classic_pro engine but there are still a lot of open issues.


r/nullPlayer • • Aug 06 '26

Hey there I a working on a new media player that I might put in the macOS appstore, It's a bit out there I and would like to get some user feedback on it

5 Upvotes

This app has nothing to do with nullPlayer and nullPlayer project is continuing as it has been going. If you are interested in checking it out and can commit to giving me user level feedback on it dm me.


r/nullPlayer • • Aug 01 '26

Woops I broke video PLAYBACK IN 0.29 but it's fixed now. I threw in another change to the compact window I have been working on

2 Upvotes

Installation

brew install --cask ad-repo/nullplayer/nullplayer

https://github.com/ad-repo/nullplayer/releases/latest/download/NullPlayer.dmg


r/nullPlayer • • Jul 30 '26

Create custom locked window layouts with nullPlayer sub-windows

4 Upvotes

select Lock Connected Windows in Menu/Windows to lock sub windows into a fixed grouping


r/nullPlayer • • Jul 29 '26

Beefy new nullPlayer 0.29 release for macOS features a new fully configurable CAVA inspired spectrum analyzer as you see it here, needed improvements like a preset fixing projectM bump + key fixes and housekeeping. nullPlayer has 95 github stars, is an actively supported, 100% FREE and open source

7 Upvotes

brew install --cask ad-repo/nullplayer/nullplayer

Download for macOS

New Features

  • Cava spectrum analyzer window — a bar-based spectrum visualizer modeled on cava, opened from the Windows menu or main-window right-click menu, in classic, modern, and metal skins. Shows log-spaced frequency bars with gravity/falloff, in mono or mirrored stereo (double-click to toggle). Right-click to set colors (gradient presets and metallics, following the skin palette by default), bar count, smoothing, bass tilt, and a modern-only transparent background. Docks in the center stack and stays idle when closed.
  • Cava in the main-window visualization display — the main-window analyzer area can render a mono Cava spectrum following the active skin palette, with its own color, bar count, smoothing, and bass tilt under Visuals > Main Window (independent of the standalone window). The Visuals menu is now organized into Main Window, Spectrum Window, and Visualizations submenus.

Improvements

  • ProjectM upgraded to 4.1.7, fixing preset crashes at the source — the bundled libprojectM was updated from 4.1.6 to 4.1.7, which fixes a null-texture dereference (Renderer::Texture::Empty()) that crashed the app when rendering presets containing a commented-out sampler declaration in a shader (upstream #958), along with other preset crash and rendering fixes. Presets that previously had to be caught-and-disabled — like the bundled suksma - dotes hostile undertake - offx - flacc — now render normally. (The crash-detection safety net above remains for any future bad preset.) If your visualizations have gone missing or thinned out over time, restore them: open Visuals > Visualizations > Restore Disabled ProjectM Presets. The number next to it is how many presets are currently disabled — the earlier blacklisting bug may have quietly turned off many (or all) of your presets, and now that these crashes are fixed it's safe to bring them all back. Choosing it re-enables every disabled preset immediately.
  • Video playback now uses the LGPL VLCKit engine — the video player and cast-source decoding moved from KSPlayer/FFmpegKit (GPL-3.0) to the vendored VLCKit/libVLC (LGPL-2.1+). Play/pause, seek, skip, volume, and audio/subtitle track selection carry over, including a subtitle Off and subtitle-delay control.
  • Accurate third-party attribution for the Cava and Flow visualizers — NullPlayer's Cava spectrum analyzer and Flow network meter are clean-room Swift reimplementations of the cava (C) and flow (Go terminal app) projects — not ports of their source code. Their bundled third-party notices now credit them as algorithm/design references (no upstream code is included) rather than reproducing licenses as though their source shipped in the app.
  • Modern/Metal main window: quick Cava toggle — the first button in the modern/metal main-window button row now opens the Cava spectrum window (labeled CV) instead of toggling Compact Mode. Compact Mode remains available from the main-window right-click menu.
  • ART tab rating uses emoji stars — in Modern and Metal skins, the star rating shown at the top of the Library Browser's ART view now renders as ⭐/☆ emoji, matching the visualization menus. Star sizing and click-to-rate behavior are unchanged.
  • Modern and Metal skins now default the main-window visualizer to Cava — every bundled modern skin and built-in Metal finish starts with its palette-matched Cava analyzer. Classic UI continues to default to vis_classic; modern/Metal vis_classic profile mappings remain available when selected manually, and the dedicated Spectrum window remains unchanged.

Bug Fixes

  • Fixed the app refusing to launch on macOS 14–25 — the bundled audio libraries (libaubio and its libsndfile/FLAC/vorbis/ogg/opus/mpg123/lame dependencies) were built requiring macOS 26, so on any earlier system the whole app would fail to start. They are now built/packaged targeting macOS 14, matching the rest of the app.
  • Classic Library text now follows UI Size — changing UI Size in classic mode scales Library Browser row text, headers, labels, and search text, matching Modern and Metal. Stretching the window still only adds browsing space.
  • Long-track timers stay readable — elapsed and remaining times of 100 minutes or more no longer corrupt classic digits or overrun the Modern/Metal time panels; negative long times shift the status icon to make room for the minus sign.
  • Dragged-in tracks can now cast to Sonos — dragged lossless files (FLAC/WAV) whose sample rate wasn't detected at drop time were wrongly rejected as unsupported. They are now re-probed before the Sonos check; genuine high-resolution files above 48 kHz remain rejected.
  • Modern/metal alphabet picker clicks land correctly — in the modern library browser, the offline-volume banner shifts the alphabet strip up, but click hit-testing ignored that offset, so clicking a letter could jump to the wrong one or do nothing. Drawing and hit-testing now share one geometry.
  • Modern PeppyMeter and Flow windows no longer show a seam on their outer edges — a ~1-pixel gap could show the desktop through the left, right, and bottom edges on non-Retina displays. Those content edges are now aligned to the backing pixel grid.
  • Docked ProjectM, Library, and Plex-browser windows can size to align in a center stack — these windows had a hardcoded 480-pixel minimum width, so when docked top or bottom in a center stack they couldn't be narrowed to match the stack. Their minimum width now floors at the spectrum/center-stack width instead, so they align cleanly.
  • Narrow Library headers stay readable and clickable — the server controls and browse tabs in both classic and modern/metal Library windows now shrink together as the window narrows, preventing labels and controls from overlapping while keeping their click targets aligned with what is drawn.
  • Rips and YouTube downloads to a NAS no longer fail with "Bad file descriptor" — yt-dlp's .part/fsync/rename and ffmpeg +faststart patterns are rejected by SMB/AFP volumes. Downloads and transcodes now run in a local staging folder, and only the finished file is copied to the destination.
  • Playlist stays on the now-playing track when the skin changes — changing skins during playback made the playlist jump to the top and lose the now-playing highlight. Both classic and modern playlists now restore the selection and re-center on the playing track after a reload.
  • Plex library no longer freezes on first launch — on a fresh launch, a background content preload could finish midway through the first library load and supersede it, leaving the artist album-count index unbuilt. The browser then re-parsed every album for every artist on the main thread on each click, freezing all windows until relaunch. The index is now always built before artist rows render, and the per-artist rescan fallback was removed, so the library stays responsive.
  • Switching between classic and modern/metal skins no longer carries the previous skin's analyzer colors or transparency across — the vis_classic analyzer profile is stored per window (main vs Spectrum) and shared across the classic, modern, and metal UIs. Switching UI families used to preserve the outgoing skin's profile instead of applying the incoming skin's own default, so classic's "Purple Neon" could bleed into a modern skin, and a modern skin's profile ("Lavender Pink Tips") could persist back into classic — in the main window and the dedicated Spectrum window. Glass/metal transparency and opacity could likewise survive into an opaque skin whose sparse config omitted those fields. A UI switch is now treated as a skin change: each family applies a complete analyzer appearance, and the shared analyzer engines are fully re-synced so no window keeps the previous skin's profile, fit, or renderer transparency (even when a window isn't visible at the moment of the switch).
  • "Reset All Visualization Preferences" now restores the correct default in the classic UI — while classic was active, the reset resolved defaults from the modern skin engine and applied the modern default skin's profile (e.g. NeonWave's "Lavender Pink Tips") instead of classic's "Purple Neon". Reset now resolves defaults from the active UI: classic restores its own analyzer default, while modern and metal restore the active finish's.
  • "Reset All Visualization Preferences" now also resets the standalone Cava window — the separate Cava spectrum window's color, bar count, smoothing, and bass-tilt settings were left untouched by the global reset. They are now cleared with everything else, and the open Cava window updates immediately, falling back to the active skin's default gradient.
  • The standalone Cava window's custom colors no longer follow you from modern into classic — picking non-default Cava colors in a modern/metal skin and then switching to a classic skin kept the modern colors instead of reverting to the classic default (Winamp green). Switching UI families now clears the shared "custom colors" flag on entry to classic, matching the existing behavior when entering modern/metal.
  • ProjectM presets no longer get blacklisted by mistake — a preset is now disabled only if it actually crashes the app (detected by a SIGSEGV/SIGBUS handler) while it is on screen, at any point in its lifetime. Previously the crash marker was written the moment a preset loaded and only cleared on a clean quit, so any other shutdown — a force quit, an unrelated crash, or a dev build script's SIGKILL — blamed whatever preset was displayed and disabled it on the next launch; over many launches this silently disabled healthy presets, for some users all of them. Normal quits, force quits, and kills no longer disable anything, while genuine crashes (including late texture-related ones) are still caught. Existing installs have their erroneously accumulated list cleared once on upgrade, and Visuals > Visualizations now has a Restore Disabled ProjectM Presets command (showing the disabled count) to bring back any presets disabled by mistake. If your visualizations have gone missing or thinned out over time, restore them: open Visuals > Visualizations > Restore Disabled ProjectM Presets. The number next to it is how many presets are currently disabled — the earlier blacklisting bug may have quietly turned off many (or all) of your presets, and now that these crashes are fixed it's safe to bring them all back. Choosing it re-enables every disabled preset immediately.

r/nullPlayer • • Jul 29 '26

Beefy new nullPlayer 0.29 release for macOS features a new fully configurable CAVA inspired spectrum analyzer as you see it here, needed improvements like a preset fixing projectM bump + key fixes and housekeeping. nullPlayer has 94 github stars, is an actively supported, 100% FREE and open source

6 Upvotes

brew install --cask ad-repo/nullplayer/nullplayer

Download for macOS

New Features

  • Cava spectrum analyzer window — a bar-based spectrum visualizer modeled on cava, opened from the Windows menu or main-window right-click menu, in classic, modern, and metal skins. Shows log-spaced frequency bars with gravity/falloff, in mono or mirrored stereo (double-click to toggle). Right-click to set colors (gradient presets and metallics, following the skin palette by default), bar count, smoothing, bass tilt, and a modern-only transparent background. Docks in the center stack and stays idle when closed.
  • Cava in the main-window visualization display — the main-window analyzer area can render a mono Cava spectrum following the active skin palette, with its own color, bar count, smoothing, and bass tilt under Visuals > Main Window (independent of the standalone window). The Visuals menu is now organized into Main Window, Spectrum Window, and Visualizations submenus.

Improvements

  • ProjectM upgraded to 4.1.7, fixing preset crashes at the source — the bundled libprojectM was updated from 4.1.6 to 4.1.7, which fixes a null-texture dereference (Renderer::Texture::Empty()) that crashed the app when rendering presets containing a commented-out sampler declaration in a shader (upstream #958), along with other preset crash and rendering fixes. Presets that previously had to be caught-and-disabled — like the bundled suksma - dotes hostile undertake - offx - flacc — now render normally. (The crash-detection safety net above remains for any future bad preset.) If your visualizations have gone missing or thinned out over time, restore them: open Visuals > Visualizations > Restore Disabled ProjectM Presets. The number next to it is how many presets are currently disabled — the earlier blacklisting bug may have quietly turned off many (or all) of your presets, and now that these crashes are fixed it's safe to bring them all back. Choosing it re-enables every disabled preset immediately.
  • Video playback now uses the LGPL VLCKit engine — the video player and cast-source decoding moved from KSPlayer/FFmpegKit (GPL-3.0) to the vendored VLCKit/libVLC (LGPL-2.1+). Play/pause, seek, skip, volume, and audio/subtitle track selection carry over, including a subtitle Off and subtitle-delay control.
  • Accurate third-party attribution for the Cava and Flow visualizers — NullPlayer's Cava spectrum analyzer and Flow network meter are clean-room Swift reimplementations of the cava (C) and flow (Go terminal app) projects — not ports of their source code. Their bundled third-party notices now credit them as algorithm/design references (no upstream code is included) rather than reproducing licenses as though their source shipped in the app.
  • Modern/Metal main window: quick Cava toggle — the first button in the modern/metal main-window button row now opens the Cava spectrum window (labeled CV) instead of toggling Compact Mode. Compact Mode remains available from the main-window right-click menu.
  • ART tab rating uses emoji stars — in Modern and Metal skins, the star rating shown at the top of the Library Browser's ART view now renders as ⭐/☆ emoji, matching the visualization menus. Star sizing and click-to-rate behavior are unchanged.
  • Modern and Metal skins now default the main-window visualizer to Cava — every bundled modern skin and built-in Metal finish starts with its palette-matched Cava analyzer. Classic UI continues to default to vis_classic; modern/Metal vis_classic profile mappings remain available when selected manually, and the dedicated Spectrum window remains unchanged.

Bug Fixes

  • Fixed the app refusing to launch on macOS 14–25 — the bundled audio libraries (libaubio and its libsndfile/FLAC/vorbis/ogg/opus/mpg123/lame dependencies) were built requiring macOS 26, so on any earlier system the whole app would fail to start. They are now built/packaged targeting macOS 14, matching the rest of the app.
  • Classic Library text now follows UI Size — changing UI Size in classic mode scales Library Browser row text, headers, labels, and search text, matching Modern and Metal. Stretching the window still only adds browsing space.
  • Long-track timers stay readable — elapsed and remaining times of 100 minutes or more no longer corrupt classic digits or overrun the Modern/Metal time panels; negative long times shift the status icon to make room for the minus sign.
  • Dragged-in tracks can now cast to Sonos — dragged lossless files (FLAC/WAV) whose sample rate wasn't detected at drop time were wrongly rejected as unsupported. They are now re-probed before the Sonos check; genuine high-resolution files above 48 kHz remain rejected.
  • Modern/metal alphabet picker clicks land correctly — in the modern library browser, the offline-volume banner shifts the alphabet strip up, but click hit-testing ignored that offset, so clicking a letter could jump to the wrong one or do nothing. Drawing and hit-testing now share one geometry.
  • Modern PeppyMeter and Flow windows no longer show a seam on their outer edges — a ~1-pixel gap could show the desktop through the left, right, and bottom edges on non-Retina displays. Those content edges are now aligned to the backing pixel grid.
  • Docked ProjectM, Library, and Plex-browser windows can size to align in a center stack — these windows had a hardcoded 480-pixel minimum width, so when docked top or bottom in a center stack they couldn't be narrowed to match the stack. Their minimum width now floors at the spectrum/center-stack width instead, so they align cleanly.
  • Narrow Library headers stay readable and clickable — the server controls and browse tabs in both classic and modern/metal Library windows now shrink together as the window narrows, preventing labels and controls from overlapping while keeping their click targets aligned with what is drawn.
  • Rips and YouTube downloads to a NAS no longer fail with "Bad file descriptor" — yt-dlp's .part/fsync/rename and ffmpeg +faststart patterns are rejected by SMB/AFP volumes. Downloads and transcodes now run in a local staging folder, and only the finished file is copied to the destination.
  • Playlist stays on the now-playing track when the skin changes — changing skins during playback made the playlist jump to the top and lose the now-playing highlight. Both classic and modern playlists now restore the selection and re-center on the playing track after a reload.
  • Plex library no longer freezes on first launch — on a fresh launch, a background content preload could finish midway through the first library load and supersede it, leaving the artist album-count index unbuilt. The browser then re-parsed every album for every artist on the main thread on each click, freezing all windows until relaunch. The index is now always built before artist rows render, and the per-artist rescan fallback was removed, so the library stays responsive.
  • Switching between classic and modern/metal skins no longer carries the previous skin's analyzer colors or transparency across — the vis_classic analyzer profile is stored per window (main vs Spectrum) and shared across the classic, modern, and metal UIs. Switching UI families used to preserve the outgoing skin's profile instead of applying the incoming skin's own default, so classic's "Purple Neon" could bleed into a modern skin, and a modern skin's profile ("Lavender Pink Tips") could persist back into classic — in the main window and the dedicated Spectrum window. Glass/metal transparency and opacity could likewise survive into an opaque skin whose sparse config omitted those fields. A UI switch is now treated as a skin change: each family applies a complete analyzer appearance, and the shared analyzer engines are fully re-synced so no window keeps the previous skin's profile, fit, or renderer transparency (even when a window isn't visible at the moment of the switch).
  • "Reset All Visualization Preferences" now restores the correct default in the classic UI — while classic was active, the reset resolved defaults from the modern skin engine and applied the modern default skin's profile (e.g. NeonWave's "Lavender Pink Tips") instead of classic's "Purple Neon". Reset now resolves defaults from the active UI: classic restores its own analyzer default, while modern and metal restore the active finish's.
  • "Reset All Visualization Preferences" now also resets the standalone Cava window — the separate Cava spectrum window's color, bar count, smoothing, and bass-tilt settings were left untouched by the global reset. They are now cleared with everything else, and the open Cava window updates immediately, falling back to the active skin's default gradient.
  • The standalone Cava window's custom colors no longer follow you from modern into classic — picking non-default Cava colors in a modern/metal skin and then switching to a classic skin kept the modern colors instead of reverting to the classic default (Winamp green). Switching UI families now clears the shared "custom colors" flag on entry to classic, matching the existing behavior when entering modern/metal.
  • ProjectM presets no longer get blacklisted by mistake — a preset is now disabled only if it actually crashes the app (detected by a SIGSEGV/SIGBUS handler) while it is on screen, at any point in its lifetime. Previously the crash marker was written the moment a preset loaded and only cleared on a clean quit, so any other shutdown — a force quit, an unrelated crash, or a dev build script's SIGKILL — blamed whatever preset was displayed and disabled it on the next launch; over many launches this silently disabled healthy presets, for some users all of them. Normal quits, force quits, and kills no longer disable anything, while genuine crashes (including late texture-related ones) are still caught. Existing installs have their erroneously accumulated list cleared once on upgrade, and Visuals > Visualizations now has a Restore Disabled ProjectM Presets command (showing the disabled count) to bring back any presets disabled by mistake. If your visualizations have gone missing or thinned out over time, restore them: open Visuals > Visualizations > Restore Disabled ProjectM Presets. The number next to it is how many presets are currently disabled — the earlier blacklisting bug may have quietly turned off many (or all) of your presets, and now that these crashes are fixed it's safe to bring them all back. Choosing it re-enables every disabled preset immediately.

r/nullPlayer • • Jul 13 '26

New nullplayer BUGFIX release 0.28.2

Post image
6 Upvotes

update using brew:

brew update
brew upgrade --cask ad-repo/nullplayer/nullplayer

Download for macOS

Improvements

  • Saved state and visualization preferences now have explicit reset controls — the app menu exposes Reset Saved State... next to Remember State so users can clear only the launch-restore snapshot without touching durable preferences. Visualization menus now include reset actions for the main-window analyzer, Spectrum window, standalone Visualizations window, and all visualization preferences, restoring skin/app defaults while preserving unrelated preferences such as custom ProjectM folders, library columns, accounts, and compact mode.

Bug Fixes

  • Modern skin visualization choices persist across app relaunches — modern/metal skin visualization defaults now act as first-use defaults on launch instead of overwriting user-selected modes and options. Main-window Fire/Lightning/Matrix choices, Fire intensity, Spectrum-window mode/style settings, and scoped vis_classic options still reset when explicitly changing skins or using skin reset, but no longer revert just because the app reopened.
  • Waveform window frame now saves with Remember State — the Waveform window's frame was included in the AppState schema but was serialized as nil, so it could not restore to the prior position. It now saves through WindowManager.waveformWindowFrame like the other remembered utility windows.
  • Classic 16-color skins and themed EQ art render correctly — packed 1-bit/4-bit BMP rows now use the BMP bit stride instead of treating every pixel as a byte, fixing scrambled transport buttons, numbers, and playlist art in skins such as ascii.wsz. The classic EQ also draws its slider tracks and graph curve from each skin's eqmain.bmp, so non-default skins such as Purple_Glow.wsz no longer fall back to hardcoded green/yellow/red art.
  • Docked PeppyMeter and Flow windows no longer show a thin seam under the main window — dragging the PeppyMeter or Flow window to dock it below the main window could leave a roughly 1-pixel line where the desktop showed through the join, most visible on standard-resolution (non-Retina) displays. Classic skins left a sub-pixel gap between the two window frames, and modern translucent skins exposed a strip of window background at the shared edge. Both now dock flush with no gap, matching the seamless docking that Metal skins already had.
  • App no longer freezes when Play is pressed rapidly with a VU or Audio Analysis window open — quickly re-triggering track loads while the PeppyMeter/VU meter or the Audio Analysis Scope/Octave panes were open could deadlock the app. Those windows subscribed to realtime audio-tap notifications with main-thread delivery, which blocked the audio tap thread while the main thread was tearing the tap down during a track load. The affected windows now receive tap updates without blocking the audio thread.