Launcher: LD_LIBRARY_PATH + SPA_PLUGIN_DIR audio (fix NixOS pas de son OpenAL)
This commit is contained in:
@@ -13,17 +13,20 @@ const ConfigManager = require('./configmanager')
|
|||||||
const logger = LoggerUtil.getLogger('ProcessBuilder')
|
const logger = LoggerUtil.getLogger('ProcessBuilder')
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* SurviePote : dossiers système contenant libGL/libEGL/libvulkan (dispatch + drivers).
|
* SurviePote : dossiers système contenant les libs natives dlopen par le jeu
|
||||||
* Nécessaire là où dlopen ne les voit pas (ex: NixOS hors wrapper, LD_LIBRARY_PATH vide).
|
* (libGL/libEGL/libvulkan + drivers Mesa, et backends audio libasound/libpulse/libpipewire).
|
||||||
|
* Nécessaires là où dlopen ne les voit pas (ex: NixOS hors wrapper, LD_LIBRARY_PATH vide).
|
||||||
|
* Sans ça : "[LWJGL] libGL.so.1 not found in system paths" ou "Failed to open OpenAL device".
|
||||||
* Ne retourne que des dossiers existants. Ordre : dispatch d'abord, drivers ensuite.
|
* Ne retourne que des dossiers existants. Ordre : dispatch d'abord, drivers ensuite.
|
||||||
*
|
*
|
||||||
* @returns {Array.<string>} Dossiers à ajouter à LD_LIBRARY_PATH pour le jeu.
|
* @returns {Array.<string>} Dossiers à ajouter à LD_LIBRARY_PATH pour le jeu.
|
||||||
*/
|
*/
|
||||||
function resolveSystemGLDirs(){
|
function resolveSystemNativeDirs(){
|
||||||
const dirs = []
|
const dirs = []
|
||||||
const candidates = [
|
const candidates = [
|
||||||
'/run/opengl-driver/lib',
|
'/run/opengl-driver/lib',
|
||||||
'/run/opengl-driver-32/lib',
|
'/run/opengl-driver-32/lib',
|
||||||
|
'/run/current-system/sw/lib',
|
||||||
'/usr/lib/x86_64-linux-gnu',
|
'/usr/lib/x86_64-linux-gnu',
|
||||||
'/usr/lib64',
|
'/usr/lib64',
|
||||||
'/usr/lib'
|
'/usr/lib'
|
||||||
@@ -35,11 +38,13 @@ function resolveSystemGLDirs(){
|
|||||||
}
|
}
|
||||||
} catch(_err) { /* ignore */ }
|
} catch(_err) { /* ignore */ }
|
||||||
}
|
}
|
||||||
// NixOS : libglvnd (dispatch libGL/libEGL) + vulkan-loader dans le store.
|
// NixOS : libglvnd (dispatch GL), vulkan-loader, alsa/pulse/pipewire dans le store.
|
||||||
try {
|
try {
|
||||||
const store = fs.readdirSync('/nix/store')
|
const store = fs.readdirSync('/nix/store')
|
||||||
for(const entry of store){
|
for(const entry of store){
|
||||||
if(entry.includes('libglvnd') || entry.includes('vulkan-loader')){
|
if(entry.includes('libglvnd') || entry.includes('vulkan-loader')
|
||||||
|
|| entry.includes('alsa-lib') || entry.includes('pulseaudio')
|
||||||
|
|| (entry.includes('pipewire') && !entry.includes('python'))){
|
||||||
const lib = path.join('/nix/store', entry, 'lib')
|
const lib = path.join('/nix/store', entry, 'lib')
|
||||||
if(fs.existsSync(lib) && !dirs.includes(lib)){
|
if(fs.existsSync(lib) && !dirs.includes(lib)){
|
||||||
dirs.push(lib)
|
dirs.push(lib)
|
||||||
@@ -50,6 +55,27 @@ function resolveSystemGLDirs(){
|
|||||||
return dirs
|
return dirs
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* SurviePote : dossier des plugins SPA PipeWire (routage audio).
|
||||||
|
* Sans lui, OpenAL voit PipeWire mais ne peut router aucun son.
|
||||||
|
*
|
||||||
|
* @returns {string|null} Chemin spa-0.2 ou null.
|
||||||
|
*/
|
||||||
|
function resolveSpaPluginDir(){
|
||||||
|
try {
|
||||||
|
const store = fs.readdirSync('/nix/store')
|
||||||
|
for(const entry of store){
|
||||||
|
if(entry.includes('pipewire') && !entry.includes('python')){
|
||||||
|
const spa = path.join('/nix/store', entry, 'lib', 'spa-0.2')
|
||||||
|
if(fs.existsSync(spa)){
|
||||||
|
return spa
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(_err) { /* ignore */ }
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Only forge and fabric are top level mod loaders.
|
* Only forge and fabric are top level mod loaders.
|
||||||
@@ -120,11 +146,18 @@ class ProcessBuilder {
|
|||||||
// Sans ça : "[LWJGL] libGL.so.1 not found in system paths" -> crash "no OpenGL context API".
|
// Sans ça : "[LWJGL] libGL.so.1 not found in system paths" -> crash "no OpenGL context API".
|
||||||
const gameEnv = { ...process.env }
|
const gameEnv = { ...process.env }
|
||||||
if(process.platform === 'linux'){
|
if(process.platform === 'linux'){
|
||||||
const glDirs = resolveSystemGLDirs()
|
const nativeDirs = resolveSystemNativeDirs()
|
||||||
if(glDirs.length > 0){
|
if(nativeDirs.length > 0){
|
||||||
const prev = gameEnv.LD_LIBRARY_PATH ? gameEnv.LD_LIBRARY_PATH + ':' : ''
|
const prev = gameEnv.LD_LIBRARY_PATH ? gameEnv.LD_LIBRARY_PATH + ':' : ''
|
||||||
gameEnv.LD_LIBRARY_PATH = prev + glDirs.join(':')
|
gameEnv.LD_LIBRARY_PATH = prev + nativeDirs.join(':')
|
||||||
logger.info('Prepended GL driver dirs to LD_LIBRARY_PATH:', glDirs.join(':'))
|
logger.info('Prepended system native dirs to LD_LIBRARY_PATH:', nativeDirs.join(':'))
|
||||||
|
}
|
||||||
|
if(!gameEnv.SPA_PLUGIN_DIR){
|
||||||
|
const spa = resolveSpaPluginDir()
|
||||||
|
if(spa){
|
||||||
|
gameEnv.SPA_PLUGIN_DIR = spa
|
||||||
|
logger.info('Set SPA_PLUGIN_DIR:', spa)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user