From 5f005dac09ec07404239b618b8a60704fda0195e Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Sat, 6 Jul 2019 21:03:06 +0200 Subject: [PATCH] Refactor native audio (Fixed #135) --- .../playpad/plugin/ModernPluginManager.java | 1 - .../java/de/tobias/playpad/NativeAudio.java | 62 --------- .../audio/mac/AVAudioPlayerBridge.java | 85 ++++++++++++ .../audio/mac/NativeAudioMacHandler.java | 31 +++-- .../mac/NativeAudioMacHandlerFactory.java | 50 +++---- .../main/java/de_tobias_playpad_NativeAudio.h | 117 ---------------- ...as_playpad_audio_mac_AVAudioPlayerBridge.h | 125 ++++++++++++++++++ .../main/resources/mac/libNativeAudio.dylib | Bin 65424 -> 75248 bytes .../plugin/NativeAudioPluginImpl.scala | 2 +- .../loader/WindowsAudioImplLoader.scala | 27 ++-- 10 files changed, 269 insertions(+), 231 deletions(-) delete mode 100644 PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/NativeAudio.java create mode 100644 PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AVAudioPlayerBridge.java delete mode 100644 PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_NativeAudio.h create mode 100644 PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_audio_mac_AVAudioPlayerBridge.h diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/ModernPluginManager.java b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/ModernPluginManager.java index 86c43e03..3b4d46b7 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/ModernPluginManager.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/ModernPluginManager.java @@ -53,7 +53,6 @@ public class ModernPluginManager { if (Files.notExists(path)) { throw new IOException("File not found: " + path); } - loadFile(path); } public void loadFile(Path path) { diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/NativeAudio.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/NativeAudio.java deleted file mode 100644 index 02a96550..00000000 --- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/NativeAudio.java +++ /dev/null @@ -1,62 +0,0 @@ -package de.tobias.playpad; - -public class NativeAudio { - - public static native void initialize(); - - public static native void play(int id); - - public static native void pause(int id); - - public static native void stop(int id); - - public static native void seek(int id, double duration); - - public static native void setLoop(int id, boolean loop); - - public static native double getVolume(int id); - - public static native void setVolume(int id, double volume); - - public static native boolean load(int id, String path); - - public static native void dispose(int id); - - public static native double getDuration(int id); - - public static native double getPosition(int id); - - public static native void setRate(int id, double rate); - - public static void onPeakMeter(int id, float left, float right) { - if (delegate != null) { - delegate.onPeakMeter(id, left, right); - } - } - - public static void onPositionChanged(int id, double position) { - if (delegate != null) { - delegate.onPositionChanged(id, position); - } - } - - public static void onFinish(int id) { - if (delegate != null) { - delegate.onFinish(id); - } - } - - private static NativeAudioDelegate delegate; - - public static void setDelegate(NativeAudioDelegate delegate) { - NativeAudio.delegate = delegate; - } - - public interface NativeAudioDelegate { - void onFinish(int id); - - void onPeakMeter(int id, float left, float right); - - void onPositionChanged(int id, double position); - } -} diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AVAudioPlayerBridge.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AVAudioPlayerBridge.java new file mode 100644 index 00000000..10dfd45c --- /dev/null +++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AVAudioPlayerBridge.java @@ -0,0 +1,85 @@ +package de.tobias.playpad.audio.mac; + +public class AVAudioPlayerBridge { + + private long nativePointer; + + private long getNativePointer() { + return nativePointer; + } + + private void setNativePointer(long nativePointer) { + this.nativePointer = nativePointer; + } + + + static { + System.out.println("static init start"); + initialize(); + System.out.println("static init end"); + } + + private static native void initialize(); + + public AVAudioPlayerBridge() { + init(); + } + + private native void init(); + + public native void play(); + + public native void pause(); + + public native void stop(); + + public native void seek(double duration); + + public native void setLoop(boolean loop); + + public native double getVolume(); + + public native void setVolume(double volume); + + public native boolean load(String path); + + public native void dispose(); + + public native double getDuration(); + + public native double getPosition(); + + public native void setRate(double rate); + + public void onPeakMeter(float left, float right) { + if (delegate != null) { + delegate.onPeakMeter(this, left, right); + } + } + + public void onPositionChanged(double position) { + if (delegate != null) { + delegate.onPositionChanged(this, position); + } + } + + public void onFinish() { + if (delegate != null) { + delegate.onFinish(this); + } + } + + private static NativeAudioDelegate delegate; + + public static void setDelegate(NativeAudioDelegate delegate) { + AVAudioPlayerBridge.delegate = delegate; + } + + public interface NativeAudioDelegate { + void onFinish(AVAudioPlayerBridge bridge); + + void onPeakMeter(AVAudioPlayerBridge bridge, float left, float right); + + void onPositionChanged(AVAudioPlayerBridge bridge, double position); + } +} diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandler.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandler.java index 8b21e7ea..9a333170 100644 --- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandler.java +++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandler.java @@ -1,7 +1,6 @@ package de.tobias.playpad.audio.mac; import de.thecodelabs.utils.threading.Worker; -import de.tobias.playpad.NativeAudio; import de.tobias.playpad.audio.AudioHandler; import de.tobias.playpad.audio.Peakable; import de.tobias.playpad.pad.PadStatus; @@ -15,9 +14,6 @@ import java.nio.file.Path; public class NativeAudioMacHandler extends AudioHandler implements Peakable, Seekable { - private static int counter = 0; - - private final int id; ObjectProperty<Duration> positionProperty; private ObjectProperty<Duration> durationProperty; private boolean isLoaded; @@ -25,10 +21,13 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See private DoubleProperty leftPeak; private DoubleProperty rightPeak; + private AVAudioPlayerBridge bridge; + NativeAudioMacHandler(PadContent content) { super(content); - id = counter++; + bridge = new AVAudioPlayerBridge(); + positionProperty = new SimpleObjectProperty<>(); durationProperty = new SimpleObjectProperty<>(); @@ -36,29 +35,29 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See rightPeak = new SimpleDoubleProperty(); } - int getId() { - return id; + AVAudioPlayerBridge getBridge() { + return bridge; } @Override public void play() { - NativeAudio.setLoop(id, getContent().getPad().getPadSettings().isLoop()); - NativeAudio.play(id); + bridge.setLoop(getContent().getPad().getPadSettings().isLoop()); + bridge.play(); } @Override public void pause() { - NativeAudio.pause(id); + bridge.pause(); } @Override public void stop() { - NativeAudio.stop(id); + bridge.stop(); } @Override public void seekToStart() { - NativeAudio.seek(id, 0); + bridge.seek(0); } @Override @@ -83,7 +82,7 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See @Override public void setVolume(double volume) { - NativeAudio.setVolume(id, volume); + bridge.setVolume(volume); } @Override @@ -95,11 +94,11 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See public void loadMedia(Path[] paths) { Worker.runLater(() -> { - isLoaded = NativeAudio.load(id, paths[0].toString()); + isLoaded = bridge.load(paths[0].toString()); if (isLoaded) { Platform.runLater(() -> { - durationProperty.set(Duration.seconds(NativeAudio.getDuration(id))); + durationProperty.set(Duration.seconds(bridge.getDuration())); getContent().getPad().setStatus(PadStatus.READY); if (getContent().getPad().isPadVisible()) { getContent().getPad().getController().getView().showBusyView(false); @@ -112,7 +111,7 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See @Override public void unloadMedia() { - NativeAudio.dispose(id); + bridge.dispose(); } @Override diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandlerFactory.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandlerFactory.java index a3331f5d..45fd6cb2 100644 --- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandlerFactory.java +++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/NativeAudioMacHandlerFactory.java @@ -1,7 +1,6 @@ package de.tobias.playpad.audio.mac; -import de.tobias.playpad.NativeAudio; -import de.tobias.playpad.NativeAudio.NativeAudioDelegate; +import de.tobias.playpad.audio.mac.AVAudioPlayerBridge.NativeAudioDelegate; import de.tobias.playpad.audio.AudioCapability; import de.tobias.playpad.audio.AudioHandler; import de.tobias.playpad.audio.AudioHandlerFactory; @@ -11,51 +10,56 @@ import de.tobias.playpad.pad.content.PadContent; import de.tobias.playpad.viewcontroller.AudioHandlerViewController; import javafx.util.Duration; -import java.util.HashMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Optional; public class NativeAudioMacHandlerFactory extends AudioHandlerFactory implements NativeAudioDelegate { - private static final HashMap<Integer, NativeAudioMacHandler> handlers = new HashMap<>(); + private List<NativeAudioMacHandler> handlers = new ArrayList<>(); + + private Optional<NativeAudioMacHandler> getHandlerByBridge(AVAudioPlayerBridge bridge) { + return handlers.stream().filter(handler -> handler.getBridge().equals(bridge)).findFirst(); + } public NativeAudioMacHandlerFactory(String type) { super(type); - NativeAudio.initialize(); - NativeAudio.setDelegate(this); + AVAudioPlayerBridge.setDelegate(this); } @Override public AudioHandler createAudioHandler(PadContent content) { NativeAudioMacHandler nativeAudioMacHandler = new NativeAudioMacHandler(content); - handlers.put(nativeAudioMacHandler.getId(), nativeAudioMacHandler); + handlers.add(nativeAudioMacHandler); return nativeAudioMacHandler; } @Override - public void onFinish(int id) { - NativeAudioMacHandler nativeAudioMacHandler = handlers.get(id); - if (nativeAudioMacHandler != null) { - PadContent content = nativeAudioMacHandler.getContent(); + public void onFinish(AVAudioPlayerBridge bridge) { + Optional<NativeAudioMacHandler> nativeAudioMacHandler = getHandlerByBridge(bridge); + nativeAudioMacHandler.ifPresent(handler -> { + PadContent content = handler.getContent(); if (content != null) { content.getPad().setStatus(PadStatus.STOP); } - } + }); } @Override - public void onPositionChanged(int id, double position) { - NativeAudioMacHandler nativeAudioMacHandler = handlers.get(id); - if (nativeAudioMacHandler != null) { - nativeAudioMacHandler.positionProperty.set(Duration.seconds(position)); - } + public void onPositionChanged(AVAudioPlayerBridge bridge, double position) { + Optional<NativeAudioMacHandler> nativeAudioMacHandler = getHandlerByBridge(bridge); + nativeAudioMacHandler.ifPresent(audioMacHandler -> { + audioMacHandler.positionProperty.set(Duration.seconds(position)); + }); } @Override - public void onPeakMeter(int id, float left, float right) { - NativeAudioMacHandler nativeAudioMacHandler = handlers.get(id); - if (nativeAudioMacHandler != null) { - nativeAudioMacHandler.audioLevelProperty(Channel.LEFT).set(left); - nativeAudioMacHandler.audioLevelProperty(Channel.RIGHT).set(right); - } + public void onPeakMeter(AVAudioPlayerBridge bridge, float left, float right) { + Optional<NativeAudioMacHandler> nativeAudioMacHandler = getHandlerByBridge(bridge); + nativeAudioMacHandler.ifPresent(handler -> { + handler.audioLevelProperty(Channel.LEFT).set(left); + handler.audioLevelProperty(Channel.RIGHT).set(right); + }); } @Override diff --git a/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_NativeAudio.h b/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_NativeAudio.h deleted file mode 100644 index 8fc9cbea..00000000 --- a/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_NativeAudio.h +++ /dev/null @@ -1,117 +0,0 @@ -/* DO NOT EDIT THIS FILE - it is machine generated */ -#include <jni.h> -/* Header for class de_tobias_playpad_NativeAudio */ - -#ifndef _Included_de_tobias_playpad_NativeAudio -#define _Included_de_tobias_playpad_NativeAudio -#ifdef __cplusplus -extern "C" { -#endif -/* - * Class: de_tobias_playpad_NativeAudio - * Method: initialize - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_initialize - (JNIEnv *, jclass); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: play - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_play - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: pause - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_pause - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: stop - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_stop - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: seek - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_seek - (JNIEnv *, jclass, jint, jdouble); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: setLoop - * Signature: (IZ)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_setLoop - (JNIEnv *, jclass, jint, jboolean); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: getVolume - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_NativeAudio_getVolume - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: setVolume - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_setVolume - (JNIEnv *, jclass, jint, jdouble); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: load - * Signature: (ILjava/lang/String;)Z - */ -JNIEXPORT jboolean JNICALL Java_de_tobias_playpad_NativeAudio_load - (JNIEnv *, jclass, jint, jstring); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: dispose - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_dispose - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: getDuration - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_NativeAudio_getDuration - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: getPosition - * Signature: (I)D - */ -JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_NativeAudio_getPosition - (JNIEnv *, jclass, jint); - -/* - * Class: de_tobias_playpad_NativeAudio - * Method: setRate - * Signature: (ID)V - */ -JNIEXPORT void JNICALL Java_de_tobias_playpad_NativeAudio_setRate - (JNIEnv *, jclass, jint, jdouble); - -#ifdef __cplusplus -} -#endif -#endif diff --git a/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_audio_mac_AVAudioPlayerBridge.h b/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_audio_mac_AVAudioPlayerBridge.h new file mode 100644 index 00000000..755158d7 --- /dev/null +++ b/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_audio_mac_AVAudioPlayerBridge.h @@ -0,0 +1,125 @@ +/* DO NOT EDIT THIS FILE - it is machine generated */ +#include <jni.h> +/* Header for class de_tobias_playpad_audio_mac_AVAudioPlayerBridge */ + +#ifndef _Included_de_tobias_playpad_audio_mac_AVAudioPlayerBridge +#define _Included_de_tobias_playpad_audio_mac_AVAudioPlayerBridge +#ifdef __cplusplus +extern "C" { +#endif +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: initialize + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_initialize + (JNIEnv *, jclass); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: init + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_init + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: play + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_play + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: pause + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_pause + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: stop + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_stop + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: seek + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_seek + (JNIEnv *, jobject, jdouble); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: setLoop + * Signature: (Z)V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_setLoop + (JNIEnv *, jobject, jboolean); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: getVolume + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_getVolume + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: setVolume + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_setVolume + (JNIEnv *, jobject, jdouble); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: load + * Signature: (Ljava/lang/String;)Z + */ +JNIEXPORT jboolean JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_load + (JNIEnv *, jobject, jstring); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: dispose + * Signature: ()V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_dispose + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: getDuration + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_getDuration + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: getPosition + * Signature: ()D + */ +JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_getPosition + (JNIEnv *, jobject); + +/* + * Class: de_tobias_playpad_audio_mac_AVAudioPlayerBridge + * Method: setRate + * Signature: (D)V + */ +JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_setRate + (JNIEnv *, jobject, jdouble); + +#ifdef __cplusplus +} +#endif +#endif diff --git a/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib b/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib index a43034c35b242f6dea535e34e3ff888df27d31d6..262f9b8506783c5ed2d22ce93436bb63a0df1bf7 100755 GIT binary patch literal 75248 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 Bf+YX| literal 65424 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 V2#kinXb6mkz-S1JhQKfl0RZ#J9LN9w diff --git a/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/NativeAudioPluginImpl.scala b/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/NativeAudioPluginImpl.scala index b0f1c648..470aba79 100644 --- a/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/NativeAudioPluginImpl.scala +++ b/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/NativeAudioPluginImpl.scala @@ -10,7 +10,7 @@ import de.tobias.playpad.plugin.loader.{MacAudioImplLoader, WindowsAudioImplLoad */ class NativeAudioPluginImpl extends PlayPadPluginStub with PluginArtifact { - private val NAME = "NativeAudioMac" + private val NAME = "NativeAudio" private val IDENTIFIER = "de.tobias.playwall.plugin.nativeaudio" private var module: Module = _ diff --git a/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/loader/WindowsAudioImplLoader.scala b/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/loader/WindowsAudioImplLoader.scala index f490fb40..ee513823 100644 --- a/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/loader/WindowsAudioImplLoader.scala +++ b/PlayWallPluginNativeAudio/src/main/scala/de/tobias/playpad/plugin/loader/WindowsAudioImplLoader.scala @@ -14,6 +14,17 @@ import net.sf.jni4net.Bridge */ class WindowsAudioImplLoader extends AudioModuleLoader { + val resources = Array( + "jni4net.j-0.8.8.0.jar", + "jni4net.n-0.8.8.0.dll", + "jni4net.n.w32.v40-0.8.8.0.dll", + "jni4net.n.w64.v40-0.8.8.0.dll", + "NativeAudio.dll", + "NativeAudio.j4n.dll", + "NativeAudio.j4n.jar", + "NAudio.dll" + ) + private val ASSETS = "win/" override def preInit(): Unit = { @@ -23,19 +34,13 @@ class WindowsAudioImplLoader extends AudioModuleLoader { if (!app.isDebug) { if (Files.notExists(resourceFolder)) Files.createDirectories(resourceFolder) - copyResource(resourceFolder, ASSETS, "jni4net.j-0.8.8.0.jar") - copyResource(resourceFolder, ASSETS, "jni4net.n-0.8.8.0.dll") - copyResource(resourceFolder, ASSETS, "jni4net.n.w32.v40-0.8.8.0.dll") - copyResource(resourceFolder, ASSETS, "jni4net.n.w64.v40-0.8.8.0.dll") - copyResource(resourceFolder, ASSETS, "NativeAudio.dll") - copyResource(resourceFolder, ASSETS, "NativeAudio.j4n.dll") - copyResource(resourceFolder, ASSETS, "NativeAudio.j4n.jar") - copyResource(resourceFolder, ASSETS, "NAudio.dll") + + resources.foreach(copyResource(resourceFolder, ASSETS, _)) } - Bridge.setVerbose(app isDebug) - Bridge.init(resourceFolder toFile) - Bridge.LoadAndRegisterAssemblyFrom(resourceFolder.resolve("NativeAudio.j4n.dll") toFile) + Bridge.setVerbose(app.isDebug) + Bridge.init(resourceFolder.toFile) + Bridge.LoadAndRegisterAssemblyFrom(resourceFolder.resolve("NativeAudio.j4n.dll").toFile) } override def init(module: Module): Unit = { -- GitLab