From a38d57862368569915d263657a4be7be8204df7a Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Sat, 6 Jul 2019 22:19:09 +0200
Subject: [PATCH] Add sound card options to native mac audio (Fixed #125)

---
 .../playpad/audio/TinyAudioHandler.java       |   1 -
 .../audio/mac/AVAudioPlayerBridge.java        |  18 ++-
 .../tobias/playpad/audio/mac/AudioDevice.java |  45 +++++++
 .../audio/mac/NativeAudioMacHandler.java      |  30 ++++-
 .../mac/NativeAudioMacHandlerFactory.java     |  49 ++-----
 .../delegate/AVAudioPlayerBridgeDelegate.java |  48 +++++++
 .../NativeAudioMacSettingsViewController.java | 123 ++++++++++++++++++
 .../audio/windows/NativeAudioWinHandler.java  |   2 +-
 .../windows/NativeAudioWinHandlerFactory.java |   6 +-
 ...NativeAudioWinSettingsViewController.java} |  11 +-
 ...as_playpad_audio_mac_AVAudioPlayerBridge.h |  24 ++++
 .../main/resources/mac/libNativeAudio.dylib   | Bin 75248 -> 83712 bytes
 .../src/main/resources/mac/namacSettings.fxml |  12 ++
 13 files changed, 316 insertions(+), 53 deletions(-)
 create mode 100644 PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AudioDevice.java
 create mode 100644 PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/delegate/AVAudioPlayerBridgeDelegate.java
 create mode 100644 PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/settings/NativeAudioMacSettingsViewController.java
 rename PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/{NativeAudioSettingsViewController.java => NativeAudioWinSettingsViewController.java} (86%)
 create mode 100644 PlayWallPluginNativeAudio/src/main/resources/mac/namacSettings.fxml

diff --git a/PlayWallComponents/src/main/java/de/tobias/playpad/audio/TinyAudioHandler.java b/PlayWallComponents/src/main/java/de/tobias/playpad/audio/TinyAudioHandler.java
index 2c00a705..8521b0bf 100644
--- a/PlayWallComponents/src/main/java/de/tobias/playpad/audio/TinyAudioHandler.java
+++ b/PlayWallComponents/src/main/java/de/tobias/playpad/audio/TinyAudioHandler.java
@@ -37,7 +37,6 @@ public class TinyAudioHandler extends AudioHandler implements Soundcardable, See
 	public static final String SOUND_CARD = "SoundCard";
 
 	static final String TYPE = "TinyAudio";
-	public static final String NAME = "Java Audiostream";
 	private static final String MP3 = "mp3";
 
 	private static final int SLEEP_TIME_POSITION = 50;
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
index 10dfd45c..d7ef0648 100644
--- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AVAudioPlayerBridge.java
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AVAudioPlayerBridge.java
@@ -14,9 +14,7 @@ public class AVAudioPlayerBridge {
 
 
 	static {
-		System.out.println("static init start");
 		initialize();
-		System.out.println("static init end");
 	}
 
 	private static native void initialize();
@@ -29,6 +27,8 @@ public class AVAudioPlayerBridge {
 
 	public native void play();
 
+	public native boolean isPlaying();
+
 	public native void pause();
 
 	public native void stop();
@@ -51,6 +51,14 @@ public class AVAudioPlayerBridge {
 
 	public native void setRate(double rate);
 
+	public static native AudioDevice[] getAudioDevices();
+
+	public native void setCurrentAudioDevice(String id);
+
+	/*
+	Delegate methods
+	 */
+
 	public void onPeakMeter(float left, float right) {
 		if (delegate != null) {
 			delegate.onPeakMeter(this, left, right);
@@ -69,10 +77,10 @@ public class AVAudioPlayerBridge {
 		}
 	}
 
-	private static NativeAudioDelegate delegate;
+	private NativeAudioDelegate delegate;
 
-	public static void setDelegate(NativeAudioDelegate delegate) {
-		AVAudioPlayerBridge.delegate = delegate;
+	public void setDelegate(NativeAudioDelegate delegate) {
+		this.delegate = delegate;
 	}
 
 	public interface NativeAudioDelegate {
diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AudioDevice.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AudioDevice.java
new file mode 100644
index 00000000..675ddc3e
--- /dev/null
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/AudioDevice.java
@@ -0,0 +1,45 @@
+package de.tobias.playpad.audio.mac;
+
+import java.util.Objects;
+
+public class AudioDevice {
+	private final String name;
+	private final String vendor;
+	private final String id;
+
+	public AudioDevice(String name, String vendor, String id) {
+		this.name = name;
+		this.vendor = vendor;
+		this.id = id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public String getVendor() {
+		return vendor;
+	}
+
+	public String getId() {
+		return id;
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if (this == o) return true;
+		if (!(o instanceof AudioDevice)) return false;
+		AudioDevice that = (AudioDevice) o;
+		return Objects.equals(name, that.name);
+	}
+
+	@Override
+	public int hashCode() {
+		return Objects.hash(name);
+	}
+
+	@Override
+	public String toString() {
+		return name;
+	}
+}
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 9a333170..0e94b7cb 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
@@ -3,18 +3,24 @@ package de.tobias.playpad.audio.mac;
 import de.thecodelabs.utils.threading.Worker;
 import de.tobias.playpad.audio.AudioHandler;
 import de.tobias.playpad.audio.Peakable;
+import de.tobias.playpad.audio.Soundcardable;
 import de.tobias.playpad.pad.PadStatus;
 import de.tobias.playpad.pad.content.PadContent;
 import de.tobias.playpad.pad.content.play.Seekable;
+import de.tobias.playpad.profile.Profile;
 import javafx.application.Platform;
 import javafx.beans.property.*;
 import javafx.util.Duration;
 
 import java.nio.file.Path;
+import java.util.Optional;
+import java.util.stream.Stream;
 
-public class NativeAudioMacHandler extends AudioHandler implements Peakable, Seekable {
+public class NativeAudioMacHandler extends AudioHandler implements Peakable, Seekable, Soundcardable {
 
-	ObjectProperty<Duration> positionProperty;
+	public static final String SOUND_CARD = "SoundCardMac";
+
+	private ObjectProperty<Duration> positionProperty;
 	private ObjectProperty<Duration> durationProperty;
 	private boolean isLoaded;
 
@@ -66,7 +72,7 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See
 	}
 
 	@Override
-	public ReadOnlyObjectProperty<Duration> positionProperty() {
+	public ObjectProperty<Duration> positionProperty() {
 		return positionProperty;
 	}
 
@@ -96,6 +102,9 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See
 		{
 			isLoaded = bridge.load(paths[0].toString());
 			if (isLoaded) {
+				String name = (String) Profile.currentProfile().getProfileSettings().getAudioUserInfo().get(SOUND_CARD);
+				setOutputDevice(name);
+
 				Platform.runLater(() ->
 				{
 					durationProperty.set(Duration.seconds(bridge.getDuration()));
@@ -128,4 +137,19 @@ public class NativeAudioMacHandler extends AudioHandler implements Peakable, See
 	public double getAudioLevel(Channel channel) {
 		return audioLevelProperty(channel).get();
 	}
+
+	private AudioDevice[] devices;
+
+	@Override
+	public void setOutputDevice(String name) {
+		if (devices == null) {
+			devices = AVAudioPlayerBridge.getAudioDevices();
+		}
+
+		final Optional<String> first = Stream.of(devices)
+				.filter(device -> device.getName().equals(name))
+				.map(AudioDevice::getId)
+				.findFirst();
+		first.ifPresent(s -> bridge.setCurrentAudioDevice(s));
+	}
 }
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 045740ee..732b79ac 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
@@ -3,72 +3,51 @@ package de.tobias.playpad.audio.mac;
 import de.tobias.playpad.audio.AudioCapability;
 import de.tobias.playpad.audio.AudioHandler;
 import de.tobias.playpad.audio.AudioHandlerFactory;
-import de.tobias.playpad.audio.Peakable.Channel;
-import de.tobias.playpad.audio.mac.AVAudioPlayerBridge.NativeAudioDelegate;
-import de.tobias.playpad.pad.PadStatus;
+import de.tobias.playpad.audio.mac.delegate.AVAudioPlayerBridgeDelegate;
+import de.tobias.playpad.audio.mac.settings.NativeAudioMacSettingsViewController;
+import de.tobias.playpad.audio.windows.NativeAudioWinHandler;
 import de.tobias.playpad.pad.content.PadContent;
 import de.tobias.playpad.viewcontroller.AudioHandlerViewController;
-import javafx.util.Duration;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Optional;
 
-public class NativeAudioMacHandlerFactory extends AudioHandlerFactory implements NativeAudioDelegate {
+public class NativeAudioMacHandlerFactory extends AudioHandlerFactory {
 
 	private List<NativeAudioMacHandler> handlers = new ArrayList<>();
+	private AVAudioPlayerBridgeDelegate bridgeDelegate = new AVAudioPlayerBridgeDelegate(this);
 
-	private Optional<NativeAudioMacHandler> getHandlerByBridge(AVAudioPlayerBridge bridge) {
+	public Optional<NativeAudioMacHandler> getHandlerByBridge(AVAudioPlayerBridge bridge) {
 		return handlers.stream().filter(handler -> handler.getBridge().equals(bridge)).findFirst();
 	}
 
 	public NativeAudioMacHandlerFactory(String type) {
 		super(type);
-		AVAudioPlayerBridge.setDelegate(this);
 	}
 
 	@Override
 	public AudioHandler createAudioHandler(PadContent content) {
 		NativeAudioMacHandler nativeAudioMacHandler = new NativeAudioMacHandler(content);
+		nativeAudioMacHandler.getBridge().setDelegate(bridgeDelegate);
 		handlers.add(nativeAudioMacHandler);
 		return nativeAudioMacHandler;
 	}
 
-	@Override
-	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(AVAudioPlayerBridge bridge, double position) {
-		Optional<NativeAudioMacHandler> nativeAudioMacHandler = getHandlerByBridge(bridge);
-		nativeAudioMacHandler.ifPresent(audioMacHandler -> {
-			audioMacHandler.positionProperty.set(Duration.seconds(position));
-		});
-	}
-
-	@Override
-	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
 	public boolean isFeatureAvailable(AudioCapability audioCapability) {
+		for (Class<?> clazz : NativeAudioWinHandler.class.getInterfaces()) {
+			if (clazz.equals(audioCapability.getAudioFeature()))
+				return true;
+		}
 		return false;
 	}
 
 	@Override
 	public AudioHandlerViewController getAudioFeatureSettings(AudioCapability audioCapability) {
+		if (audioCapability == AudioCapability.SOUNDCARD) {
+			return new NativeAudioMacSettingsViewController();
+		}
 		return null;
 	}
 }
diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/delegate/AVAudioPlayerBridgeDelegate.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/delegate/AVAudioPlayerBridgeDelegate.java
new file mode 100644
index 00000000..4b6ec1af
--- /dev/null
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/delegate/AVAudioPlayerBridgeDelegate.java
@@ -0,0 +1,48 @@
+package de.tobias.playpad.audio.mac.delegate;
+
+import de.tobias.playpad.audio.Peakable;
+import de.tobias.playpad.audio.mac.AVAudioPlayerBridge;
+import de.tobias.playpad.audio.mac.NativeAudioMacHandler;
+import de.tobias.playpad.audio.mac.NativeAudioMacHandlerFactory;
+import de.tobias.playpad.pad.PadStatus;
+import de.tobias.playpad.pad.content.PadContent;
+import javafx.util.Duration;
+
+import java.util.Optional;
+
+public class AVAudioPlayerBridgeDelegate implements AVAudioPlayerBridge.NativeAudioDelegate {
+
+	private NativeAudioMacHandlerFactory factory;
+
+	public AVAudioPlayerBridgeDelegate(NativeAudioMacHandlerFactory factory) {
+		this.factory = factory;
+	}
+
+	@Override
+	public void onFinish(AVAudioPlayerBridge bridge) {
+		Optional<NativeAudioMacHandler> nativeAudioMacHandler = factory.getHandlerByBridge(bridge);
+		nativeAudioMacHandler.ifPresent(handler -> {
+			PadContent content = handler.getContent();
+			if (content != null) {
+				content.getPad().setStatus(PadStatus.STOP);
+			}
+		});
+	}
+
+	@Override
+	public void onPositionChanged(AVAudioPlayerBridge bridge, double position) {
+		Optional<NativeAudioMacHandler> nativeAudioMacHandler = factory.getHandlerByBridge(bridge);
+		nativeAudioMacHandler.ifPresent(audioMacHandler -> {
+			audioMacHandler.positionProperty().set(Duration.seconds(position));
+		});
+	}
+
+	@Override
+	public void onPeakMeter(AVAudioPlayerBridge bridge, float left, float right) {
+		Optional<NativeAudioMacHandler> nativeAudioMacHandler = factory.getHandlerByBridge(bridge);
+		nativeAudioMacHandler.ifPresent(handler -> {
+			handler.audioLevelProperty(Peakable.Channel.LEFT).set(left);
+			handler.audioLevelProperty(Peakable.Channel.RIGHT).set(right);
+		});
+	}
+}
diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/settings/NativeAudioMacSettingsViewController.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/settings/NativeAudioMacSettingsViewController.java
new file mode 100644
index 00000000..34f777e5
--- /dev/null
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/mac/settings/NativeAudioMacSettingsViewController.java
@@ -0,0 +1,123 @@
+package de.tobias.playpad.audio.mac.settings;
+
+import de.thecodelabs.utils.application.App;
+import de.thecodelabs.utils.application.ApplicationUtils;
+import de.thecodelabs.utils.application.container.PathType;
+import de.thecodelabs.utils.ui.icon.FontAwesomeType;
+import de.thecodelabs.utils.ui.icon.FontIcon;
+import de.tobias.playpad.audio.mac.AVAudioPlayerBridge;
+import de.tobias.playpad.audio.mac.AudioDevice;
+import de.tobias.playpad.audio.mac.NativeAudioMacHandler;
+import de.tobias.playpad.profile.Profile;
+import de.tobias.playpad.profile.ProfileSettings;
+import de.tobias.playpad.viewcontroller.AudioHandlerViewController;
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.Button;
+import javafx.scene.control.ComboBox;
+
+import java.nio.file.Path;
+
+public class NativeAudioMacSettingsViewController extends AudioHandlerViewController implements AVAudioPlayerBridge.NativeAudioDelegate {
+
+	private static final String TEST_SOUND_WAV = "Test-Sound.wav";
+
+	@FXML
+	private ComboBox<AudioDevice> soundCardComboBox;
+	@FXML
+	private Button testButton;
+
+	private AVAudioPlayerBridge audioPlayer = new AVAudioPlayerBridge();
+
+	private boolean isChanged;
+
+	public NativeAudioMacSettingsViewController() {
+		super("namacSettings", "mac", null);
+		final ProfileSettings profileSettings = Profile.currentProfile().getProfileSettings();
+
+		testButton.setGraphic(new FontIcon(FontAwesomeType.PLAY));
+
+		// load test sound
+		final App app = ApplicationUtils.getApplication();
+		Path file = app.getPath(PathType.RESOURCES, TEST_SOUND_WAV);
+		app.getClasspathResource(TEST_SOUND_WAV).copy(PathType.RESOURCES, TEST_SOUND_WAV);
+
+		audioPlayer.setDelegate(this);
+		audioPlayer.load(file.toString());
+
+		soundCardComboBox.getItems().setAll(AVAudioPlayerBridge.getAudioDevices());
+
+		String name = (String) profileSettings.getAudioUserInfo().get(NativeAudioMacHandler.SOUND_CARD);
+		for (AudioDevice device : AVAudioPlayerBridge.getAudioDevices()) {
+			if (device.getName().equals(name)) {
+				soundCardComboBox.getSelectionModel().select(device);
+				break;
+			}
+		}
+
+		// ersten Auswählen wenn keiner ausgewählt ist, damit keine Probleme
+		// auftreten da keiene Soundkarte ausgewäht ist
+		if (soundCardComboBox.getSelectionModel().getSelectedItem() == null) {
+			soundCardComboBox.getSelectionModel().selectFirst();
+		}
+
+		soundCardComboBox.getSelectionModel().selectedItemProperty().addListener((a, b, c) -> {
+			if (audioPlayer != null) {
+				audioPlayer.stop();
+				testButton.setGraphic(new FontIcon(FontAwesomeType.PLAY));
+			}
+
+			isChanged = true;
+			profileSettings.getAudioUserInfo().put(NativeAudioMacHandler.SOUND_CARD, c.getName());
+		});
+	}
+
+	@Override
+	public void onClose() {
+		if (audioPlayer != null) {
+			audioPlayer.stop();
+			audioPlayer = null;
+		}
+	}
+
+	@FXML
+	private void testButtonHandler(ActionEvent event) {
+		if (audioPlayer == null) {
+			return;
+		}
+
+		if (audioPlayer.isPlaying()) {
+			audioPlayer.stop();
+			testButton.setGraphic(new FontIcon(FontAwesomeType.PLAY));
+		} else {
+			audioPlayer.setCurrentAudioDevice(soundCardComboBox.getValue().getId());
+			audioPlayer.play();
+			testButton.setGraphic(new FontIcon(FontAwesomeType.STOP));
+		}
+	}
+
+	@Override
+	public boolean isChanged() {
+		return isChanged;
+	}
+
+	/*
+	AVAudioPlayerBridge.NativeAudioDelegate
+	 */
+
+	@Override
+	public void onFinish(AVAudioPlayerBridge bridge) {
+		Platform.runLater(() -> testButton.setGraphic(new FontIcon(FontAwesomeType.PLAY)));
+	}
+
+	@Override
+	public void onPeakMeter(AVAudioPlayerBridge bridge, float left, float right) {
+
+	}
+
+	@Override
+	public void onPositionChanged(AVAudioPlayerBridge bridge, double position) {
+
+	}
+}
diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandler.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandler.java
index c38de5f0..54bc85c6 100644
--- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandler.java
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandler.java
@@ -162,7 +162,7 @@ public class NativeAudioWinHandler extends AudioHandler implements Soundcardable
 		audioHandler.load(paths[0].toString());
 
 		String name = (String) Profile.currentProfile().getProfileSettings().getAudioUserInfo().get(NativeAudioWinHandler.SOUND_CARD);
-		audioHandler.setDevice(name);
+		setOutputDevice(name);
 
 		Platform.runLater(() ->
 		{
diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandlerFactory.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandlerFactory.java
index 2b6d0986..ab3f5a06 100644
--- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandlerFactory.java
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinHandlerFactory.java
@@ -27,9 +27,9 @@ public class NativeAudioWinHandlerFactory extends AudioHandlerFactory {
 	}
 
 	@Override
-	public AudioHandlerViewController getAudioFeatureSettings(AudioCapability audioCapablility) {
-		if (audioCapablility == AudioCapability.SOUNDCARD) {
-			return new NativeAudioSettingsViewController();
+	public AudioHandlerViewController getAudioFeatureSettings(AudioCapability audioCapability) {
+		if (audioCapability == AudioCapability.SOUNDCARD) {
+			return new NativeAudioWinSettingsViewController();
 		}
 		return null;
 	}
diff --git a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioSettingsViewController.java b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinSettingsViewController.java
similarity index 86%
rename from PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioSettingsViewController.java
rename to PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinSettingsViewController.java
index e1c0b265..e38eb3dc 100644
--- a/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioSettingsViewController.java
+++ b/PlayWallPluginNativeAudio/src/main/java/de/tobias/playpad/audio/windows/NativeAudioWinSettingsViewController.java
@@ -7,6 +7,7 @@ import de.thecodelabs.utils.threading.Worker;
 import de.thecodelabs.utils.ui.icon.FontAwesomeType;
 import de.thecodelabs.utils.ui.icon.FontIcon;
 import de.tobias.playpad.profile.Profile;
+import de.tobias.playpad.profile.ProfileSettings;
 import de.tobias.playpad.viewcontroller.AudioHandlerViewController;
 import javafx.application.Platform;
 import javafx.event.ActionEvent;
@@ -17,7 +18,7 @@ import nativeaudio.NativeAudio;
 
 import java.nio.file.Path;
 
-public class NativeAudioSettingsViewController extends AudioHandlerViewController {
+public class NativeAudioWinSettingsViewController extends AudioHandlerViewController {
 
 	private static final String TEST_SOUND_WAV = "Test-Sound.wav";
 
@@ -30,15 +31,15 @@ public class NativeAudioSettingsViewController extends AudioHandlerViewControlle
 
 	private NativeAudio audioPlayer;
 
-	NativeAudioSettingsViewController() {
+	NativeAudioWinSettingsViewController() {
 		super("nawinSettings", "win", null);
+		final ProfileSettings profileSettings = Profile.currentProfile().getProfileSettings();
 
 		testButton.setGraphic(new FontIcon(FontAwesomeType.PLAY));
 
 		soundCardComboBox.getItems().setAll(NativeAudio.getDevices());
 
-		String name = (String) Profile.currentProfile().getProfileSettings().getAudioUserInfo()
-				.get(NativeAudioWinHandler.SOUND_CARD);
+		String name = (String) profileSettings.getAudioUserInfo().get(NativeAudioWinHandler.SOUND_CARD);
 		for (String info : NativeAudio.getDevices()) {
 			if (info.equals(name)) {
 				soundCardComboBox.getSelectionModel().select(info);
@@ -60,7 +61,7 @@ public class NativeAudioSettingsViewController extends AudioHandlerViewControlle
 			}
 
 			isChanged = true;
-			Profile.currentProfile().getProfileSettings().getAudioUserInfo().put(NativeAudioWinHandler.SOUND_CARD, c);
+			profileSettings.getAudioUserInfo().put(NativeAudioWinHandler.SOUND_CARD, c);
 		});
 	}
 
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
index 755158d7..1c09fe03 100644
--- a/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_audio_mac_AVAudioPlayerBridge.h
+++ b/PlayWallPluginNativeAudio/src/main/java/de_tobias_playpad_audio_mac_AVAudioPlayerBridge.h
@@ -31,6 +31,14 @@ JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_init
 JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_play
   (JNIEnv *, jobject);
 
+/*
+ * Class:     de_tobias_playpad_audio_mac_AVAudioPlayerBridge
+ * Method:    isPlaying
+ * Signature: ()Z
+ */
+JNIEXPORT jboolean JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_isPlaying
+  (JNIEnv *, jobject);
+
 /*
  * Class:     de_tobias_playpad_audio_mac_AVAudioPlayerBridge
  * Method:    pause
@@ -119,6 +127,22 @@ JNIEXPORT jdouble JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_g
 JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_setRate
   (JNIEnv *, jobject, jdouble);
 
+/*
+ * Class:     de_tobias_playpad_audio_mac_AVAudioPlayerBridge
+ * Method:    getAudioDevices
+ * Signature: ()[Lde/tobias/playpad/audio/mac/AudioDevice;
+ */
+JNIEXPORT jobjectArray JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_getAudioDevices
+  (JNIEnv *, jclass);
+
+/*
+ * Class:     de_tobias_playpad_audio_mac_AVAudioPlayerBridge
+ * Method:    setCurrentAudioDevice
+ * Signature: (Ljava/lang/String;)V
+ */
+JNIEXPORT void JNICALL Java_de_tobias_playpad_audio_mac_AVAudioPlayerBridge_setCurrentAudioDevice
+  (JNIEnv *, jobject, jstring);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib b/PlayWallPluginNativeAudio/src/main/resources/mac/libNativeAudio.dylib
index 262f9b8506783c5ed2d22ce93436bb63a0df1bf7..3b3e3996c854c711047b590c7c716ad86583be71 100755
GIT binary patch
literal 83712
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
I7#Se|0KQ<Dw*UYD

delta 20169
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
IVVvRy06yk`!~g&Q

diff --git a/PlayWallPluginNativeAudio/src/main/resources/mac/namacSettings.fxml b/PlayWallPluginNativeAudio/src/main/resources/mac/namacSettings.fxml
new file mode 100644
index 00000000..c52a5222
--- /dev/null
+++ b/PlayWallPluginNativeAudio/src/main/resources/mac/namacSettings.fxml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.ComboBox?>
+<?import javafx.scene.layout.HBox?>
+<HBox spacing="14.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
+    <children>
+        <ComboBox fx:id="soundCardComboBox" layoutX="118.0" layoutY="14.0" prefHeight="26.0" prefWidth="241.0"/>
+        <Button fx:id="testButton" layoutX="372.0" layoutY="14.0" mnemonicParsing="false"
+                onAction="#testButtonHandler"/>
+    </children>
+</HBox>
-- 
GitLab