From c0a96f94fbe55986c9b80a2bc2ac83850cd705c9 Mon Sep 17 00:00:00 2001 From: GTR8000 Date: Tue, 20 Oct 2026 03:37:43 -0400 Subject: [PATCH] Load JMBE V2 codecs so audio controls take effect (#2505) * Load JMBE V2 codecs so audio controls take effect Prefer the V2 library and codec factory, retaining fallback support for JMBE 1.x. Log codec class and supported features. Verified tone gain at zero and unity with JMBE 2.0.2, and digital audio with JMBE 1.x. * Handle missing JMBE library explicitly in V1 fallback --- .../audio/codec/mbe/JmbeAudioModule.java | 45 ++++++++++++++----- 1 file changed, 35 insertions(+), 10 deletions(-) diff --git a/src/main/java/io/github/dsheirer/audio/codec/mbe/JmbeAudioModule.java b/src/main/java/io/github/dsheirer/audio/codec/mbe/JmbeAudioModule.java index cc737fbd..614b21fb 100644 --- a/src/main/java/io/github/dsheirer/audio/codec/mbe/JmbeAudioModule.java +++ b/src/main/java/io/github/dsheirer/audio/codec/mbe/JmbeAudioModule.java @@ -39,6 +39,7 @@ import java.util.Collections; import java.util.List; import jmbe.iface.IAudioCodec; import jmbe.iface.IAudioCodecLibrary; +import jmbe.iface.IAudioCodecLibraryV2; import jmbe.iface.IAudioCodecV2; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -176,7 +177,26 @@ public abstract class JmbeAudioModule extends AbstractAudioModule implements Lis URLClassLoader childClassLoader = new URLClassLoader(new URL[]{path.toUri().toURL()}, this.getClass().getClassLoader()); - sLoadedJmbeAudioConverterClass = Class.forName("jmbe.JMBEAudioLibrary", true, childClassLoader); + try + { + sLoadedJmbeAudioConverterClass = Class.forName("jmbe.JMBEAudioLibraryV2", true, childClassLoader); + } + catch(ClassNotFoundException legacyLibrary) + { + try + { + sLoadedJmbeAudioConverterClass = Class.forName("jmbe.JMBEAudioLibrary", true, childClassLoader); + } + catch(ClassNotFoundException missingLibrary) + { + if(!mLibraryLoadStatusLogged.contains(JMBE_AUDIO_LIBRARY)) + { + LOG.error("Couldn't load JMBE audio conversion library from [" + path + + "] - neither V2 nor V1 library class was found"); + mLibraryLoadStatusLogged.add(JMBE_AUDIO_LIBRARY); + } + } + } } catch(IllegalArgumentException iae) { @@ -194,14 +214,7 @@ public abstract class JmbeAudioModule extends AbstractAudioModule implements Lis mLibraryLoadStatusLogged.add(JMBE_AUDIO_LIBRARY); } } - catch(ClassNotFoundException e1) - { - if(!mLibraryLoadStatusLogged.contains(JMBE_AUDIO_LIBRARY)) - { - LOG.error("Couldn't load JMBE audio conversion library - class not found"); - mLibraryLoadStatusLogged.add(JMBE_AUDIO_LIBRARY); - } - } + } } @@ -216,7 +229,19 @@ public abstract class JmbeAudioModule extends AbstractAudioModule implements Lis if((library.getMajorVersion() == 1 && library.getMinorVersion() >= 0 && library.getBuildVersion() >= 0) || library.getMajorVersion() >= 1) { - audioConverter = library.getAudioConverter(getCodecName()); + audioConverter = library instanceof IAudioCodecLibraryV2 libraryV2 ? + libraryV2.getAudioConverterV2(getCodecName()) : + library.getAudioConverter(getCodecName()); + + String codecStatusKey = JMBE_AUDIO_LIBRARY + ":codec:" + getCodecName(); + if(!mLibraryLoadStatusLogged.contains(codecStatusKey)) + { + LOG.info("JMBE codec [" + getCodecName() + "] class [" + + audioConverter.getClass().getName() + "] features [" + + (audioConverter instanceof IAudioCodecV2 v2 ? + v2.getFeatures() : Collections.emptyList()) + "]"); + mLibraryLoadStatusLogged.add(codecStatusKey); + } if(!mLibraryLoadStatusLogged.contains(JMBE_AUDIO_LIBRARY)) {