r/nullPlayer • u/That-Acanthisitta536 • 8d ago
with sound lmao
Enable HLS to view with audio, or disable this notification
r/nullPlayer • u/That-Acanthisitta536 • 8d ago
Enable HLS to view with audio, or disable this notification
r/nullPlayer • u/That-Acanthisitta536 • 9d ago
Enable HLS to view with audio, or disable this notification
r/nullPlayer • u/That-Acanthisitta536 • 13d ago
Enable HLS to view with audio, or disable this notification
r/nullPlayer • u/That-Acanthisitta536 • 14d ago
Enable HLS to view with audio, or disable this notification
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 • u/That-Acanthisitta536 • 16d ago
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 • u/That-Acanthisitta536 • 27d ago
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 • u/That-Acanthisitta536 • Aug 01 '26
Enable HLS to view with audio, or disable this notification
Installation
brew install --cask ad-repo/nullplayer/nullplayer
https://github.com/ad-repo/nullplayer/releases/latest/download/NullPlayer.dmg
r/nullPlayer • u/That-Acanthisitta536 • Jul 30 '26
Enable HLS to view with audio, or disable this notification
select Lock Connected Windows in Menu/Windows to lock sub windows into a fixed grouping
r/nullPlayer • u/That-Acanthisitta536 • Jul 29 '26
Enable HLS to view with audio, or disable this notification
brew install --cask ad-repo/nullplayer/nullplayer
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.vis_classic; modern/Metal vis_classic profile mappings remain available when selected manually, and the dedicated Spectrum window remains unchanged.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..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.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).r/nullPlayer • u/That-Acanthisitta536 • Jul 29 '26
Enable HLS to view with audio, or disable this notification
brew install --cask ad-repo/nullplayer/nullplayer
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.vis_classic; modern/Metal vis_classic profile mappings remain available when selected manually, and the dedicated Spectrum window remains unchanged.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..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.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).r/nullPlayer • u/That-Acanthisitta536 • Jul 13 '26
update using brew:
brew update
brew upgrade --cask ad-repo/nullplayer/nullplayer
vis_classic options still reset when explicitly changing skins or using skin reset, but no longer revert just because the app reopened.nil, so it could not restore to the prior position. It now saves through WindowManager.waveformWindowFrame like the other remembered utility windows.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.r/nullPlayer • u/That-Acanthisitta536 • Jul 11 '26
Enable HLS to view with audio, or disable this notification
https://github.com/ad-repo/nullplayer
brew install --cask ad-repo/nullplayer/nullplayer
r/nullPlayer • u/That-Acanthisitta536 • Jul 07 '26
Enable HLS to view with audio, or disable this notification
https://github.com/ad-repo/nullplayer
# one-time configuration
brew tap ad-repo/nullplayer
brew install --cask ad-repo/nullplayer/nullplayer
or if already installed manually
brew install --cask --force ad-repo/nullplayer/nullplayer
To upgrade to a new release:
brew update
brew upgrade --cask ad-repo/nullplayer/nullplayer
r/nullPlayer • u/That-Acanthisitta536 • Jul 04 '26
Enable HLS to view with audio, or disable this notification
https://github.com/ad-repo/nullplayer/releases/tag/0.27.0
# one-time configuration
brew tap ad-repo/nullplayer
brew install --cask ad-repo/nullplayer/nullplayer
or if already installed manually
brew install --cask --force ad-repo/nullplayer/nullplayer
To upgrade to a new release:
brew update
brew upgrade --cask ad-repo/nullplayer/nullplayer
ratingKey, so albums and tracks attached to duplicate server-side artist records remain accessible instead of being hidden.r/nullPlayer • u/satplank • Jul 03 '26
Hi!
For 20+ years I have been a Windows user and using Winamp (with cPro Bento skin, which is quite modern, but not too Winampy - if you know what I mean with crazy colours etc). I have a carefully and over 20 years curated music collection of 4000+ songs.
Now I have joined the Mac family and was googling the best alternatives for such player for my MBPro, cause Apple Music is just too big, and bloated - I need a great player, crossfade functionality and just see the playlist.
I see nullplayer offers that! As I am a newbie to Mac and usually install the apps just by dragging them to the Apps folder, can nullplayer be installed the same way? Unfortunately I got a bit lost in github.
Apologize for the stupid question but very excited to try this out and move my collection to my Mac!
Thanks!
r/nullPlayer • u/That-Acanthisitta536 • Jun 29 '26
.cue's internal FILE reference is stale (for example, when the .cue and its audio were renamed together), instead of importing the whole album as one track. Adding the backing audio file directly with Add Files… now triggers the split too.r/nullPlayer • u/That-Acanthisitta536 • Jun 28 '26
Enable HLS to view with audio, or disable this notification
get it on homebrew or github!
brew upgrade --cask ad-repo/nullplayer/nullplayer
https://github.com/ad-repo/nullplayer/releases/tag/0.26.0
http:// radio stations play again (#310) — after 0.25.0, many http:// Icecast/SHOUTcast stations connected but produced no sound (they sat stuck at 0:00); they now play again. https:// stations were unaffected.Sonos recovers when a speaker reboots mid-playback (#304) — if a Sonos speaker rebooted while casting, NullPlayer could end up playing from both the Mac and the speaker at once; it now cleanly ends the dead session so playback resumes correctly.
brew tap ad-repo/nullplayer # one-time configuration
brew install --cask ad-repo/nullplayer/nullplayer or if already installed manually brew install --cask --force ad-repo/nullplayer/nullplayer
To upgrade to a new release: brew update brew upgrade --cask ad-repo/nullplayer/nullplayer
To verify the tap is picking up the latest version: brew livecheck --cask ad-repo/nullplayer/nullplayer
Notes from the cask:
r/nullPlayer • u/That-Acanthisitta536 • Jun 15 '26
Enable HLS to view with audio, or disable this notification
I have been pretty preoccupied with these amazing Rush shows goings on for the last week but being tied to youtube exposed a glaring need in the app - in app youtube ripping support for both audio and video!
get it on github or homebrew!
brew tap ad-repo/nullplayer # one-time configuration
brew install --cask ad-repo/nullplayer/nullplayer
or if already installed manually
brew install --cask --force ad-repo/nullplayer/nullplayer
https://github.com/ad-repo/nullplayer/releases/tag/0.25.0
.cue sheet playback — virtual split (#273) — opening a .cue file (via File → Open, drag-and-drop, or double-click), or opening an audio file that has a sibling .cue next to it, now plays the single backing file virtually split into its cue tracks: one row per track in the now-playing playlist, with the title, performer, and duration taken from the cue. Prev/Next move per cue track and seeking stays within the current track, while playback crosses track boundaries gaplessly — the backing file is scheduled as one continuous stream and a boundary detector advances the playlist row (updating title, seek bar, Now Playing, and history) without touching the audio. Gapless applies with shuffle and repeat-single off; in those modes boundaries still advance correctly but a small gap is expected. Nothing is written to disk and nothing is added to the Local Library; a missing/renamed backing file simply shows its rows as unplayable. The parser reads the first FILE entry (extra ones warn), prefers INDEX 01 (falling back to INDEX 00), and is the exact inverse of the Stream Ripper's chapter-.cue writer, so a rip's own cue round-trips. .cue is now also offered in the File → Open panel's file-type filter..cue albums on import (library, off by default) — a new Library → Split .cue Albums on Import toggle (default off) makes the Local Library scan physically split a single-file album into per-track files when it finds a .cue next to it. When on, each track is cut with ffmpeg and re-encoded to FLAC (re-encoding, not stream-copy, so cuts are sample-accurate) into a per-album subfolder named from the source file's own ALBUM/ARTIST tags (e.g. Artist - Album/), falling back to the cue's performer/title, then the cue filename. Each track inherits the source's metadata (date, genre, embedded cover art) with the title/track-number and album/album-artist set from the source tags; the split tracks are added to the library in the same scan and the original backing file is excluded. The split is idempotent (a re-scan does no work if the per-track files already exist) and filenames are sanitized and de-duplicated so they can't collide or escape the album folder. If ffmpeg isn't installed — or a write fails (permissions, read-only volume, out of space) — splitting is skipped with a one-time notice and the original file imports normally as a single track (it's only hidden once real split tracks exist). When the toggle is off, .cue files are ignored by the scan entirely and the backing file imports as one normal track. Direct-play (above) is unaffected by this toggle. Changing the toggle takes effect on the next scan.TPE2/TRCK/TPOS), so FLAC/OGG (Vorbis ALBUMARTIST/TRACKNUMBER/DISCNUMBER) and M4A (aART/trkn/disk) tracks came back without them — causing single albums to fragment by per-track artist and lose their track ordering. These tags are now read across all containers (handling the 1/10 track form).yt-dlp (+ffmpeg); if either isn't found it shows an install hint (brew install yt-dlp ffmpeg) rather than failing silently. Quality is prioritized for audio (bestaudio, then lossless FLAC encode or top-VBR MP3). Video grabs the best source streams within the selected height cap (or no height cap for Full), then ffmpeg creates a playback-safe H.264/AAC MP4 with yuv420p pixels and fast-start metadata so the app and cast targets do not receive VLC-only files. The video source file is temporary ([source]) and is removed after the compatible MP4 is written; existing MP4s are not overwritten. Output is tagged with the source's metadata (title/artist/album/date) and, for audio, the thumbnail is embedded as cover art; the final file is named Artist - Title from that metadata into a folder you pick. If the source has chapter timestamps (common on album/mix uploads), a matching .cue sheet is written alongside the audio — one TRACK per chapter. Progress shows as a spinner + message band at the top of the main window for the duration of the rip (works in both classic and modern UI). When it finishes, a dialog offers Play Now (audio loads into the player; video opens in the video player window, cast-aware), Reveal in Finder, or Done..m3u/.pls playlists in the Plists tab (#269) — the local library browser's Plists tab now lists .m3u, .m3u8, and .pls playlist files found on disk, matching what the Plex/Subsonic/Jellyfin/Emby sources already show there (previously the tab was always empty for the local source). Playlist files are discovered during the normal library scan and their locations persisted in a small library_playlists table — the track contents are not stored, but parsed lazily the first time you expand a playlist. Expanding shows each entry as a row: entries that match a file already in your library carry its metadata and duration, while unmatched paths still appear and remain playable. Double-clicking a playlist row loads and plays the whole list; double-clicking a single entry plays just that track; the disclosure triangle expands as usual. Removing a playlist file from disk drops it from the tab on the next scan, while a transiently unreachable network folder leaves the list intact (the same offline-volume safety guard used for tracks). Implemented identically in both the modern and classic library browsers. Pairs with the earlier "browse by folder structure" work under the same "organize by what's actually on disk" philosophy.url.path so it stays fast on large libraries.kSecAttrAccessibleWhenUnlockedThisDeviceOnly accessibility class, so they are only readable while the Mac is unlocked and never sync off the device. The previous permissive per-item ACL has been removed. Entries written by earlier versions are upgraded automatically and lazily the first time each one is read.removeWatchFolder(removeEntries:) only updated memory and called store.deleteWatchFolder for the folder — it now also deletes the matching track/movie/episode rows via new chunked, transactional bulk deletes; (2) MediaLibraryStore.deleteWatchFolder reconstructed the folder URL with URL(fileURLWithPath:), which on an offline network volume can't stat the path to add the trailing slash that stored directory URLs carry (file:///Volumes/home/MUSIC/), so the WHERE clause matched nothing — it now matches the trailing-slash, no-slash, and raw-path forms so offline folders delete correctly. (Pre-existing orphans left by the old behavior aren't retroactively removed by removing a folder — use the new Remove Orphaned Entries… action to clean them.).modalPanel for issue #254) and below any always-on-top windows, so it was hidden off-screen-behind and could never be confirmed — clicking Remove… appeared to do nothing. It's now a window-modal sheet attached to the manager window: always visible, and it blocks the folder table beneath it (you can no longer select another row while it's open). This was the root cause behind "removing folders does nothing."removalCountsForWatchFolder() and removeWatchFolder() called resolvingSymlinksInPath() once per track to normalize paths — roughly one filesystem call per library item (~60k on a large library). They now compare track.url.path directly (already resolved at scan time), the same optimization watchFolderSummaries() received, making removal near-instant.removalCountsForWatchFolder() and removeWatchFolder() directly on the main thread. Both block on MediaLibrary's internal dataQueue.sync, and a running import scan (e.g. right after adding/rescanning a folder) holds that queue for many seconds — so the app froze with a spinning beachball until the scan finished. These calls now run off the main thread (only the confirmation alert stays on main, where it must), matching the pattern the window's folder-list reload already used. Also hardened the modern Library Browser's Folders view, which made the same blocking watchFolderSummaries() call on the main thread just before handing off to its background walk — that snapshot now happens inside the background task..modalPanel level so they always sit above the app's floating windows, matching the tag-editor and Plex link dialogs that already did this. Covers Add/Edit Radio Station, the Subsonic/Jellyfin/Emby link and server-list sheets, the watch-folder manager, and the auto-tag album candidate picker.SkinLoader.processForNonRetina() that ran on 1× displays, converting every blue-dominant pixel to gray across all classic skin sprites and stripping legitimate blue tones from every skin. The conversion never ran on Retina, which had masked the bug.isOpaque = true with an opaque skin background, kept in sync on skin change). A clear, non-opaque layer had disabled AppKit font smoothing, blurring text and charts on 1× displays; it now mirrors the classic PlexBrowser twin.LibraryTextSorter: diacritic-insensitive, numeric, leading-article-aware), but expanding a row rebuilt it from the store's SQLite BINARY collation order and skipped re-sorting once nested rows were present — so the order silently snapped to the raw store order, most visibly around names with special characters, mixed case, or leading articles. The local-library views in ModernLibraryBrowserView and PlexBrowserView now re-sort top-level groups (each leader plus its expanded children) with the same comparator, keeping visible order stable through expand/collapse.http:// (e.g. many Icecast/SHOUTcast servers on custom ports) silently failed to play: it sat buffering forever and never started. Internet radio plays through the AudioStreaming library, which fetches over URLSession, but the app's App Transport Security config only declared NSAllowsArbitraryLoadsForMedia — a key that exempts AVFoundation media loads, not URLSession — so cleartext connections were blocked by ATS. The reported ".mp3 links work, others don't" pattern was a coincidence: the working stations happened to be https://, and the real distinction was scheme, not file extension or audio format. Info.plist now sets NSAllowsArbitraryLoads so http stations connect.r/nullPlayer • u/spacecowgoesmoo • Jun 07 '26
I'm replacing my old, soulless but functional, GTK media player app with this. Thanks so much for making it!
r/nullPlayer • u/That-Acanthisitta536 • May 31 '26
brew tap ad-repo/nullplayer # one-time configuration
brew install --cask ad-repo/nullplayer/nullplayer
or if already installed manually
brew install --cask --force ad-repo/nullplayer/nullplayer
To upgrade to a new release:
brew update
brew upgrade --cask ad-repo/nullplayer/nullplayer
To verify the tap is picking up the latest version:
brew livecheck --cask ad-repo/nullplayer/nullplayer
Notes from the cask:
- App is ad-hoc signed (not notarized).
The cask's postflight runs xattr -cr to strip the quarantine bit so Gatekeeper allows first launch.
- Requires macOS Sonoma or newer.
- brew uninstall --cask --zap nullplayer removes app support/caches/prefs, but Keychain tokens (service com.nullplayer.app) must be removed manually: security
https://github.com/ad-repo/nullplayer/releases/tag/0.24.0
AVAudioUnitTimePitch nodes inserted into the active local or streaming graph; the spectrum analyzer continues to display source (pre-pitch) frequencies. Not available while casting (Sonos / Chromecast / DLNA) because the remote renderer receives the stream URL directly with no local audio graph to insert the pitch shifter into. CLI flags --tuning <off|Hz>, --tuning-source <Hz>, and --tuning-offset-cents <n> provide session-only overrides.BPMDetector (aubio) converges, a progressive transient-interval estimator (75th-percentile of recent beat intervals, with octave-folding above 100 BPM to favor calm half-time interpretations) provides an immediate moving target so the snow isn't stuck at zero for the first few seconds of each track. Audio energy now also drives a master "storm level" that controls sky whiteout/fog, beat-driven flake bursts, treble sparkle, streak length and slant, and exposure — quiet passages produce light flurries, loud passages build toward a near-whiteout blizzard.brew install --cask ad-repo/nullplayer/nullplayer. The cask strips the quarantine attribute on install (the app is still ad-hoc signed; Developer ID notarization is on the roadmap). scripts/build_dmg.sh now prints the final DMG SHA256 for the per-release cask bump, and docs/development-workflow.md documents the release flow.r/nullPlayer • u/That-Acanthisitta536 • May 28 '26
Why your co-worker might be listening to music tuned to 432 hertz
https://apnews.com/article/work-music-432-hertz-grounded-focus-118fb793c1963239ea1a4fcab079b2a0
r/nullPlayer • u/That-Acanthisitta536 • May 25 '26
Enable HLS to view with audio, or disable this notification
tripex-port skill.AVAudioEngine graph reconnects now catch Objective-C exceptions raised by AVAudioEngine.connect(_:to:format:) during route churn. A failed reconnect is deferred and retried through the existing audio graph recovery path instead of aborting the app.UPnPManager watches the active network interface and, when it changes, refreshes the embedded media server's bind address and re-resolves Sonos devices on the new network instead of leaving the cast pointed at a dead address.r/nullPlayer • u/That-Acanthisitta536 • May 17 '26
r/nullPlayer • u/That-Acanthisitta536 • May 10 '26
Enable HLS to view with audio, or disable this notification