Skip to content

Releases: Pav-Osmolski/DarkOneJSP3

DarkOneJSP3 v0.9.37 - Render Blender 🖥️

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 06 Aug 17:27

DarkOneJSP3 v0.9.37

This release focuses on rendering performance, lower allocation overhead, improved resource management and final hardening of the shared bottom-area Custom colour controls.

It includes all changes made since v0.9.29.

Rendering and performance improvements

JS Playlist

  • Removed repeated native playlist-manager calls from the visible-row paint path.
  • Cached playlist selection, playback state and the currently playing item.
  • Reused visible row objects during sequential scrolling.
  • Cached resolved column geometry until the layout changes.
  • Cached group-header measurements until their fonts or content change.
  • Retained full rebuilding for structural playlist changes, sorting and large jumps.

These changes reduce JavaScript allocation, native API traffic and garbage collection during scrolling.

Control panels

  • Reused existing button objects during window resizing.
  • Added geometry updates instead of recreating complete button collections.
  • Reused the volume-knob object while updating its dimensions.
  • Cached unchanged control-panel fonts.
  • Continued rebuilding resources when style, scaling or font properties genuinely change.

Dot Matrix Display

  • Replaced repeatedly rebuilt composite time, bitrate and track-number images with direct draws from cached Direct2D sprite sheets.
  • Removed the recurring dispose-and-recreate cycle for complete numeric display images.
  • Cached Display fonts and value-label measurements until their effective settings change.
  • Fixed a startup regression caused by a remaining reference to the retired composite-image cache API.
  • Added validation comparing Display API calls against methods actually exposed by Object_DisplaySystem.js.

InfoStack

  • Added a cached render model containing:
    • Visible tabs
    • Resolved labels
    • Tab rectangles
    • Background colour
    • Accent colour
  • Paint and hit-testing operations now reuse the cached model.
  • The cache is invalidated only when layout, visibility, labels, colours or dimensions change.

Queue Viewer

  • Replaced repeated visible-row selection searches with a constant-time lookup.
  • Reduced large source scans to approximately 5 ms work slices.
  • Added a 5 ms yield between scan slices.
  • Reduced elapsed-time checks by processing items in small batches.

Playlist Manager

  • Removed plman.PlaylistCount reads from the paint path.
  • Uses the playlist count maintained by existing callbacks.

Album Art

  • Deferred blurred artwork generation until a blur-using layout actually requests it.
  • Coalesced repeated blur requests into one deferred operation.
  • Avoided blur generation for layouts that do not display it.
  • Added cancellation and explicit disposal for pending blur sources, timers and active Direct2D bitmaps.
  • Preserved compatibility with older saved AllMusic review entries.

Bottom-area Custom colour controls

The Custom colour options now work correctly for:

  • Bottom area background
  • Bottom area side divider colour

The final implementation:

  • Converts stored opaque ARGB colours to signed 32-bit integers only when calling the native JScript Panel colour picker.
  • Preserves the existing unsigned colour format used by rendering, saved properties and runtime-state files.
  • Uses one shared command-dispatch path for fixed and Custom colour selections.
  • Keeps the previous mode and colour unchanged when the picker is cancelled.
  • Keeps the previous state unchanged if the native picker fails.
  • Rejects invalid, fractional, infinite or out-of-range picker results.
  • Logs contextual picker errors instead of silently ignoring them.
  • Guarantees popup-menu cleanup with try/finally.
  • Preserves compatibility with older saved panel entries through a validated local fallback.
  • Uses the canonical shared colour helper for current Control Panel entries.

Menu and runtime hardening

  • Added an end-to-end test that constructs and executes the real DarkOne Tools popup hierarchy.
  • Tests the actual Custom command IDs used by the live menus.
  • Verifies signed picker arguments and selected-colour persistence.
  • Verifies runtime-state file updates.
  • Tests cancellation and native picker failure.
  • Confirms every generated popup-menu object is disposed exactly once.
  • Removed redundant Custom-only dispatch and unsuccessful deferred-picker code.
  • Synchronised the project and standalone Enhanced Sample Library colour helpers.

Documentation and package updates

  • Revised the main README.
  • Replaced the main and Album Notes screenshots with WebP assets.
  • Updated validation tooling and static checks.
  • Refreshed the supplied maintainer-exported FCL.
  • Updated the evergreen GitHub Wiki for the current implementation.
  • Consolidated the Custom colour investigation into one concise history entry rather than listing each superseded test build separately.

Compatibility and upgrading

Merge the new package over the previous installation and restart foobar2000.

Existing:

  • Panel properties
  • Bottom-area colours
  • Divider colours
  • Runtime state
  • Playlist settings
  • Album Art selections
  • Display settings
  • Caches and source preferences

are retained.

No panel-script reimport is required for the functional changes.

The supplied FCL has been refreshed. Importing it is optional for existing installations, but it can be used when creating a new layout or when you want the latest maintainer-exported panel configuration.

Validation

The completed release passed the expanded release-hardening suite:

  • 200 project files audited
  • Zero validation warnings
  • JavaScript preprocessing and syntax validation passed
  • Rendering-cache and row-reuse tests passed
  • Control-panel resize-reuse tests passed
  • Direct Dot Matrix sprite rendering tested
  • InfoStack render-model caching tested
  • Queue Viewer scan-budget and selection tests passed
  • Lazy Album Art blur lifecycle tested
  • Display API compatibility validated
  • Real DarkOne Tools menu hierarchy tested
  • Custom background and divider colour selection tested
  • Signed native colour-picker arguments tested
  • Picker cancellation and failure behaviour tested
  • Runtime-state persistence tested
  • Exactly-once popup disposal tested
  • Compatibility mirrors verified
  • Clean extracted archive passed the full validator
  • No runtime, temporary, backup or compiled files included
  • ZIP integrity and archive-path safety passed

Tested with:

  • foobar2000 v2.25.10 x64 portable
  • JScript Panel 3.8.5
  • JSplitter 4.1.12

DarkOneJSP3 v0.9.29 - Unified Derriere ∞

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 06 Aug 09:59

DarkOneJSP3 v0.9.29

This release consolidates the improvements developed from v0.9.20 through v0.9.29, with a strong focus on Album Art responsiveness, unified bottom-area appearance controls, Display/Waveform integration, cross-component synchronisation, factory-reset reliability and release hardening.

Album Art performance

Mouse-wheel navigation through Album Art types has been optimised to prevent repeated synchronous image decoding while scrolling.

  • Added an 80 ms trailing debounce to mouse-wheel artwork selection.

  • Rapid wheel movement now loads only the final selected artwork.

  • Avoids decoding and converting intermediate images that are never displayed.

  • Writes the selected artwork type only after wheel activity settles.

  • Preserves immediate keyboard and context-menu selection.

  • Cancels pending artwork changes when:

    • The track or metadata changes
    • Another immediate selection occurs
    • The script reloads or unloads
  • Avoids unnecessary reloads when a complete wheel cycle returns to the currently displayed artwork.

  • Explicitly disposes active normal and blurred Direct2D bitmaps during script unload.

  • Updated the sample identity to:

    Album Art - Enhanced v0.1.0
    

Shared bottom-area appearance controls

Added one shared appearance configuration for the complete lower interface.

Available from any of the three bottom JScript panels:

DarkOne Tools
└── Appearance
    ├── Bottom area background
    └── Bottom area side divider colour

Bottom area background

One setting now controls:

  • Bottom-left control panel
  • Bottom-right control panel
  • Centre Display panel
  • Bottom Controls JSplitter backing
  • Display/Waveform JSplitter host when Automatic is selected
  • Exposed lower-left, spacer and hidden-waveform regions

Available modes:

  • Transparent / inherit parent
  • Black
  • DarkOne grey
  • DarkOne dark grey
  • Columns UI global background
  • Custom colour

The default remains:

DarkOne grey — #202020

Bottom area side divider colour

One setting controls both lower vertical side-divider strips.

Available modes:

  • Transparent / inherit background
  • Black
  • DarkOne grey
  • DarkOne dark grey
  • Columns UI global background
  • Custom colour

The default remains:

DarkOne dark grey — #181818

The Quick Search border and interior remain independent and unchanged.

Unified inherited appearance

The previous literal transparency behaviour exposed different native JScript Panel and JSplitter surfaces, producing inconsistent shades across the bottom area.

Transparent / inherit parent now resolves uniformly to:

#181818
DOJSP3.colours.separator

This resolved inherited colour is applied consistently across:

  • All three bottom JScript panels
  • Bottom Controls backing
  • Display/Waveform host
  • Display track-information caches
  • Inactive Display elements
  • Exposed areas beneath transparent divider strips

The complete background mapping is now:

Transparent / inherit parent → #181818
Black                        → #000000
DarkOne grey                 → #202020
DarkOne dark grey            → #181818
Columns UI global background → current Columns UI background
Custom colour                → selected custom colour

Display/Waveform Host background

Added:

Automatic - Bottom area background

as the default Display/Waveform Host background mode.

Automatic follows the effective shared Bottom area background, including:

  • Transparent / inherited colour
  • Black
  • DarkOne grey
  • DarkOne dark grey
  • Columns UI global background
  • Custom colour

All existing fixed Host background modes remain available and retain their original property values.

Existing installations with an explicitly saved Host background will keep that selection. Choose Automatic once to enable shared synchronisation.

Cross-component synchronisation

JScript Panel 3 and JSplitter do not share a reliable cross-component notification domain, so the shared appearance system now uses a small runtime state bridge.

Persistent state is stored at:

js_data\darkonejsp3.bottom-area-state.txt
  • The three JScript panels communicate immediately through their shared JScript Panel notification domain.
  • The Bottom Controls JSplitter is the sole continuous file poller.
  • Visible appearance changes are checked every 100 ms.
  • Average JSplitter update delay is approximately 50 ms.
  • No additional Display/Waveform poller is required.
  • Existing state from older test builds is migrated automatically.
  • Runtime state files are excluded from release packages and source control.

Factory-reset hardening

Factory reset now reaches both JScript Panel and JSplitter-owned settings.

A short-lived reset-command bridge is used:

js_data\darkonejsp3.reset-command.txt
  • The Bottom Controls host consumes the command.
  • It rebroadcasts the reset inside the JSplitter notification domain.
  • Commands use unique identifiers.
  • Expired or duplicate commands are rejected.
  • Reset commands are checked every 500 ms.
  • Processed command files are removed or cleared.
  • Write failures are logged instead of failing silently.
  • Appearance and behaviour reset scopes are now classified correctly.

The following option is now correctly treated as behaviour:

Force blank waveform when playback stops

Runtime and efficiency hardening

  • Reduced the shared-state system from four continuous pollers to one.
  • Prevented repeated state-file reads during window resizing.
  • Applied persisted colours unconditionally before the first panel paint.
  • Removed duplicate appearance updates and unnecessary repaints.
  • Divider-only changes no longer rebuild:
    • Button colours
    • Volume-knob resources
    • Display text caches
  • Removed obsolete JSplitter notification plumbing from the earlier experimental implementation.
  • Removed unused JScript polling and snapshot code.
  • Aligned background-menu command mappings across shared helpers.
  • Added diagnostics for both exceptions and failed WriteTextFile() results.
  • Added one delayed retry for failed bottom-area state writes.
  • Kept runtime-generated files outside the maintained project source tree.

Compatibility

No Columns UI layout changes are required.

Existing:

  • Panel properties
  • Colours
  • Caches
  • Scroll settings
  • Album Art selections
  • Display/Waveform settings

are retained.

No panel-script reimport is required for the shared bottom-area changes.

To display the updated Album Art sample name and version in the foobar2000 console, manually load:

user-components-x64/foo_jscript_panel3/samples/Album Art.txt

The supplied FCL has been updated.

Documentation

The GitHub Wiki has been updated for v0.9.29 with:

  • Album Art performance guidance
  • Shared bottom-area appearance controls
  • Automatic Display/Waveform background behaviour
  • Unified inherited-colour behaviour
  • Runtime state architecture
  • Factory-reset bridge details
  • Updated troubleshooting
  • Expanded FAQ content
  • Complete release history through v0.9.29
  • JSplitter 4.1.12 references

Validation

The completed release passed an expanded hardening suite:

  • 200 project files audited
  • Zero validation warnings
  • All six background modes tested across JScript Panel and JSplitter hosts
  • Full divider-colour mode coverage
  • First-paint persistence tested
  • Restart persistence tested
  • Isolated JScript Panel and JSplitter communication tested
  • One-time panel initialisation tested
  • Repeated-resize behaviour tested
  • Divider-only update efficiency tested
  • Automatic and fixed Display/Waveform modes tested
  • Transparent inherited rendering tested
  • Factory-reset propagation tested across both component hosts
  • Appearance and behaviour reset scopes tested
  • Expired and duplicate reset commands tested
  • State-write failure and retry handling tested
  • 100 ms appearance and 500 ms reset cadence tested
  • Album Art wheel debounce tested
  • Album Art unload bitmap disposal tested
  • Clean extracted archive passed the complete validator
  • All packaged files matched the validated source tree
  • No runtime state, reset-command, temporary or compiled files included
  • ZIP integrity and archive-path safety passed

Tested successfully with:

  • foobar2000 v2.25.10 x64 portable
  • JScript Panel 3.8.5
  • JSplitter 4.1.12

DarkOneJSP3 v0.9.20 - Artwork in the Rapids 🎨🌊

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 04 Aug 12:47

DarkOneJSP3 v0.9.20

This release improves Album Art navigation performance by preventing rapid mouse-wheel input from repeatedly decoding and converting every intermediate artwork image.

Album Art improvements

  • Added an 80 ms trailing debounce to mouse-wheel artwork selection.

  • Rapid wheel movement now loads only the final selected artwork after scrolling settles.

  • Avoids repeatedly decoding and converting intermediate images that are never displayed.

  • Reduces temporary interface lag when cycling through:

    • Front cover
    • Back cover
    • Disc artwork
    • Artist artwork
    • Icon artwork
  • Writes the selected artwork-type property only once after wheel activity stops.

  • Avoids an unnecessary reload when a complete wheel cycle returns to the currently displayed artwork.

  • Keeps keyboard and context-menu artwork selection immediate.

  • Cancels pending wheel operations when:

    • The track or metadata changes
    • Another immediate artwork selection occurs
    • The script reloads or unloads
  • Added matching unload protection to all bundled samples that use the shared Album Art implementation.

  • Updated the sample identity to:

    Album Art - Enhanced v0.1.0
    

Compatibility

The supplied FCL has been updated to use the latest Album Art sample.

For the simplest upgrade path, import the updated:

DarkOneJSP3/fcl/DarkOneJSP3.fcl

Alternatively, keep your existing layout and manually load the updated:

user-components-x64/foo_jscript_panel3/samples/Album Art.txt

Existing Album Art settings and saved artwork selections are retained.

Validation

The completed release passed the following checks:

  • 199 project files audited
  • Zero validation warnings
  • Rapid wheel-burst behaviour tested
  • Final artwork selection tested
  • Saved property writes tested
  • Keyboard navigation tested
  • Context-menu selection tested
  • Metadata-change cancellation tested
  • Script-unload cleanup tested
  • Full-cycle no-op behaviour tested
  • Clean archive extraction passed
  • All packaged files matched the validated source tree
  • ZIP integrity test passed

DarkOneJSP3.fcl has been updated.

DarkOneJSP3 v0.9.19 - Simply Sound Samples 📢

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 03 Aug 15:46

DarkOneJSP3 v0.9.19

This release introduces a major compatibility improvement for the enhanced JScript Panel 3 sample library, followed by extensive release hardening and expanded documentation.

The enhanced samples supplied with DarkOneJSP3 can now be installed and used independently by other foobar2000 themes without requiring the main DarkOneJSP3 project directory.

Enhanced Sample Library

The upgraded JScript Panel samples now store their reusable dependencies directly inside:

user-components-x64\foo_jscript_panel3\

They retain their established filenames, module paths, constructors, callbacks and saved property keys, allowing existing themes and older saved panel entries to continue using the enhanced implementations.

DarkOneJSP3 and compatible third-party themes can therefore share the same maintained sample library without requiring separate theme-specific forks.

Standalone improvements include:

  • Enhanced Album Notes and MusicBrainz functionality
  • Improved JS Playlist and Smooth Playlist Manager implementations
  • Enhanced scripted Queue Viewer
  • Updated Properties and Last.fm panels
  • Shared performance scheduling and UI cadence controls
  • Component-local colour and page-background handling
  • Standalone reset support
  • Backwards compatibility for older saved entry scripts
  • Compatibility aliases for existing DarkOneJSP3 properties and notifications

Changes since v0.9.16

Standalone sample compatibility

  • Moved reusable sample infrastructure into the JScript Panel component directory.

  • Removed mandatory sample imports from the separate DarkOneJSP3 project directory.

  • Added component-local shared helpers for:

    • Performance management
    • UI update cadence
    • Colour handling
    • Sample defaults
    • Reset integration
  • Preserved existing sample filenames, internal paths, constructors and callback behaviour.

  • Preserved the existing DARKONEJSP3.*, JSPLAYLIST.* and SMOOTH.* property namespaces.

  • Added guarded helper fallbacks through helpers.txt for older themes and saved panel entries.

  • Preserved the existing:

    darkonejsp3_page_background: true

    option as a compatibility alias.

  • Added the neutral standalone replacement:

    enhanced_page_background: true
  • Generalised applicable sample and networking identities to JSP3 Enhanced Samples.

  • Removed a hidden generic _panel context-menu dependency on the enhanced colour helper.

Reset compatibility and safety

  • Added the neutral standalone reset notification:

    JSP3Enhanced.Reset.Properties
    
  • Preserved support for the existing:

    DarkOneJSP3.Reset.Properties
    
  • Added a self-contained legacy reset adapter for panels retaining pre-v0.9.17 entry scripts.

  • Restored reset support for all migrated sample roles:

    • Album Notes
    • MusicBrainz
    • JS Playlist
    • Smooth Playlist Manager
    • Queue Viewer
    • Properties
    • Last.fm Biography
    • Last.fm Artist Information
  • Separated sample defaults from DarkOneJSP3 layout and controller defaults.

  • Ensured malformed reset scopes are ignored rather than being interpreted as complete resets.

  • Ensured unknown reset roles do not alter properties or unnecessarily reload panels.

  • Applied the same reset protections across:

    • Standalone enhanced samples
    • DarkOneJSP3 JScript Panel scripts
    • JSplitter controllers

Shared helper and runtime hardening

  • Reordered current script imports so the canonical performance and UI-cadence helpers are used directly.

  • Retained the guarded copies inside helpers.txt strictly as compatibility fallbacks.

  • Removed redundant network coordinator imports from:

    • Album Notes
    • MusicBrainz
    • AllMusic Review
    • AllMusic Review + Album Art
  • Fixed optional profiler timer resets when native JScript Panel methods are exposed as COM methods.

  • Preserved compatibility with unchanged sample entry text stored inside existing panel configurations.

  • Confirmed that no executable enhanced sample entry requires:

    %fb2k_profile_path%DarkOneJSP3
    

Documentation

  • Added a dedicated Enhanced Sample Library section to the main README.

  • Added a direct link to the standalone integration guide:

    DarkOneJSP3/docs/ENHANCED_SAMPLES.txt
    
  • Expanded the README with:

    • Standalone installation guidance
    • Compatibility guarantees
    • Benefits for other foobar2000 themes
    • Upgrade and backup guidance
    • Updated repository structure
    • Revised asset descriptions
  • Added the Enhanced Sample Library guide to the main documentation index.

  • Added validator checks requiring the README section and guide link to remain present.

Validation and release hardening

  • Added component-only validation that stages the enhanced sample tree without the DarkOneJSP3 directory.
  • Added recursive preprocessing and JavaScript syntax checks for current sample entries.
  • Added recursive preprocessing and syntax checks for legacy saved entries.
  • Added reset execution tests for every migrated sample role.
  • Added tests for malformed scopes and unknown reset roles.
  • Added source-mirror and generated-adapter synchronisation checks.
  • Added combined preprocessor syntax validation for imported source trees.
  • Added clean archive extraction and source-to-package hash comparison.
  • Added README documentation consistency checks.
  • Confirmed that all packaged files match the validated source tree.

Compatibility

No Columns UI layout changes are required.

Existing panel properties, colours, caches, scrolling preferences and sample settings are retained.

Panels containing older saved sample entry scripts remain supported. Re-importing the supplied current sample entries is recommended to receive the latest metadata and import structure, but it is not required for continued operation.

The included DarkOneJSP3.fcl remains unchanged and is not modified or regenerated by the project tooling.

Before upgrading, back up:

DarkOneJSP3\
user-components-x64\foo_jscript_panel3\samples\
user-components-x64\foo_jscript_panel3\helpers.txt

This is particularly important when another installed theme contains locally modified versions of the original JScript Panel sample files.

Validation

The completed release passed the following checks:

  • 195 project files audited
  • 43 current panel entries recursively preprocessed
  • 7 legacy panel entries recursively preprocessed
  • All migrated sample reset roles tested
  • JavaScript syntax validation passed
  • Python maintenance-tool validation passed
  • Component-only sample staging passed
  • Source mirrors and generated compatibility adapters verified
  • Clean archive extraction passed
  • All packaged files matched the validated source tree
  • ZIP integrity test passed
  • Zero validation warnings

The completed build was also tested successfully in a live foobar2000 v2.25.10 x64 portable installation using:

  • JScript Panel 3.8.5
  • JSplitter 4.1.12

All panels initialised successfully, all tested features worked correctly, and no JavaScript or component errors were reported.

DarkOneJSP3 v0.9.16 - Jumping Jack 🤸

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 02 Aug 07:06

DarkOneJSP3 v0.9.16 — JS Playlist Rating Navigation Fix

DarkOneJSP3 v0.9.16 is a focused hotfix for JS Playlist.

Fixed: playlist jumping after rating a track

Clicking a rating star could cause the visible playlist to jump immediately to whichever track had previously been highlighted or focused.

The rating action itself was not changing the selection. Writing the rating triggered a metadata-change callback, which rebuilt the playlist data and recalculated the visible position around the existing focused track.

Metadata-only refreshes now:

  • preserve the current playlist scroll position;
  • update the selected rating immediately;
  • retain the existing track selection and keyboard focus;
  • safely clamp the preserved position if grouping or row counts change.

Structural playlist changes—including adding, removing, reordering or switching playlists—continue to use the existing focus-aware scrolling behaviour.

Validation

Additional regression coverage now confirms that metadata-only updates do not invoke the viewport-recentring path.

Final release verification completed successfully:

  • 188 audited files;
  • zero warnings;
  • ZIP integrity test passed;
  • clean re-extraction passed the complete validation suite;
  • bundled DarkOneJSP3.fcl has been updated.

Upgrade notes

Back up your active foobar2000 profile before upgrading.

Merge the updated DarkOneJSP3 files into the profile location used by your installation, allowing the supplied files to replace the previous versions.

Because JScript Panel scripts may already be embedded in existing panel instances, users should either:

  1. import the newly bundled DarkOneJSP3.fcl; or
  2. manually re-import the updated JS Playlist sample into the existing panel.

The affected sample is:

DarkOneJSP3\jscript\samples\JS Playlist.txt

Users retaining their existing Columns UI layout can manually update only the JS Playlist panel rather than importing the complete FCL.

After updating, reload the JS Playlist panel or restart foobar2000 so the revised script is compiled.

Important notice

DarkOneJSP3 is an unofficial community continuation. It is not an official release by tedGo, marc2003, Br3tt/Falstaff, dima-lur, Peter Pawlowski or the authors of the third-party components it uses.

Preserve all existing author headers, credits and third-party licence notices.

DarkOneJSP3 is supplied without warranty. Back up your foobar2000 profile before installation or upgrade.

DarkOneJSP3 v0.9.15 - Put a sock in it 🧦

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 01 Aug 18:37

DarkOneJSP3 v0.9.15 — Volume Interaction and Stability Update

DarkOneJSP3 v0.9.15 is a focused stability and interaction update over v0.9.8.

This release improves volume-knob responsiveness, prevents volume dragging from interrupting the Enhanced Spectrum Analyser, adds matching custom refresh controls to Playlist Manager, and resolves several Display and scheduler regressions discovered during testing.

Volume-knob performance

Rapid volume dragging previously assigned fb.Volume on every raw mouse-movement callback. Each assignment triggered global volume-change callbacks across multiple panels, which could intermittently pause the Enhanced Spectrum Analyser.

Volume handling is now coalesced:

  • the first drag value is applied immediately;
  • intermediate volume writes are limited to a protected minimum cadence of 16 ms;
  • the exact final value is applied when the mouse button is released;
  • duplicate callback-driven repaints are suppressed while dragging;
  • the knob preview remains visually responsive without flooding the foobar2000 message loop.

This preserves smooth interaction while allowing native visualisers to continue updating reliably.

Adaptive volume preview cadence

The volume knob now includes:

Volume drag refresh rate
├── Automatic
├── 8 ms
├── 10 ms
├── 12 ms
└── 16 ms

Automatic mode

Automatic mode follows the fastest currently configured refresh interval reported by:

  • JS Playlist
  • Smooth Playlist Manager

For example:

JS Playlist:          8 ms
Playlist Manager:    16 ms
Volume preview:       8 ms

The selected cadence controls:

  • volume-knob preview repainting;
  • Centre Display volume repainting.

Actual fb.Volume assignments retain the safe 16 ms minimum to prevent visualiser stalls.

Manual options remain available when a fixed preview cadence is preferred.

Factory reset restores Automatic mode.

Playlist Manager refresh controls

Smooth Playlist Manager now matches JS Playlist more closely by supporting:

  • 8 ms
  • 10 ms
  • 12 ms
  • 16 ms
  • Set custom refresh interval...

The supported custom ranges are:

JS Playlist:          7–40 ms
Smooth Playlist Manager: 8–40 ms

Changes apply immediately to the active frame loop without reloading the panel.

Automatic screen-refresh detection was removed because the required display information was not reported reliably on all systems. Both playlist panels now use explicit user-selected refresh intervals.

Volume-knob interaction fix

A single click on the volume knob previously left it visually selected for approximately three seconds.

The knob’s active appearance was incorrectly tied to the same state used to keep the Centre Display volume readout visible after a volume change.

These states are now independent:

  • holding the mouse button keeps the knob active;
  • releasing the mouse button deselects it immediately;
  • the Centre Display may continue showing the changed volume for three seconds;
  • wheel, menu and external volume changes do not make the knob appear pressed.

Display and Dot Matrix fixes

Restored Dot Matrix inheritance

A later volume-rendering optimisation accidentally removed the prototype links used by the Dot Matrix image classes.

This caused errors such as:

Object doesn't support property or method 'isDrawDigit'

The inheritance links for the track number, time and bitrate image classes have been restored.

Validation now instantiates each Dot Matrix class and exercises its inherited rendering lifecycle so the same regression cannot pass unnoticed again.

Correct image roles retained

The Display continues to use the correct rendering paths:

  • mutable off-screen Dot Matrix composition uses IJSImage;
  • final panel output uses cached IJSBitmap resources.

This preserves the Direct2D performance improvements introduced in earlier releases.

Scheduler cleanup fix

The volume-knob cleanup code incorrectly called:

preview_repaint.stop();

The shared repaint scheduler exposes:

preview_repaint.cancel();

All affected cleanup paths now use the correct method:

  • mouse button release;
  • mouse leaving the panel during a drag;
  • panel disposal.

Validation now rejects incorrect .stop() calls on repaint schedulers.

Documentation updates

The Configuration Guide and troubleshooting documentation now cover:

  • Playlist Manager custom refresh intervals;
  • volume-drag refresh-rate controls;
  • Automatic volume preview behaviour;
  • the protected 16 ms audio-write cadence;
  • visualiser performance guidance;
  • manual cadence overrides.

Validation and hardening

The validator now includes regression coverage for:

  • coalesced volume writes;
  • exact final-value flushing;
  • adaptive preview cadence;
  • custom Playlist Manager intervals;
  • repaint-scheduler cleanup;
  • Dot Matrix prototype inheritance;
  • volume-knob pressed-state behaviour;
  • suppression of redundant volume repaints;
  • visualiser-safe write cadence.

Final release verification completed successfully:

  • 188 audited files
  • Zero warnings
  • ZIP integrity test passed
  • Clean re-extraction passed the complete validation suite
  • DarkOneJSP3.fcl remains manually maintained and is not modified by project tooling

Upgrade notes

Back up your active foobar2000 profile before upgrading.

Merge the supplied DarkOneJSP3 and user-components-x64 directories into the same profile location used by your existing installation, allowing the updated files to replace the previous versions.

The new volume and refresh-rate settings are available through the relevant panel context menus.

Important notice

DarkOneJSP3 is an unofficial community continuation. It is not an official release by tedGo, marc2003, Br3tt/Falstaff, dima-lur, Peter Pawlowski or the authors of the third-party components it uses.

Preserve all existing author headers, credits and third-party licence notices.

DarkOneJSP3 is supplied without warranty. Back up your foobar2000 profile before installation or upgrade.

DarkOneJSP3 v0.9.8 - Red Bull Edition ⚡

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 01 Aug 10:31

DarkOneJSP3 v0.9.8 — Performance, Stability and Documentation Update

DarkOneJSP3 v0.9.8 is a substantial maintenance and optimisation update over v0.8.2.

This release improves JS Playlist and Playlist Manager performance, modernises several rendering paths, resolves smooth-scrolling and Display regressions discovered during testing, and significantly expands the project documentation.

A refreshed DarkOneJSP3.fcl is included and should be re-imported when upgrading from an earlier release.

Performance improvements

Demand-driven scrolling and repainting

JS Playlist and Smooth Playlist Manager no longer rely on permanent high-frequency repaint loops while idle.

Timers now:

  • start only when scrolling or animation is required;
  • stop automatically when movement is complete;
  • coalesce duplicate repaint requests;
  • preserve pending updates while a panel is hidden; and
  • resume correctly when the panel becomes visible.

This reduces unnecessary timer activity and idle CPU usage while retaining smooth movement on high-refresh-rate displays.

JS Playlist render cache

JS Playlist now includes a bounded render cache for frequently evaluated row information, including:

  • primary column output;
  • optional secondary-line output;
  • rating and loved-state data;
  • playback-dependent values;
  • queue-related information; and
  • streaming and dynamic metadata.

The cache is invalidated selectively when playlists, metadata, playback state, queue contents or formatting settings change.

This substantially reduces repeated title-format evaluation while scrolling through large playlists.

Direct2D bitmap caching

Frequently rendered artwork and sprite resources are now converted to reusable Direct2D bitmap objects where appropriate.

Optimised resources include:

  • playlist album covers;
  • fallback artwork;
  • playlist logos;
  • control-panel button sheets;
  • Display matrix sprites;
  • Display status icons;
  • tinted accent sprites; and
  • rendered Dot Matrix values.

Mutable off-screen images continue using the correct JScript Panel image type where required.

Additional rendering improvements

  • JS Playlist column geometry is cached until the layout changes.
  • Playlist Manager caches autoplaylist and locked-playlist state.
  • Display label measurements and static render data are reused.
  • Safe row-local repainting is used where a full panel repaint is unnecessary.
  • Optional internal paint profiling is available for diagnostic testing.

Smooth-scrolling improvements

Several issues discovered during real-world testing have been corrected.

Refresh-rate settings

The selected smooth-scroll refresh rate now applies immediately and consistently to both:

  • JS Playlist; and
  • Smooth Playlist Manager.

Supported presets remain:

  • 8 ms
  • 10 ms
  • 12 ms
  • 16 ms

Custom values remain supported within the documented ranges.

Changing the refresh rate while scrolling now rebuilds or reschedules the active animation without losing its current target.

JS Playlist wheel scrolling

JS Playlist now uses the same demand-driven frame-loop architecture as Playlist Manager rather than raw interval timers.

Each frame performs the complete sequence:

wait for the selected interval
→ update the scroll position
→ repaint
→ schedule the next frame

This makes 8 ms and 16 ms scrolling visually and functionally distinct while retaining smooth easing.

Scrollbar dragging

Scrollbar dragging now uses its own continuous frame loop and latest-target model.

This allows the playlist to render intermediate positions between mouse-movement callbacks, meaning the selected 8, 10, 12 or 16 ms rate genuinely controls drag smoothness.

The revised implementation supports:

  • row-snapped dragging;
  • continuous free-position dragging;
  • exact final positioning when the mouse button is released;
  • immediate dragging when smooth scrolling is disabled;
  • live refresh-rate changes during an active drag; and
  • complete timer shutdown when movement finishes.

Display fixes

Dot Matrix display style

Fixed an issue where selecting Dot Matrix from the Display Style menu did not visibly change the Display.

The optimised rendering paths are now correctly separated:

  • mutable off-screen Dot Matrix composition uses IJSImage; and
  • final panel rendering uses cached IJSBitmap resources.

Changing Display Style now:

  • validates and saves the selected style;
  • rebuilds style-specific render resources;
  • refreshes the current display values; and
  • repaints immediately.

Native JScript Panel method handling

JScript Panel native API methods can report their JavaScript type as unknown rather than function.

The performance helpers now call native methods safely through try/catch, covering:

  • CreateBitmap()
  • LoadBitmap()
  • LoadImage()
  • Dispose()
  • CreateProfiler()

This resolves the type-mismatch errors previously seen in JS Playlist artwork and Display rendering.

Documentation improvements

The Configuration Guide has received a complete audit against the user-facing context menus and settings available throughout the supported layout.

New or expanded coverage includes:

  • Playlist Manager row and empty-area menus;
  • playlist filtering and appearance controls;
  • JS Playlist track and empty-area context menus;
  • playlist header options;
  • the complete JS Playlist Panel Settings interface;
  • InfoStack empty-area context menus;
  • Biography and Last.fm page menus;
  • Album Notes and MusicBrainz controls;
  • Properties page controls;
  • optional scripted Queue Viewer settings;
  • left and right control-panel menus;
  • optional button configuration;
  • button style, depth and roundness;
  • volume-knob settings;
  • DarkOne Tools;
  • Album Art;
  • Display;
  • Waveform host;
  • Quick Search Toolbar; and
  • Enhanced Spectrum Analyser ownership boundaries.

Formatting checks now ensure Configuration Guide headings remain properly separated from surrounding lists and paragraphs.

Standard and portable installation paths

The README and Installation Guide now explicitly document both standard and portable foobar2000 installations.

Standard installation

For a normal non-portable foobar2000 installation, the active profile is normally located at:

%APPDATA%\foobar2000-v2\profile\

This usually expands to:

C:\Users\<username>\AppData\Roaming\foobar2000-v2\profile\

Install the supplied folders so the resulting paths are:

%APPDATA%\foobar2000-v2\profile\DarkOneJSP3\
%APPDATA%\foobar2000-v2\profile\user-components-x64\foo_jscript_panel3\samples\

You can paste the following directly into the File Explorer address bar:

%APPDATA%\foobar2000-v2\profile

Portable installation

Portable installations may use either the installation root:

<foobar2000>\DarkOneJSP3\
<foobar2000>\user-components-x64\foo_jscript_panel3\samples\

or a profile subfolder:

<foobar2000>\profile\DarkOneJSP3\
<foobar2000>\profile\user-components-x64\foo_jscript_panel3\samples\

Use the structure already used by your foobar2000 installation. Do not install the files into more than one profile location.

Diagnostic settings

The following optional properties are available through the relevant panel’s Configure... property editor:

JSPLAYLIST.Enable Render Cache
JSPLAYLIST.Render Cache Rows
JSPLAYLIST.Enable Performance Profiling
SMOOTH.Enable Performance Profiling

Performance profiling is disabled by default.

Validation and hardening

The release validator now includes additional checks for:

  • demand-driven scheduler behaviour;
  • timer shutdown and rescheduling;
  • live refresh-rate changes;
  • wheel and scrollbar-drag cadence;
  • bitmap creation and disposal;
  • Dot Matrix display switching;
  • render-cache invalidation;
  • hidden-panel repaint recovery;
  • Configuration Guide menu coverage;
  • documentation formatting;
  • required runtime files and artwork;
  • manifest consistency; and
  • compatibility mirrors.

Final release verification completed successfully:

  • 187 audited files
  • Zero warnings
  • ZIP integrity test passed
  • Clean re-extraction passed the complete validation suite

DarkOneJSP3.fcl remains manually maintained and is excluded from automated auditing and modification by project tooling.

Compatibility and upgrade notes

This release includes updated JScript Panel scripts and a newly exported:

DarkOneJSP3\fcl\DarkOneJSP3.fcl

Although some existing saved properties may continue to work, panel settings and configuration values from earlier releases should not be assumed to be fully compatible with v0.9.8.

Before upgrading:

  1. Back up your active foobar2000 profile.
  2. Export or record any personal Columns UI layout changes you wish to keep.
  3. Merge the supplied DarkOneJSP3 and user-components-x64 directories into the profile location used by your installation.
  4. Import the newly packaged DarkOneJSP3.fcl.
  5. Reapply any personal layout or panel customisations where required.

Re-importing the supplied FCL is recommended to ensure that the updated JScript Panel scripts, panel assignments and layout configuration are applied consistently.

Importing the FCL may replace your existing Columns UI layout and panel configuration. Users upgrading from an earlier release should therefore treat v0.9.8 as a refreshed layout and configuration baseline rather than a completely drop-in update.

Some component-level preferences may remain in place independently of the imported layout.

Important notice

DarkOneJSP3 is an unofficial community continuation. It is not an official release by tedGo, marc2003, Br3tt/Falstaff, dima-lur,...

Read more

DarkOneJSP3 v0.8.2 - Cue the Queue Viewer 🔭

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 26 Jul 19:13

DarkOneJSP3 v0.8.2 — Queue Viewer Improvements

DarkOneJSP3 v0.8.2 improves the bundled scripted Queue Viewer and updates the recommended queue configuration.

The native Queue Viewer component is now the recommended option because it provides complete queue editing, including adding, removing and reordering entries. The supplied JScript Panel Queue Viewer remains available as a lightweight alternative with improved navigation and source-item tools.

Scripted Queue Viewer improvements

The optional scripted Queue Viewer now supports:

  • Click to select an individual entry
  • Ctrl+click to toggle entries
  • Shift+click to select a range
  • Ctrl+Shift+click to add a range
  • Ctrl+A to select all entries
  • Up and Down selection navigation
  • Shift+Up and Shift+Down range extension
  • Home and End navigation
  • Page Up and Page Down navigation
  • Enter or double-click to show the source playlist item
  • Escape to clear the current selection

Selections are retained across queue rescans where matching source playlist items remain available.

New row commands

The Queue Viewer context menu now includes:

  • Show source playlist item
  • Play source item now
  • Open containing folder
  • Properties
  • Copy item title
  • Copy selected item titles
  • Copy file path
  • Copy selected file paths
  • Re-scan playback queue
  • Configure title formatting

Commands that depend on a valid source playlist item are disabled automatically when the source is no longer available.

Native Queue Viewer recommended

The native Queue Viewer component is now listed as a required component and is the recommended implementation for the DOJSP3.Queue panel.

It provides the complete queue-management experience, including:

  • adding queue entries;
  • removing queue entries;
  • drag-and-drop reordering; and
  • full multi-selection editing.

The bundled JScript Panel Queue Viewer cannot directly modify the playback queue because the required queue-mutation functions are no longer exposed by current versions of JScript Panel 3.

It remains available for users who prefer a lightweight scripted view with navigation, playback and source-item commands.

Documentation updates

The revised queue guidance has been applied throughout:

  • README
  • Installation Guide
  • Layout and Panel Map
  • Configuration Guide
  • Troubleshooting Guide
  • Documentation index
  • Validation Report
  • Changelog

Validation

This release also adds regression coverage for:

  • multi-selection;
  • keyboard navigation;
  • range selection;
  • clipboard commands;
  • source playlist navigation;
  • playback commands;
  • Properties integration;
  • selection restoration after queue rescans; and
  • prevention of unsupported queue APIs returning to the script.

Final verification completed successfully:

  • 185 audited files
  • Zero warnings
  • Compatibility mirror synchronised
  • ZIP integrity test passed
  • Clean re-extraction passed the complete validation suite
  • DarkOneJSP3.fcl has been updated

Upgrade notes

Back up your active foobar2000 profile before upgrading.

Merge the supplied DarkOneJSP3 and user-components-x64 directories into the same profile location used by your existing installation, allowing the updated files to replace the previous versions.

Existing saved settings remain compatible.

Important notice

DarkOneJSP3 is an unofficial community continuation. It is not an official release by tedGo, marc2003, Br3tt/Falstaff, dima-lur, Peter Pawlowski or the authors of the third-party components it uses.

Preserve all existing author headers, credits and third-party licence notices.

DarkOneJSP3 is supplied without warranty. Back up your foobar2000 profile before installation or upgrade.

DarkOneJSP3 v0.8.1 - Fetch The Broom! 🧹

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 26 Jul 13:33

DarkOneJSP3 v0.8.1 — Consolidation and Release Hardening

DarkOneJSP3 v0.8.1 completes the planned code-consolidation work and applies a final post-refactor release-hardening pass.

The update focuses on maintainability, consistency and validation coverage while preserving the established runtime behaviour and saved-setting contracts.

Colour and appearance improvements

The information-area colour system has been expanded and standardised across the theme.

Configurable background palettes are now available for:

  • Biography
  • Last.fm
  • Album Notes
  • Queue
  • Properties
  • InfoStack backing
  • upper side dividers
  • waveform host

Available choices include:

  • Transparent / inherit parent
  • Black
  • DarkOne grey
  • DarkOne dark grey
  • Columns UI global background
  • Custom colour

Additional Columns UI integration is available for:

  • InfoStack tab font colour
  • Display accent colour

Both can follow the active Columns UI selected-item background colour.

Existing saved mode numbers and custom-colour values remain compatible.

Shared colour framework

Repeated colour parsing, normalisation, menu construction and picker handling have been consolidated into shared helpers.

This includes:

  • opaque-colour normalisation;
  • hexadecimal formatting;
  • custom-colour parsing;
  • Columns UI colour retrieval;
  • saved-mode validation;
  • declarative radio-menu construction;
  • JSplitter and JScript Panel colour-picker adapters.

Custom-colour cancellation is now handled consistently and cannot silently activate a previously stored colour.

Shared JSplitter protocols

Startup-transition and side-divider communication have been consolidated into a shared protocol layer.

The shared implementation now handles:

  • notification names;
  • protocol versions;
  • state serialisation and parsing;
  • command parsing;
  • readiness signalling;
  • mode validation;
  • malformed-value rejection.

Property ownership remains unchanged:

  • the Root controller owns startup-transition settings;
  • Main Columns owns side-divider settings;
  • InfoStack continues to provide the corresponding remote menus.

Control-panel consolidation

The shared optional-button menu logic used by the left and right control panels has been extracted into a common helper.

This now centralises:

  • optional-button visibility;
  • command and label setup;
  • command-style re-detection;
  • command-guide access;
  • DarkOne Tools access;
  • button-roundness settings;
  • menu disposal and repaint handling.

The left and right control panels retain their own button layouts, saved properties and panel-specific controls.

InfoStack controller decomposition

The InfoStack controller has been divided into focused helpers for:

  • colour and menu state;
  • startup and side-divider bridges;
  • protocol notifications and command routing.

The main controller now concentrates on:

  • tab layout;
  • responsive sizing;
  • child-panel visibility;
  • active-tab selection;
  • painting;
  • mouse interaction;
  • primary context-menu flow.

Menu IDs, property names, protocol versions and runtime behaviour remain unchanged.

Modular release validator

The release validator has been reorganised into focused modules for:

  • shared validation context;
  • data-driven package expectations;
  • static and metadata checks;
  • runtime and syntax checks.

The existing command remains unchanged:

python DarkOneJSP3/tools/validate_release.py .

Release-hardening improvements

The v0.8.1 hardening pass adds manifest-driven validation for:

  • all six JSplitter controllers;
  • all panel-entry wrappers;
  • scripted panel sources;
  • controller loaders;
  • required runtime artwork;
  • module-version metadata;
  • manifest numbering, titles and script assignments;
  • compatibility mirrors;
  • repository artwork when present.

Validation now correctly fails when required wrappers, scripts or bitmap assets are missing.

The manually maintained DarkOneJSP3.fcl remains excluded from automated validation and is not modified by project tooling.

Compatibility

  • No foobar2000 runtime regression was found during the post-refactor audit.
  • All runtime scripts remain unchanged from the tested v0.8.0 runtime set.
  • Existing property names, saved values, menu IDs, colour modes and notification contracts remain compatible.
  • The canonical repository README and documentation have been retained and updated for this release.

Validation

Final release verification completed successfully:

  • 185 audited files
  • Zero warnings
  • ZIP integrity test passed
  • Re-extracted archive passed the full validation suite
  • FCL excluded from automated auditing

Upgrade notes

Back up your active foobar2000 profile before upgrading.

Merge the supplied DarkOneJSP3 and user-components-x64 directories into the same profile location used by your current installation, allowing the updated files to replace the previous versions.

Your existing saved settings should remain compatible.

Important notice

DarkOneJSP3 is an unofficial community continuation. It is not an official release by tedGo, marc2003, Br3tt/Falstaff, dima-lur, Peter Pawlowski or the authors of the third-party components it uses.

Preserve all existing author headers, credits and third-party licence notices.

DarkOneJSP3 is supplied without warranty. Back up your foobar2000 profile before installation or upgrade.

DarkOneJSP3 v0.7.27 - Nice To See You Again 🎵

Choose a tag to compare

@Pav-Osmolski Pav-Osmolski released this 26 Jul 13:32

DarkOneJSP3 v0.7.27 — Initial Public Release

DarkOneJSP3 v0.7.27 is the first public release of the project and establishes the original stable baseline.

DarkOneJSP3 is an unofficial modern 64-bit continuation of the classic DarkOne foobar2000 theme. It preserves the familiar DarkOne visual identity and workflow while replacing the legacy Panel Stack Splitter architecture with a modern scripted layout built around Columns UI, JSplitter 4.x and JScript Panel 3.

Highlights

  • Modern six-controller JSplitter layout with persistent panel settings.
  • JScript Panel 3 control, display, queue and information panels.
  • Configurable InfoStack tabs, including:
    • custom titles;
    • optional tab visibility;
    • adjustable dimensions;
    • configurable tab colours and backgrounds.
  • Default or custom display accent colour.
  • Consolidated Album Notes panel with:
    • configurable metadata and review providers;
    • source enable/disable controls;
    • source-priority ordering;
    • local caching;
    • diagnostics;
    • MusicBrainz Releases and Links views.
  • Improved playlist scrolling and scrollbar behaviour.
  • Enhanced playlist-manager filtering and position handling.
  • Improved playback-queue detection and display.
  • Configurable control-panel buttons and appearance.
  • Optional startup transitions with native-window reveal hardening.
  • Improved waveform, spectrum and display integration.
  • Expanded factory-reset coverage.
  • Release validation, compatibility-mirror checking and maintenance utilities.
  • Comprehensive installation, configuration, troubleshooting, migration and attribution documentation.

Requirements

  • foobar2000 v2 x64
  • Columns UI
  • JScript Panel 3.8.5
  • JSplitter 4.x, tested with 4.1.11
  • Quick Search Toolbar
  • Enhanced Spectrum Analyser
  • Waveform Minibar (mod)

The supplied scripted Queue Viewer is used by default. The native Queue Viewer component may be used as an optional alternative.

Third-party component binaries are not included.

Installation

Back up your active foobar2000 profile before installing.

Merge the supplied DarkOneJSP3 and user-components-x64 directories into the location used by your active foobar2000 profile.

Depending on your installation, the destination will normally be either:

<foobar2000>\DarkOneJSP3\
<foobar2000>\user-components-x64\foo_jscript_panel3\samples\

or:

<foobar2000>\profile\DarkOneJSP3\
<foobar2000>\profile\user-components-x64\foo_jscript_panel3\samples\

Use the structure already used by your foobar2000 installation. Do not install the files into both locations.

The recommended setup method is to construct the Columns UI hierarchy using the supplied:

DarkOneJSP3\docs\LAYOUT_AND_PANEL_MAP.txt

An optional maintainer-exported layout is also included at:

DarkOneJSP3\fcl\DarkOneJSP3.fcl

The FCL is provided as a convenience only. The documented panel map remains the reference for the supported layout.

Documentation

The release includes:

  • Installation Guide
  • Layout and Panel Map
  • Configuration Guide
  • Troubleshooting Guide
  • Migration Reference
  • Changelog
  • Credits and attribution
  • Validation Report

Important notice

DarkOneJSP3 is an unofficial community continuation. It is not an official release by tedGo, marc2003, Br3tt/Falstaff, dima-lur, Peter Pawlowski or the authors of the third-party components it uses.

Preserve all existing author headers, credits and third-party licence notices.

DarkOneJSP3 is supplied without warranty. Back up your foobar2000 profile before installation or upgrade.