From bc040098b5576087a3e6b84c27bba51a5f0a8d0c Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Wed, 7 Sep 2016 11:45:44 +0200
Subject: [PATCH] Add callback and registry

---
 PlayWall/.classpath                           |   1 +
 .../src/de/tobias/playpad/PlayPadImpl.java    |   2 ++
 PlayWallNative/libNativeAudio.dylib           | Bin 29264 -> 0 bytes
 .../src/de/tobias/playpad/NativeAudio.java    |  24 ++++++++++++++--
 .../tobias/playpad/NativeAudioMacHandler.java |   9 ++++--
 .../playpad/NativeAudioMacHandlerConnect.java |  27 ++++++++++++++++--
 6 files changed, 55 insertions(+), 8 deletions(-)
 delete mode 100755 PlayWallNative/libNativeAudio.dylib

diff --git a/PlayWall/.classpath b/PlayWall/.classpath
index a8ad48e8..699df52e 100644
--- a/PlayWall/.classpath
+++ b/PlayWall/.classpath
@@ -15,5 +15,6 @@
 	<classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/JLayer"/>
 	<classpathentry combineaccessrules="false" kind="src" path="/PlayWallCore"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.junit.JUNIT_CONTAINER/4"/>
+	<classpathentry combineaccessrules="false" kind="src" path="/PlayWallNative"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/PlayWall/src/de/tobias/playpad/PlayPadImpl.java b/PlayWall/src/de/tobias/playpad/PlayPadImpl.java
index 83b0ae9f..e4ffc6b9 100644
--- a/PlayWall/src/de/tobias/playpad/PlayPadImpl.java
+++ b/PlayWall/src/de/tobias/playpad/PlayPadImpl.java
@@ -235,6 +235,8 @@ public class PlayPadImpl implements PlayPad {
 			registryCollection.getTriggerItems().loadComponentsFromFile("de/tobias/playpad/components/Trigger.xml");
 			registryCollection.getMainLayouts().loadComponentsFromFile("de/tobias/playpad/components/Layout.xml");
 
+			registryCollection.getAudioHandlers().registerComponent(new NativeAudioMacHandlerConnect(), "Native");
+			
 			// Set Default
 			registryCollection.getAudioHandlers().setDefaultID(JavaFXAudioHandler.TYPE);
 			registryCollection.getDesigns().setDefaultID(ModernGlobalDesign.TYPE);
diff --git a/PlayWallNative/libNativeAudio.dylib b/PlayWallNative/libNativeAudio.dylib
deleted file mode 100755
index af9683034b4ac9019e84a3b0edde7f700584143c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001

literal 29264
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

diff --git a/PlayWallNative/src/de/tobias/playpad/NativeAudio.java b/PlayWallNative/src/de/tobias/playpad/NativeAudio.java
index a3b74ed8..ae297856 100644
--- a/PlayWallNative/src/de/tobias/playpad/NativeAudio.java
+++ b/PlayWallNative/src/de/tobias/playpad/NativeAudio.java
@@ -2,6 +2,8 @@ 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);
@@ -9,9 +11,9 @@ public class NativeAudio {
 	public static native void stop(int id);
 
 	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);
@@ -19,6 +21,22 @@ public class NativeAudio {
 	public static native void dispose(int id);
 
 	public static native double getDuration(int id);
-	
+
 	public static native double getPosition(int id);
+
+	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 {
+		public void onFinish(int id);
+	}
 }
diff --git a/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandler.java b/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandler.java
index 174c3281..2ff8be3a 100644
--- a/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandler.java
+++ b/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandler.java
@@ -59,13 +59,17 @@ public class NativeAudioMacHandler extends AudioHandler {
 
 		positionThread.start();
 	}
-
+	
 	public NativeAudioMacHandler(PadContent content) {
 		super(content);
 
 		id = counter++;
 		positionProperty = new SimpleObjectProperty<>();
-		durationProperty = new SimpleObjectProperty<>();
+		durationProperty = new SimpleObjectProperty<>();		
+	}
+	
+	protected int getId() {
+		return id;
 	}
 
 	@Override
@@ -161,5 +165,4 @@ public class NativeAudioMacHandler extends AudioHandler {
 	public void unloadMedia() {
 		NativeAudio.dispose(id);
 	}
-
 }
diff --git a/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java b/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java
index 18f7a20b..6b70456a 100644
--- a/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java
+++ b/PlayWallNative/src/de/tobias/playpad/NativeAudioMacHandlerConnect.java
@@ -1,15 +1,28 @@
 package de.tobias.playpad;
 
+import java.util.HashMap;
+
+import de.tobias.playpad.NativeAudio.NativeAudioDelegate;
 import de.tobias.playpad.audio.AudioHandler;
 import de.tobias.playpad.audio.AudioHandlerConnect;
+import de.tobias.playpad.pad.PadStatus;
 import de.tobias.playpad.pad.conntent.PadContent;
 import de.tobias.playpad.viewcontroller.AudioHandlerViewController;
 
-public class NativeAudioMacHandlerConnect extends AudioHandlerConnect {
+public class NativeAudioMacHandlerConnect extends AudioHandlerConnect implements NativeAudioDelegate {
+
+	private static final HashMap<Integer, NativeAudioMacHandler> handlers = new HashMap<>();
+
+	public NativeAudioMacHandlerConnect() {
+		NativeAudio.initialize();
+		NativeAudio.setDelegate(this);
+	}
 
 	@Override
 	public AudioHandler createAudioHandler(PadContent content) {
-		return new NativeAudioMacHandler(content);
+		NativeAudioMacHandler nativeAudioMacHandler = new NativeAudioMacHandler(content);
+		handlers.put(nativeAudioMacHandler.getId(), nativeAudioMacHandler);
+		return nativeAudioMacHandler;
 	}
 
 	@Override
@@ -22,4 +35,14 @@ public class NativeAudioMacHandlerConnect extends AudioHandlerConnect {
 		return "Native";
 	}
 
+	@Override
+	public void onFinish(int id) {
+		NativeAudioMacHandler nativeAudioMacHandler = handlers.get(id);
+		if (nativeAudioMacHandler != null) {
+			PadContent content = nativeAudioMacHandler.getContent();
+			if (content != null) {
+				content.getPad().setStatus(PadStatus.STOP);
+			}
+		}
+	}
 }
-- 
GitLab