Skip to content

milkdrop visualizer + plex + jellyfin + skin editor + cross builds#56

Merged
MrMilenko merged 7 commits into
mainfrom
milenko-stuff
May 21, 2026
Merged

milkdrop visualizer + plex + jellyfin + skin editor + cross builds#56
MrMilenko merged 7 commits into
mainfrom
milenko-stuff

Conversation

@MrMilenko

Copy link
Copy Markdown
Owner

Bundle of recent desktop features.

Milkdrop and stock visualizer: projectM 4.x as an in scene visualizer. Toggle in Settings, X+Y on a song to overlay it full screen with fade in. Configure panel has preset picker, sliders, soundtrack picker.

Plex/Jellyfin: PIN auth, library browse, libmpv playback. Quick Connect auth, browse, playback. New XIP scenes!

Skin editor: Live skin swap on desktop.

Menu restructure: Dev tools moved to a Development menu. New Audio menu and Settings tab with master volume that scales SDL, music, and libmpv. Mute moved out of View. Media OSD z order fixed so dropdowns sit above it.

Updated Cross builds: Win64 and Linux ARM64 paths now build libprojectM via cmake toolchain files. CI ships milkdrop on all four platforms.

MrMilenko added 7 commits May 21, 2026 16:51
phase 1 milkdrop integration: second SDL window with its own GL
context, libprojectM driving it, X+Y on keyboard or controller
toggles open/close. Makefile pkg-config detects libprojectM
optionally (THESEUS_HAS_MILKDROP guard).

projectM 3.x from brew segfaults inside Apple's GL emulator on
Apple Silicon. brew has no 4.x package; next step is build-from-
source.

CAudioVisualizer m_source gate dropped (it required CAudioClip in
TRANSPORT_PLAY which never happens on desktop where music flows
through Mix_PlayMusic). Diagnostic confirmed PCM is reaching the
render path; bug is downstream of pSurfx, not investigated further
in this session.
Plex works! Jellys next.
Quick Connect, browse, playback. Same scene pattern as plex.
- Dev tools move out of Tools into a Development top-level menu,
  gated by g_startupMode == 2 || g_extractedMode.
- New Audio menu (Mute + master volume slider) and matching
  Settings -> Audio tab. Master volume scales SDL_mixer channels,
  music, and libmpv playback; persists to Configs/desktop.ini.
- Mute removed from View; View is display-only now.
- Media OSD chrome moved from foreground draw list to background
  so the menu-bar dropdown sits above it during playback.
Added live skin editing functionality.
- Vendored libprojectM 4.x as a submodule under
  theseus/third-party/projectm; a `projectm-deps` make target builds
  and installs it into a local prefix on first `make desktop`, so the
  build is self-contained instead of depending on a user-installed lib.
- Ported the existing milkdrop window from the projectM 3.x C++ API to
  the 4.x C API (renderer, playlist, audio, render-to-FBO).
- Render path: projectM draws to an offscreen FBO, glReadPixels back to
  a CPU buffer, bgfx::updateTexture2D into a bgfx texture exposed to the
  scene. The visible second window is hidden by default and only shown
  via "Show preview window" in the Configure panel.
- Engine fix that benefits every dynamic texture, not just the
  visualizer: BgfxEnsureTextureUploaded now creates textures with
  BGFX_TEXTURE_BLIT_DST. Without it, Metal puts the texture in private
  GPU storage and silently drops updateTexture2D calls — any per-frame
  CPU-side texture mutation (audio visualizer, async-loaded covers,
  future dynamic content) froze on the first frame. Stride bug in
  CDynamicTexture::Update also fixed (writes now respect lr.Pitch
  instead of running off the end of a 352x352 region in a 512x512 dst).
- "Use projectM visualizer" toggle in Settings -> Audio. When on, X+Y
  starts a headless projectM session; the C++ side overlays its bgfx
  texture full-screen on the dashboard with a 500ms fade-in. Overlay is
  suppressed while Settings / Configure projectM windows are open so
  the panels stay legible.
- XAP-side coordination: new Math.projectMEnabled() built-in lets
  music2.xap's secret-key handler skip its own fullscreen viewpoint
  switch when projectM is taking over visually. Xbox builds get a stub
  constant so the engine still compiles.
- Configure projectM panel (Settings -> Audio -> Configure projectM...):
  start / stop session, prev / next preset (GL context made current
  around projectm_playlist_set_position so shader compiles don't fail
  silently and black out the preview), 400-entry searchable preset
  dropdown, beat sensitivity + preset duration sliders, lock toggle
  that survives explicit nav, and a soundtrack/song picker that plays
  through DashAudio so projectM has real audio to react to.
- Skin editor: Windows-cross PickFile() now uses GetOpenFileNameA from
  commdlg32 instead of the platform stub.
- Drive-by: removed the Current Skin reread inside RereadLegacyFromDisk
  (was clobbering the Skin Editor's pick before SaveDesktopSettings
  wrote it out).
@MrMilenko
MrMilenko merged commit 4fab95e into main May 21, 2026
4 checks passed
@MrMilenko
MrMilenko deleted the milenko-stuff branch May 21, 2026 21:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant