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_EXFAT → MOUNTMGR_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.