Engine DJ 5.0 under Steam/Proton (wine variant) under Linux - update: now mostly working

@uklotzde do you have the “sync manager” sync to USB drive function working in wine? if so how is it configured? STEAM/PROTON should be pretty much the same, see below for my progress:

Engine DJ 5.0.0 is now largely functional under Steam Proton on Linux with working:

  • accelerated UI rendering

  • FLAC library access

  • database/library loading

  • waveform rendering

  • audio playback

  • track analysis/loading

The remaining unresolved issue is that Sync Manager does not recognize SD cards as removable/export media, even though the card is fully visible and accessible inside Wine/Proton.

Environment:

  • Linux host

  • AMDGPU/Mesa graphics stack

  • Steam Proton

  • Engine DJ 5.0.0

  • music library stored on native Linux filesystem

  • SD card mounted under Linux before launch

Proton version findings:

  • Proton Experimental had major audio-device issues

  • Engine DJ only detected a mono output device

  • playback buttons were disabled

  • no usable output channels were available

Under:

Proton 9.0-4

audio playback works correctly:

  • stereo devices enumerate properly

  • playback works

  • waveform rendering works

  • FLAC loading and analysis work

However, audio initialization under Proton 9.0-4 is inconsistent. A repeatable workaround currently is:

  1. switch compatibility tool to Proton Experimental

  2. launch Engine DJ once

  3. switch compatibility back to Proton 9.0-4

  4. relaunch

This consistently restores correct audio device initialization.

Music library integration:

  • native Linux library directories are exposed into Proton using bind mounts

  • symbolic links did NOT work reliably

  • Engine DJ could not properly traverse symlinked directories under Wine/Proton

  • bind mounts behave correctly and expose the filesystem as expected

Example:

mount --bind /path/to/music \
  ~/.steam/steam/steamapps/compatdata/<appid>/pfx/drive_c/users/steamuser/Music/FLAC

Once bind-mounted:

  • Engine DJ successfully browses tracks

  • FLAC metadata loads correctly

  • tracks load/analyze/play successfully

SD card / Sync Manager issue: The SD card is visible inside Wine/Proton and accessible as a drive letter. Files can be browsed normally from within Engine DJ.

Wine drive mappings currently include:

E:  -> mounted SD card path
E:: -> underlying block device

Example:

e:  -> /media/.../SDCARD
e:: -> /dev/sdg1

This was added manually because Wine/Proton appears to require BOTH mappings for proper volume metadata access.

The following have been attempted:

  • winecfg removable-drive settings

  • changing drive type to “floppy disk”

  • manual registry edits

  • manual system.reg and user.reg edits

  • explicit Wine drive mappings

  • restarting wineserver

  • restarting Steam

  • recreating drive mappings

  • bind mounts instead of symlinks

  • adding underlying block-device mappings (e::)

  • ensuring mounted filesystem is readable

  • testing with Proton 9.0-4 and Proton Experimental

Observed behaviour:

  • Engine DJ sees the SD card as a normal drive

  • internal file browser can browse/read/write files

  • Sync Manager does NOT recognize the drive as removable/export media

  • Engine DJ logs contain:

Call to GetVolumeInformation failed with error code: 0

Wine also reports:

Read access denied for device "\\??\\E:\\", FS volume label and serial are not available.

This strongly suggests Wine/Proton is failing some combination of:

  • removable media semantics

  • volume serial retrieval

  • GetVolumeInformation()

  • Windows removable-drive metadata APIs

Current conclusion: Engine DJ itself is largely functional under Proton 9.0-4 for library management and playback, but removable media detection required for Sync Manager/export workflows remains unresolved.

any ideas? anyone have this working???

I’m wondering ….

Now that several hundred forum members now having votes released back to them with Engine 5.0 granting many user wishes, how many of those users would now spend one of their 10 votes on having a Linux version of Engine.

There could be an unknown number of DJs just waiting to vote for a third platform/version of Engine, but that their votes were locked up on other wishes

even minor changes to the windows version of ENGINE DJ so it worked better under Proton/Wine/etc or running as a VM would be fine by me

UPDATE — Sync Manager now working, here’s how

(edit, removed this post as I restated again with more correct info and additions for audio, in the post below)


UPDATE 2 — Both audio and sync now fully working, here’s the complete solution

Following on from my previous update, the audio issue has also been diagnosed and fixed properly. Both issues are now resolved and confirmed working on Proton 9.0-4 and GE-Proton10-34.


Issue 1: Sync Manager / exFAT SD card — SOLVED

(recap of previous update, now with corrected udev notes)

Four things are required simultaneously:

a) Add your user to the disk group

Wine’s mountmgr reads raw block device superblocks to identify filesystem types. Without block device read access it can’t do this and falls back to reporting NTFS for everything.

sudo usermod -aG disk $USER

Log out and back in. For testing without logging out: newgrp disk then relaunch Steam from within that shell.

b) Map the SD card as drive A: (not any other letter)

Wine hardcodes A: and B: as DRIVE_REMOVABLE regardless of any other configuration. Any other drive letter reports as a fixed disk. Engine DJ’s Sync Manager requires the drive to be flagged removable.

PFXDIR="$HOME/.steam/steam/steamapps/compatdata/<appid>/pfx/dosdevices"
ln -s /media/$USER/YOURCARDLABEL "$PFXDIR/a:"
ln -s /dev/sdX1 "$PFXDIR/a::"

The a:: block device symlink is required for Wine to read the raw superblock. Note: the device node (/dev/sdX) can change depending on USB enumeration order — update the symlink if needed after replugging.

c) Create volume label and serial dotfiles on the card root

echo -n "YOURCARDLABEL" > /media/$USER/YOURCARDLABEL/.windows-label
# Strip the hyphen from the UUID shown by blkid, e.g. UUID 3139-3231 becomes:
echo -n "31393231" > /media/$USER/YOURCARDLABEL/.windows-serial

d) Add a udev rule to prevent Wine auto-assigning a second drive letter

Wine’s udisks2 integration auto-assigns drive letters to removable devices it detects via DBus. Without this rule the card appears twice — once as A: (removable) and once as another letter (fixed) — and Engine DJ may check the fixed one and reject it.

Find your card reader’s serial:

udevadm info /dev/sdX | grep ID_SERIAL=

Create /etc/udev/rules.d/99-enginedj-sdcard.rules:

SUBSYSTEM=="block", ENV{ID_SERIAL}=="your_serial_here", ENV{ID_DRIVE_FLASH_SD}="1", ENV{UDISKS_MEDIA}="flash_sd"

Note: do NOT add UDISKS_IGNORE="1" — this prevents automounting and breaks things. The rule above just sets the media type hint.

sudo udevadm control --reload-rules
sudo udevadm trigger --subsystem-match=block --action=change

e) Patch mountmgr.sys to add exFAT filesystem detection

This is the core fix. Wine has no exFAT superblock parser, so it reports exFAT volumes as NTFS to Windows applications. Engine DJ checks the filesystem type string and rejects NTFS.

The patch is to dlls/mountmgr.sys/device.c in the Wine source. The key points:

  • Adds FS_EXFAT to the fs_type enum

  • Detects the "EXFAT " OEM name at superblock offset 3 (same position as "MSDOS5.0" for FAT)

  • Maps FS_EXFATMOUNTMGR_FS_TYPE_FAT32 — this is intentional, explained below

  • Falls through to Wine’s existing .windows-label/.windows-serial dotfile readers for label and serial

Why FAT32 and not exFAT? Wine’s filesystem name string is ultimately returned by ntdll.so not mountmgr.sys, and ntdll.so is ABI-coupled to the Proton build — it can’t be replaced independently. The ntdll handler only knows about FAT, FAT32, NTFS, ISO9660, UDF. Mapping to FAT32 causes ntdll to return "FAT32" to Engine DJ, which accepts it. A proper "exFAT" string would require rebuilding the entire Proton stack from source.

Build the patched DLL:

sudo apt-get install gcc-mingw-w64-x86-64 mingw-w64-tools flex bison
git clone https://gitlab.winehq.org/wine/wine.git
cd wine
# apply patch (see below)
mkdir ../wine-build && cd ../wine-build
../wine/configure --enable-win64 --without-x --without-freetype --without-opengl
make dlls/mountmgr.sys/x86_64-windows/mountmgr.sys

The patch (dlls/mountmgr.sys/device.c):

 enum fs_type
 {
     FS_ERROR,
     FS_UNKNOWN,
     FS_FAT1216,
     FS_FAT32,
     FS_ISO9660,
     FS_UDF,
+    FS_EXFAT,
 };

In VOLUME_ReadFATSuperblock(), before the final return FS_UNKNOWN:

+    if (!memcmp(buff + 3, "EXFAT   ", 8)) return FS_EXFAT;
     return FS_UNKNOWN;

In get_mountmgr_fs_type():

+    case FS_EXFAT:   return MOUNTMGR_FS_TYPE_FAT32;
     default:         return MOUNTMGR_FS_TYPE_NTFS;

In the label and serial switch statements, add FS_EXFAT alongside FS_UNKNOWN to use the dotfile fallback.

Deploy for GE-Proton10-34:

PROTON_DIR="$HOME/.local/share/Steam/compatibilitytools.d/GE-Proton10-34"
cp "$PROTON_DIR/files/lib/wine/x86_64-windows/mountmgr.sys" \
   "$PROTON_DIR/files/lib/wine/x86_64-windows/mountmgr.sys.bak"
cp wine-build/dlls/mountmgr.sys/x86_64-windows/mountmgr.sys \
   "$PROTON_DIR/files/lib/wine/x86_64-windows/mountmgr.sys"

For Proton 9.0-4, build against the Wine 9.0 tag (git checkout wine-9.0) — the patch applies cleanly. Note Proton 9.0-4 uses lib64/ not lib/:

PROTON_DIR="$HOME/.steam/steam/steamapps/common/Proton 9.0 (Beta)"
cp "$PROTON_DIR/files/lib64/wine/x86_64-windows/mountmgr.sys" \
   "$PROTON_DIR/files/lib64/wine/x86_64-windows/mountmgr.sys.bak"
cp wine-9.0-build/dlls/mountmgr.sys/x86_64-windows/mountmgr.sys \
   "$PROTON_DIR/files/lib64/wine/x86_64-windows/mountmgr.sys"

Result: Sync Manager shows the SD card as a valid export target, playlists visible and selectable, sync works, tracks play correctly on hardware. There’s a cosmetic “Export incomplete - drive capacity exceeded” warning that doesn’t appear to affect the actual sync.


Issue 2: No audio output on first launch — SOLVED

The earlier observation that “only Proton 9.0-4 has working audio” turned out to be wrong. The audio problem affects all Proton versions equally, and the “fix” of switching Proton versions was accidentally working by triggering a prefix regeneration. The real cause is stale audio device GUIDs.

Root cause: Wine assigns random GUIDs to audio endpoints when it first enumerates them into a prefix. These GUIDs are stored under HKLM\Software\Microsoft\Windows\CurrentVersion\MMDevices. Engine DJ stores its selected audio device by GUID. When anything causes Wine to reassign GUIDs (prefix regeneration, USB device changes, PulseAudio restarts), Engine DJ’s stored GUID no longer matches any device and it silently fails to initialise audio — no error shown, waveform moves but no sound.

Fix: Clear the MMDevices section from system.reg before each launch so Wine re-enumerates audio devices with fresh GUIDs:

PFXDIR="$HOME/.steam/steam/steamapps/compatdata/<appid>/pfx"
sed -i '/\[Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\MMDevices/,/^$/d' "$PFXDIR/system.reg"

Put this in your Steam launch options (all one line):

PFXDIR="$HOME/.steam/steam/steamapps/compatdata/<appid>/pfx"; sed -i '/\[Software\\\\Microsoft\\\\Windows\\\\CurrentVersion\\\\MMDevices/,/^$/d' "$PFXDIR/system.reg"; %command%

Confirmed working on both Proton 9.0-4 and GE-Proton10-34 — audio works immediately on every launch with no Proton-switching required.


Summary

Engine DJ 5.0.0 is now largely functional under Steam Proton on Linux including Sync Manager. The two fixes are independent and both required: the MMDevices sed one-liner for audio, and the mountmgr.sys patch plus drive letter/group/udev configuration for SD card sync. Tested end-to-end with tracks playing correctly on a Denon hardware unit after sync.

One known remaining oddity: Engine DJ occasionally shows an “Export incomplete - drive capacity exceeded” warning, likely a side effect of the FAT32 lie causing incorrect volume size reporting. The sync appears to complete correctly in practice but this hasn’t been tested exhaustively with very large exports — your mileage may vary if you’re trying to fill a large card close to capacity.

yes, it is entirely possible I used an LLM to speed this debugging process along, I think it would have taken days and days not just hours otherwise…

so has anyone else gotten this export to USB thing working? this was not easy!

I went even more overboard and patched WINE to work.. I’m not completely happy with the patches but they make audio more reliable and exfat SD cards can be accessed, but with a few caveats.. perhaps someone else can improve on this work.

This is sick. I have Codex pulling this now, gonna work it into my NixOS config and I’ll try and throw some upstream PRs your way.