diff --git a/PlayWallNativeWin/.classpath b/PlayWallNativeWin/.classpath new file mode 100644 index 0000000000000000000000000000000000000000..709ee3891c7490ab21accfb7f66c61054b14fbe7 --- /dev/null +++ b/PlayWallNativeWin/.classpath @@ -0,0 +1,13 @@ +<?xml version="1.0" encoding="UTF-8"?> +<classpath> + <classpathentry kind="src" path="src"/> + <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Plugins"/> + <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/YML"/> + <classpathentry kind="lib" path="j4n/jni4net.j-0.8.8.0.jar"/> + <classpathentry kind="lib" path="j4n/NativeAudio.j4n.jar"/> + <classpathentry combineaccessrules="false" kind="src" path="/PlayWallCore"/> + <classpathentry combineaccessrules="false" kind="src" path="/libUtils"/> + <classpathentry combineaccessrules="false" kind="src" path="/Updater"/> + <classpathentry kind="output" path="bin"/> +</classpath> diff --git a/PlayWallNativeWin/.gitignore b/PlayWallNativeWin/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..ae3c1726048cd06b9a143e0376ed46dd9b9a8d53 --- /dev/null +++ b/PlayWallNativeWin/.gitignore @@ -0,0 +1 @@ +/bin/ diff --git a/PlayWallNativeWin/.project b/PlayWallNativeWin/.project new file mode 100644 index 0000000000000000000000000000000000000000..f859d19b4ac27ba37188d2fb96f24ea765eccd5f --- /dev/null +++ b/PlayWallNativeWin/.project @@ -0,0 +1,17 @@ +<?xml version="1.0" encoding="UTF-8"?> +<projectDescription> + <name>PlayWallNativeWin</name> + <comment></comment> + <projects> + </projects> + <buildSpec> + <buildCommand> + <name>org.eclipse.jdt.core.javabuilder</name> + <arguments> + </arguments> + </buildCommand> + </buildSpec> + <natures> + <nature>org.eclipse.jdt.core.javanature</nature> + </natures> +</projectDescription> diff --git a/PlayWallNativeWin/.settings/org.eclipse.jdt.core.prefs b/PlayWallNativeWin/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000000000000000000000000000000000000..bb35fa0a87b032ee9d0b128004c1edbd464f07bf --- /dev/null +++ b/PlayWallNativeWin/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,11 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/PlayWallNativeWin/j4n/NAudio.dll b/PlayWallNativeWin/j4n/NAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..9dd5ae7de34d2bc2dcf934eb027fa60d20237c3d Binary files /dev/null and b/PlayWallNativeWin/j4n/NAudio.dll differ diff --git a/PlayWallNativeWin/j4n/NativeAudio.dll b/PlayWallNativeWin/j4n/NativeAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..e85f118b0af0c8c9a03777d25938e76a635adcb1 Binary files /dev/null and b/PlayWallNativeWin/j4n/NativeAudio.dll differ diff --git a/PlayWallNativeWin/j4n/NativeAudio.j4n.dll b/PlayWallNativeWin/j4n/NativeAudio.j4n.dll new file mode 100644 index 0000000000000000000000000000000000000000..7b2db090abeaaf57e7cd652f28caf10bfbfa1d56 Binary files /dev/null and b/PlayWallNativeWin/j4n/NativeAudio.j4n.dll differ diff --git a/PlayWallNativeWin/j4n/NativeAudio.j4n.jar b/PlayWallNativeWin/j4n/NativeAudio.j4n.jar new file mode 100644 index 0000000000000000000000000000000000000000..8f888bc0ebad18acd661a0d0ea694791d69778a4 Binary files /dev/null and b/PlayWallNativeWin/j4n/NativeAudio.j4n.jar differ diff --git a/PlayWallNativeWin/j4n/NativeAudio.proxygen.xml b/PlayWallNativeWin/j4n/NativeAudio.proxygen.xml new file mode 100644 index 0000000000000000000000000000000000000000..8e339777e6fbcaf610050cca93491a9dfdabd518 --- /dev/null +++ b/PlayWallNativeWin/j4n/NativeAudio.proxygen.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="utf-8"?> +<jni4net-proxygen xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://jni4net.sf.net/0.8.8.0/toolConfig.xsd"> + <TargetDirJvm>.\jvm</TargetDirJvm> + <TargetDirClr>.\clr</TargetDirClr> + <AssemblyReference Assembly="NativeAudio.dll" Generate="true" /> +</jni4net-proxygen> \ No newline at end of file diff --git a/PlayWallNativeWin/j4n/build.cmd b/PlayWallNativeWin/j4n/build.cmd new file mode 100644 index 0000000000000000000000000000000000000000..4c2f0e843e45bfa61339ae55eb6cc142bd066db3 --- /dev/null +++ b/PlayWallNativeWin/j4n/build.cmd @@ -0,0 +1,21 @@ +@echo off +if not exist target mkdir target +if not exist target\classes mkdir target\classes + + +echo compile classes +javac -nowarn -d target\classes -sourcepath jvm -cp "d:\programmieren\git-java\playwall\playwallnativewin\j4n\jni4net-0.8.8.0-bin\lib\jni4net.j-0.8.8.0.jar"; "jvm\nativeaudio\LoopStream.java" "jvm\nativeaudio\NativeAudio.java" +IF %ERRORLEVEL% NEQ 0 goto end + + +echo NativeAudio.j4n.jar +jar cvf NativeAudio.j4n.jar -C target\classes "nativeaudio\LoopStream.class" -C target\classes "nativeaudio\NativeAudio.class" > nul +IF %ERRORLEVEL% NEQ 0 goto end + + +echo NativeAudio.j4n.dll +csc /nologo /warn:0 /t:library /out:NativeAudio.j4n.dll /recurse:clr\*.cs /reference:"D:\Programmieren\Git-Java\PlayWall\PlayWallNativeWin\j4n\NativeAudio.dll" /reference:"D:\Programmieren\Git-Java\PlayWall\PlayWallNativeWin\j4n\jni4net-0.8.8.0-bin\lib\jni4net.n-0.8.8.0.dll" +IF %ERRORLEVEL% NEQ 0 goto end + + +:end diff --git a/PlayWallNativeWin/j4n/clr/nativeaudio/LoopStream.generated.cs b/PlayWallNativeWin/j4n/clr/nativeaudio/LoopStream.generated.cs new file mode 100644 index 0000000000000000000000000000000000000000..cf1228582af0be39daa9c6762b55c7506df0e570 --- /dev/null +++ b/PlayWallNativeWin/j4n/clr/nativeaudio/LoopStream.generated.cs @@ -0,0 +1,89 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by jni4net. See http://jni4net.sourceforge.net/ +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace NativeAudio { + + + #region Component Designer generated code + public partial class LoopStream_ { + + public static global::java.lang.Class _class { + get { + return global::NativeAudio.@__LoopStream.staticClass; + } + } + } + #endregion + + #region Component Designer generated code + [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::NativeAudio.LoopStream), typeof(global::NativeAudio.LoopStream_))] + [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::NativeAudio.LoopStream), typeof(global::NativeAudio.LoopStream_))] + internal sealed partial class @__LoopStream : global::java.lang.Object { + + internal new static global::java.lang.Class staticClass; + + private @__LoopStream(global::net.sf.jni4net.jni.JNIEnv @__env) : + base(@__env) { + } + + private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { + global::NativeAudio.@__LoopStream.staticClass = @__class; + } + + private static global::System.Collections.Generic.List<global::net.sf.jni4net.jni.JNINativeMethod> @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { + global::System.Type @__type = typeof(__LoopStream); + global::System.Collections.Generic.List<global::net.sf.jni4net.jni.JNINativeMethod> methods = new global::System.Collections.Generic.List<global::net.sf.jni4net.jni.JNINativeMethod>(); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getEnableLooping", "EnableLooping0", "()Z")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setEnableLooping", "EnableLooping1", "(Z)V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "__ctorLoopStream0", "__ctorLoopStream0", "(Lnet/sf/jni4net/inj/IClrProxy;Lsystem/io/Stream;)V")); + return methods; + } + + private static bool EnableLooping0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()Z + // ()Z + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + bool @__return = default(bool); + try { + global::NativeAudio.LoopStream @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.LoopStream>(@__env, @__obj); + @__return = ((bool)(@__real.EnableLooping)); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + return @__return; + } + + private static void EnableLooping1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, bool value) { + // (Z)V + // (Z)V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.LoopStream @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.LoopStream>(@__env, @__obj); + @__real.EnableLooping = value; + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static void @__ctorLoopStream0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle sourceStream) { + // (Lsystem/io/Stream;)V + // (LNAudio/Wave/WaveStream;)V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.LoopStream @__real = new global::NativeAudio.LoopStream(global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NAudio.Wave.WaveStream>(@__env, sourceStream)); + global::net.sf.jni4net.utils.Convertor.InitProxy(@__env, @__obj, @__real); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { + + public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { + return new global::NativeAudio.@__LoopStream(@__env); + } + } + } + #endregion +} diff --git a/PlayWallNativeWin/j4n/clr/nativeaudio/NativeAudio.generated.cs b/PlayWallNativeWin/j4n/clr/nativeaudio/NativeAudio.generated.cs new file mode 100644 index 0000000000000000000000000000000000000000..a869f90ff6f4e4128af2b54161408cbcd556dfda --- /dev/null +++ b/PlayWallNativeWin/j4n/clr/nativeaudio/NativeAudio.generated.cs @@ -0,0 +1,183 @@ +//------------------------------------------------------------------------------ +// <auto-generated> +// This code was generated by jni4net. See http://jni4net.sourceforge.net/ +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </auto-generated> +//------------------------------------------------------------------------------ + +namespace NativeAudio { + + + #region Component Designer generated code + public partial class NativeAudio_ { + + public static global::java.lang.Class _class { + get { + return global::NativeAudio.@__NativeAudio.staticClass; + } + } + } + #endregion + + #region Component Designer generated code + [global::net.sf.jni4net.attributes.JavaProxyAttribute(typeof(global::NativeAudio.NativeAudio), typeof(global::NativeAudio.NativeAudio_))] + [global::net.sf.jni4net.attributes.ClrWrapperAttribute(typeof(global::NativeAudio.NativeAudio), typeof(global::NativeAudio.NativeAudio_))] + internal sealed partial class @__NativeAudio : global::java.lang.Object { + + internal new static global::java.lang.Class staticClass; + + private @__NativeAudio(global::net.sf.jni4net.jni.JNIEnv @__env) : + base(@__env) { + } + + private static void InitJNI(global::net.sf.jni4net.jni.JNIEnv @__env, java.lang.Class @__class) { + global::NativeAudio.@__NativeAudio.staticClass = @__class; + } + + private static global::System.Collections.Generic.List<global::net.sf.jni4net.jni.JNINativeMethod> @__Init(global::net.sf.jni4net.jni.JNIEnv @__env, global::java.lang.Class @__class) { + global::System.Type @__type = typeof(__NativeAudio); + global::System.Collections.Generic.List<global::net.sf.jni4net.jni.JNINativeMethod> methods = new global::System.Collections.Generic.List<global::net.sf.jni4net.jni.JNINativeMethod>(); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "load", "load0", "(Ljava/lang/String;)Z")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "play", "play1", "()V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "pause", "pause2", "()V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "stop", "stop3", "()V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getDuration", "getDuration4", "()D")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "getPosition", "getPosition5", "()D")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "isPlaying", "isPlaying6", "()Z")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setVolume", "setVolume7", "(F)V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "setLoop", "setLoop8", "(Z)V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "unload", "unload9", "()V")); + methods.Add(global::net.sf.jni4net.jni.JNINativeMethod.Create(@__type, "__ctorNativeAudio0", "__ctorNativeAudio0", "(Lnet/sf/jni4net/inj/IClrProxy;)V")); + return methods; + } + + private static bool load0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, global::net.sf.jni4net.utils.JniLocalHandle path) { + // (Ljava/lang/String;)Z + // (LSystem/String;)Z + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + bool @__return = default(bool); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__return = ((bool)(@__real.load(global::net.sf.jni4net.utils.Convertor.StrongJ2CString(@__env, path)))); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + return @__return; + } + + private static void play1(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()V + // ()V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__real.play(); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static void pause2(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()V + // ()V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__real.pause(); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static void stop3(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()V + // ()V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__real.stop(); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static double getDuration4(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()D + // ()D + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + double @__return = default(double); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__return = ((double)(@__real.getDuration())); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + return @__return; + } + + private static double getPosition5(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()D + // ()D + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + double @__return = default(double); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__return = ((double)(@__real.getPosition())); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + return @__return; + } + + private static bool isPlaying6(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()Z + // ()Z + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + bool @__return = default(bool); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__return = ((bool)(@__real.isPlaying())); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + return @__return; + } + + private static void setVolume7(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, float volume) { + // (F)V + // (F)V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__real.setVolume(volume); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static void setLoop8(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj, bool loop) { + // (Z)V + // (Z)V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__real.setLoop(loop); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static void unload9(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()V + // ()V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = global::net.sf.jni4net.utils.Convertor.StrongJp2C<global::NativeAudio.NativeAudio>(@__env, @__obj); + @__real.unload(); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + private static void @__ctorNativeAudio0(global::System.IntPtr @__envp, global::net.sf.jni4net.utils.JniLocalHandle @__class, global::net.sf.jni4net.utils.JniLocalHandle @__obj) { + // ()V + // ()V + global::net.sf.jni4net.jni.JNIEnv @__env = global::net.sf.jni4net.jni.JNIEnv.Wrap(@__envp); + try { + global::NativeAudio.NativeAudio @__real = new global::NativeAudio.NativeAudio(); + global::net.sf.jni4net.utils.Convertor.InitProxy(@__env, @__obj, @__real); + }catch (global::System.Exception __ex){@__env.ThrowExisting(__ex);} + } + + new internal sealed class ContructionHelper : global::net.sf.jni4net.utils.IConstructionHelper { + + public global::net.sf.jni4net.jni.IJvmProxy CreateProxy(global::net.sf.jni4net.jni.JNIEnv @__env) { + return new global::NativeAudio.@__NativeAudio(@__env); + } + } + } + #endregion +} diff --git a/PlayWallNativeWin/j4n/generate.bat b/PlayWallNativeWin/j4n/generate.bat new file mode 100644 index 0000000000000000000000000000000000000000..f7636d55f59799fde55275cadbf2e0e004a3c39e --- /dev/null +++ b/PlayWallNativeWin/j4n/generate.bat @@ -0,0 +1 @@ +proxygen.exe NativeAudio.dll -wd . \ No newline at end of file diff --git a/PlayWallNativeWin/j4n/jni4net.j-0.8.8.0.jar b/PlayWallNativeWin/j4n/jni4net.j-0.8.8.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..922c2ad94d8c7a0a75f3613450819eb02e6d2757 Binary files /dev/null and b/PlayWallNativeWin/j4n/jni4net.j-0.8.8.0.jar differ diff --git a/PlayWallNativeWin/j4n/jni4net.n-0.8.8.0.dll b/PlayWallNativeWin/j4n/jni4net.n-0.8.8.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..2c7dc61711aea95d4a9d27f72ee9b540625ec0da Binary files /dev/null and b/PlayWallNativeWin/j4n/jni4net.n-0.8.8.0.dll differ diff --git a/PlayWallNativeWin/j4n/jni4net.n.w32.v40-0.8.8.0.dll b/PlayWallNativeWin/j4n/jni4net.n.w32.v40-0.8.8.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..e90e34defd278af539cd5d40a44f5d5f6b3b983d Binary files /dev/null and b/PlayWallNativeWin/j4n/jni4net.n.w32.v40-0.8.8.0.dll differ diff --git a/PlayWallNativeWin/j4n/jni4net.n.w64.v40-0.8.8.0.dll b/PlayWallNativeWin/j4n/jni4net.n.w64.v40-0.8.8.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..6ff98f1eca73982a4d293447484864290d2d2170 Binary files /dev/null and b/PlayWallNativeWin/j4n/jni4net.n.w64.v40-0.8.8.0.dll differ diff --git a/PlayWallNativeWin/j4n/jvm/nativeaudio/LoopStream.java b/PlayWallNativeWin/j4n/jvm/nativeaudio/LoopStream.java new file mode 100644 index 0000000000000000000000000000000000000000..e11a08759b9cfef51fba8e8931747e57d5fb0409 --- /dev/null +++ b/PlayWallNativeWin/j4n/jvm/nativeaudio/LoopStream.java @@ -0,0 +1,45 @@ +// ------------------------------------------------------------------------------ +// <autogenerated> +// This code was generated by jni4net. See http://jni4net.sourceforge.net/ +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </autogenerated> +// ------------------------------------------------------------------------------ + +package nativeaudio; + +@net.sf.jni4net.attributes.ClrType +public class LoopStream extends system.io.Stream { + + //<generated-proxy> + private static system.Type staticType; + + protected LoopStream(net.sf.jni4net.inj.INJEnv __env, long __handle) { + super(__env, __handle); + } + + @net.sf.jni4net.attributes.ClrConstructor("(LNAudio/Wave/WaveStream;)V") + public LoopStream(system.io.Stream sourceStream) { + super(((net.sf.jni4net.inj.INJEnv)(null)), 0); + nativeaudio.LoopStream.__ctorLoopStream0(this, sourceStream); + } + + @net.sf.jni4net.attributes.ClrMethod("(Lsystem/io/Stream;)V") + private native static void __ctorLoopStream0(net.sf.jni4net.inj.IClrProxy thiz, system.io.Stream sourceStream); + + @net.sf.jni4net.attributes.ClrMethod("()Z") + public native boolean getEnableLooping(); + + @net.sf.jni4net.attributes.ClrMethod("(Z)V") + public native void setEnableLooping(boolean value); + + public static system.Type typeof() { + return nativeaudio.LoopStream.staticType; + } + + private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { + nativeaudio.LoopStream.staticType = staticType; + } + //</generated-proxy> +} diff --git a/PlayWallNativeWin/j4n/jvm/nativeaudio/NativeAudio.java b/PlayWallNativeWin/j4n/jvm/nativeaudio/NativeAudio.java new file mode 100644 index 0000000000000000000000000000000000000000..f8a496f024e50f15f69ef3bdaf9752351e56d735 --- /dev/null +++ b/PlayWallNativeWin/j4n/jvm/nativeaudio/NativeAudio.java @@ -0,0 +1,69 @@ +// ------------------------------------------------------------------------------ +// <autogenerated> +// This code was generated by jni4net. See http://jni4net.sourceforge.net/ +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// </autogenerated> +// ------------------------------------------------------------------------------ + +package nativeaudio; + +@net.sf.jni4net.attributes.ClrType +public class NativeAudio extends system.Object { + + //<generated-proxy> + private static system.Type staticType; + + protected NativeAudio(net.sf.jni4net.inj.INJEnv __env, long __handle) { + super(__env, __handle); + } + + @net.sf.jni4net.attributes.ClrConstructor("()V") + public NativeAudio() { + super(((net.sf.jni4net.inj.INJEnv)(null)), 0); + nativeaudio.NativeAudio.__ctorNativeAudio0(this); + } + + @net.sf.jni4net.attributes.ClrMethod("()V") + private native static void __ctorNativeAudio0(net.sf.jni4net.inj.IClrProxy thiz); + + @net.sf.jni4net.attributes.ClrMethod("(LSystem/String;)Z") + public native boolean load(java.lang.String path); + + @net.sf.jni4net.attributes.ClrMethod("()V") + public native void play(); + + @net.sf.jni4net.attributes.ClrMethod("()V") + public native void pause(); + + @net.sf.jni4net.attributes.ClrMethod("()V") + public native void stop(); + + @net.sf.jni4net.attributes.ClrMethod("()D") + public native double getDuration(); + + @net.sf.jni4net.attributes.ClrMethod("()D") + public native double getPosition(); + + @net.sf.jni4net.attributes.ClrMethod("()Z") + public native boolean isPlaying(); + + @net.sf.jni4net.attributes.ClrMethod("(F)V") + public native void setVolume(float volume); + + @net.sf.jni4net.attributes.ClrMethod("(Z)V") + public native void setLoop(boolean loop); + + @net.sf.jni4net.attributes.ClrMethod("()V") + public native void unload(); + + public static system.Type typeof() { + return nativeaudio.NativeAudio.staticType; + } + + private static void InitJNI(net.sf.jni4net.inj.INJEnv env, system.Type staticType) { + nativeaudio.NativeAudio.staticType = staticType; + } + //</generated-proxy> +} diff --git a/PlayWallNativeWin/j4n/proxygen.exe b/PlayWallNativeWin/j4n/proxygen.exe new file mode 100644 index 0000000000000000000000000000000000000000..816db4ef246603f6313670c111e4de0957905d56 Binary files /dev/null and b/PlayWallNativeWin/j4n/proxygen.exe differ diff --git a/PlayWallNativeWin/j4n/proxygen.exe.config b/PlayWallNativeWin/j4n/proxygen.exe.config new file mode 100644 index 0000000000000000000000000000000000000000..88c3d408ec7ed3687fcf214d01aa502f4bd0e89f --- /dev/null +++ b/PlayWallNativeWin/j4n/proxygen.exe.config @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8" ?> +<configuration> + <startup> + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> + <supportedRuntime version="v2.0.50727"/> + </startup> +</configuration> \ No newline at end of file diff --git a/PlayWallNativeWin/j4n/target/classes/nativeaudio/LoopStream.class b/PlayWallNativeWin/j4n/target/classes/nativeaudio/LoopStream.class new file mode 100644 index 0000000000000000000000000000000000000000..cbde588f149720bb84608ad2bcc8ae43d1ac4250 Binary files /dev/null and b/PlayWallNativeWin/j4n/target/classes/nativeaudio/LoopStream.class differ diff --git a/PlayWallNativeWin/j4n/target/classes/nativeaudio/NativeAudio.class b/PlayWallNativeWin/j4n/target/classes/nativeaudio/NativeAudio.class new file mode 100644 index 0000000000000000000000000000000000000000..e81585d278c3c21c56c80de6ccd3c9db5118c09d Binary files /dev/null and b/PlayWallNativeWin/j4n/target/classes/nativeaudio/NativeAudio.class differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinHandler.java b/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..0851ed0333c6f317dc2908ee04d865b4d717ab1c --- /dev/null +++ b/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinHandler.java @@ -0,0 +1,159 @@ +package de.tobias.playpad.nawin; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.ConcurrentModificationException; +import java.util.Iterator; +import java.util.List; + +import de.tobias.playpad.audio.AudioHandler; +import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadStatus; +import de.tobias.playpad.pad.conntent.PadContent; +import javafx.application.Platform; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import javafx.util.Duration; +import nativeaudio.NativeAudio; + +public class NativeAudioWinHandler extends AudioHandler { + + private NativeAudio audioHandler; + private ObjectProperty<Duration> durationProperty; + private ObjectProperty<Duration> positionProperty; + + private static Thread positionThread; + private static List<NativeAudioWinHandler> playedHandlers = new ArrayList<>(); + private static final int SLEEP_TIME_POSITION = 50; + + static { + positionThread = new Thread(() -> { + while (true) { + try { + if (playedHandlers.isEmpty()) { + synchronized (positionThread) { + positionThread.wait(); + } + } + + for (Iterator<NativeAudioWinHandler> iterator = playedHandlers.iterator(); iterator.hasNext();) { + NativeAudioWinHandler handler = iterator.next(); + Pad pad = handler.getContent().getPad(); + + if (handler.audioHandler != null) { + if (!handler.audioHandler.isPlaying()) { + if (!pad.getPadSettings().isLoop()) { + System.out.println("Stop"); + pad.setEof(true); + + // Remove from Loop and Stop + iterator.remove(); + Platform.runLater(() -> pad.setStatus(PadStatus.STOP)); + } + } + } + + Duration position = Duration.millis(handler.audioHandler.getPosition()); + + // Update der Zeit + Platform.runLater(() -> handler.positionProperty.set(position)); + } + + Thread.sleep(SLEEP_TIME_POSITION); + } catch (InterruptedException e) {} catch (ConcurrentModificationException e) {} catch (Exception e) { + e.printStackTrace(); + } + } + }); + + positionThread.start(); + } + + public NativeAudioWinHandler(PadContent content) { + super(content); + durationProperty = new SimpleObjectProperty<>(); + positionProperty = new SimpleObjectProperty<>(); + } + + @Override + public void play() { + audioHandler.setLoop(getContent().getPad().getPadSettings().isLoop()); + audioHandler.play(); + + boolean start = false; + if (playedHandlers.isEmpty()) { + start = true; + } + + if (!playedHandlers.contains(this)) + playedHandlers.add(this); + if (start) { + synchronized (positionThread) { + positionThread.notify(); + } + } + } + + @Override + public void pause() { + audioHandler.pause(); + if (playedHandlers.contains(this)) + playedHandlers.remove(this); + } + + @Override + public void stop() { + audioHandler.stop(); + if (playedHandlers.contains(this)) + playedHandlers.remove(this); + } + + @Override + public Duration getPosition() { + return positionProperty.get(); + } + + @Override + public ReadOnlyObjectProperty<Duration> positionProperty() { + return positionProperty; + } + + @Override + public Duration getDuration() { + return durationProperty.get(); + } + + @Override + public ReadOnlyObjectProperty<Duration> durationProperty() { + return durationProperty; + } + + @Override + public void setVolume(double volume) { + audioHandler.setVolume((float) volume); + } + + @Override + public boolean isMediaLoaded() { + return audioHandler != null; + } + + @Override + public void loadMedia(Path[] paths) { + if (audioHandler == null) + audioHandler = new NativeAudio(); + audioHandler.load(paths[0].toString()); + Platform.runLater(() -> { + durationProperty.set(Duration.millis(audioHandler.getDuration())); + getContent().getPad().setStatus(PadStatus.READY); + }); + } + + @Override + public void unloadMedia() { + audioHandler.unload(); + audioHandler = null; + } + +} diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinPluginImpl.java b/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinPluginImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..b20dd30b48f06fd0d05c2e580e41de3b859f2d94 --- /dev/null +++ b/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinPluginImpl.java @@ -0,0 +1,98 @@ +package de.tobias.playpad.nawin; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; + +import de.tobias.playpad.PlayPadPlugin; +import de.tobias.playpad.audio.AudioRegistry; +import de.tobias.playpad.nawin.audio.NativeAudioWinHandlerConnect; +import de.tobias.playpad.nawin.audio.NativeAudioWinPlugin; +import de.tobias.playpad.plugin.Module; +import de.tobias.updater.client.Updatable; +import de.tobias.utils.application.App; +import de.tobias.utils.application.ApplicationUtils; +import de.tobias.utils.application.container.PathType; +import de.tobias.utils.util.IOUtils; +import de.tobias.utils.util.OS; +import net.sf.jni4net.Bridge; +import net.xeoh.plugins.base.annotations.PluginImplementation; +import net.xeoh.plugins.base.annotations.events.PluginLoaded; +import net.xeoh.plugins.base.annotations.events.Shutdown; + +@PluginImplementation +public class NativeAudioWinPluginImpl implements NativeAudioWinPlugin { + + private static final String ASSETS = "de/tobias/playpad/nawin/assets/"; + + private static final String NAME = "NativeAudioWin"; + private static final String IDENTIFIER = "de.tobias.playpad.nawin.NativeAudioWinPluginImpl"; + + private Module module; + private Updatable updatable; + + @PluginLoaded + public void onLoaded(NativeAudioWinPlugin plugin) { + module = new Module(NAME, IDENTIFIER); + updatable = new NativeAudioWinUpdater(); + + try { + prepareBridging(); + bridgeCsharp(); + + if (OS.isWindows()) { + AudioRegistry registry = PlayPadPlugin.getRegistryCollection().getAudioHandlers(); + registry.registerComponent(new NativeAudioWinHandlerConnect(), "NativeWin", module); + } + } catch (IOException e) { + e.printStackTrace(); + } + } + + private void prepareBridging() throws IOException { + App app = ApplicationUtils.getApplication(); + Path resourceFolder = app.getPath(PathType.LIBRARY, "nawin"); + 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"); + } + + private void copyResource(Path resourceFolder, String packageName, String file) throws IOException { + IOUtils.copy(getClass().getClassLoader().getResourceAsStream(packageName + file), resourceFolder.resolve(file)); + System.out.println("Copied: " + file); + } + + private void bridgeCsharp() throws IOException { + Bridge.setVerbose(true); + Bridge.init(); + + App app = ApplicationUtils.getApplication(); + Path resourceFolder = app.getPath(PathType.LIBRARY, "nawin"); + + Bridge.LoadAndRegisterAssemblyFrom(resourceFolder.resolve("NativeAudio.j4n.dll").toFile()); + } + + @Shutdown + public void onShutdown() { + + } + + @Override + public Module getModule() { + return module; + } + + @Override + public Updatable getUpdatable() { + return updatable; + } +} diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinUpdater.java b/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinUpdater.java new file mode 100644 index 0000000000000000000000000000000000000000..eb30fc50e412031a03cd7c5f5955319a4700dfb5 --- /dev/null +++ b/PlayWallNativeWin/src/de/tobias/playpad/nawin/NativeAudioWinUpdater.java @@ -0,0 +1,79 @@ +package de.tobias.playpad.nawin; + +import java.io.IOException; +import java.net.URL; +import java.nio.file.Path; + +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import de.tobias.updater.client.Updatable; +import de.tobias.updater.client.UpdateChannel; +import de.tobias.utils.application.App; +import de.tobias.utils.application.ApplicationUtils; +import de.tobias.utils.application.container.PathType; + +public class NativeAudioWinUpdater implements Updatable { + + private int newBuild; + private String newVersion; + private URL remotePath; + + private String localFileName; + private String name; + + @Override + public int getCurrentBuild() { + return 1; + } + + @Override + public String getCurrentVersion() { + return "1.0"; + } + + @Override + public int getNewBuild() { + return newBuild; + } + + @Override + public String getNewVersion() { + return newVersion; + } + + @Override + public void loadInformation(UpdateChannel channel) throws IOException { + App app = ApplicationUtils.getMainApplication(); + URL url = new URL(app.getInfo().getUpdateURL() + "/" + channel + "/plugins.yml"); + FileConfiguration config = YamlConfiguration.loadConfiguration(url.openStream()); + + newBuild = config.getInt("plugins.nawin.build"); + newVersion = config.getString("plugins.nawin.version"); + remotePath = new URL(config.getString("plugins.nawin.url")); + localFileName = config.getString("plugins.nawin.filename"); + name = config.getString("plugins.nawin.name"); + + } + + @Override + public boolean isUpdateAvailable() { + return getCurrentBuild() < getNewBuild(); + } + + @Override + public URL getDownloadPath() { + return remotePath; + } + + @Override + public Path getLocalPath() { + return ApplicationUtils.getApplication().getPath(PathType.LIBRARY, localFileName); + } + + @Override + public String name() { + return name; + } + +} diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NAudio.dll b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..9dd5ae7de34d2bc2dcf934eb027fa60d20237c3d Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NAudio.dll differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.dll b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.dll new file mode 100644 index 0000000000000000000000000000000000000000..e85f118b0af0c8c9a03777d25938e76a635adcb1 Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.dll differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.j4n.dll b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.j4n.dll new file mode 100644 index 0000000000000000000000000000000000000000..7b2db090abeaaf57e7cd652f28caf10bfbfa1d56 Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.j4n.dll differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.j4n.jar b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.j4n.jar new file mode 100644 index 0000000000000000000000000000000000000000..8f888bc0ebad18acd661a0d0ea694791d69778a4 Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/NativeAudio.j4n.jar differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.j-0.8.8.0.jar b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.j-0.8.8.0.jar new file mode 100644 index 0000000000000000000000000000000000000000..922c2ad94d8c7a0a75f3613450819eb02e6d2757 Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.j-0.8.8.0.jar differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n-0.8.8.0.dll b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n-0.8.8.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..2c7dc61711aea95d4a9d27f72ee9b540625ec0da Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n-0.8.8.0.dll differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n.w32.v40-0.8.8.0.dll b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n.w32.v40-0.8.8.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..e90e34defd278af539cd5d40a44f5d5f6b3b983d Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n.w32.v40-0.8.8.0.dll differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n.w64.v40-0.8.8.0.dll b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n.w64.v40-0.8.8.0.dll new file mode 100644 index 0000000000000000000000000000000000000000..6ff98f1eca73982a4d293447484864290d2d2170 Binary files /dev/null and b/PlayWallNativeWin/src/de/tobias/playpad/nawin/assets/jni4net.n.w64.v40-0.8.8.0.dll differ diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java b/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java new file mode 100644 index 0000000000000000000000000000000000000000..38c20064b015bdcc7e1438c8f705dcbf6cbf117d --- /dev/null +++ b/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java @@ -0,0 +1,26 @@ +package de.tobias.playpad.nawin.audio; + +import de.tobias.playpad.audio.AudioHandler; +import de.tobias.playpad.audio.AudioHandlerConnect; +import de.tobias.playpad.nawin.NativeAudioWinHandler; +import de.tobias.playpad.pad.conntent.PadContent; +import de.tobias.playpad.viewcontroller.AudioHandlerViewController; + +public class NativeAudioWinHandlerConnect extends AudioHandlerConnect { + + @Override + public AudioHandler createAudioHandler(PadContent content) { + return new NativeAudioWinHandler(content); + } + + @Override + public AudioHandlerViewController getAudioHandlerSettingsViewController() { + return null; + } + + @Override + public String getType() { + return "NativeWin"; + } + +} diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinPlugin.java b/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinPlugin.java new file mode 100644 index 0000000000000000000000000000000000000000..21d877b6fa47a505c92f23c78f155144da560257 --- /dev/null +++ b/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinPlugin.java @@ -0,0 +1,7 @@ +package de.tobias.playpad.nawin.audio; + +import de.tobias.playpad.plugin.AdvancedPlugin; + +public interface NativeAudioWinPlugin extends AdvancedPlugin { + +}