From 3927e3183f93b4e0b8c1a6b305e58f1ce473bebe Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Tue, 4 Oct 2016 15:38:54 +0200
Subject: [PATCH] Add AudioCapability Feature

---
 .../tobias/playpad/assets/lang/_de.properties |  6 ++-
 .../assets/view/option/profile/audioTab.fxml  | 10 +++--
 .../audio/ClipAudioHandlerConnect.java        | 10 ++++-
 .../playpad/audio/JavaFXHandlerConnect.java   |  9 ++++
 .../audio/TinyAudioHandlerConnect.java        |  9 ++++
 .../profile/AudioTabViewController.java       | 43 +++++++++++++++----
 .../tobias/playpad/audio/AudioCapability.java | 27 ++++++++++++
 .../de/tobias/playpad/audio/AudioFeature.java | 11 +++++
 .../playpad/audio/AudioHandlerConnect.java    | 13 +++++-
 .../de/tobias/playpad/audio/Equalizable.java  |  2 +-
 .../tobias/playpad/audio/Soundcardable.java   | 14 ++++++
 .../audio/NativeAudioWinHandlerConnect.java   | 10 +++++
 12 files changed, 147 insertions(+), 17 deletions(-)
 create mode 100644 PlayWallCore/src/de/tobias/playpad/audio/AudioCapability.java
 create mode 100644 PlayWallCore/src/de/tobias/playpad/audio/AudioFeature.java
 create mode 100644 PlayWallCore/src/de/tobias/playpad/audio/Soundcardable.java

diff --git a/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties b/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties
index 0a16dc04..79621f24 100644
--- a/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties
+++ b/PlayWall/assets/de/tobias/playpad/assets/lang/_de.properties
@@ -289,4 +289,8 @@ Tooltip.Page.LeftMove=Nach links verschieben
 Tooltip.Page.RightMove=Nach rechts verschieben
 Tooltip.Page.Rename=Umbenennen
 Tooltip.Page.Clone=Duplizieren
-Tooltip.Page.Delete=L�schen
\ No newline at end of file
+Tooltip.Page.Delete=L�schen
+
+# Audio Features
+EQUALIZER=Equalizer:
+SOUNDCARD=Soundkarte:
\ No newline at end of file
diff --git a/PlayWall/assets/de/tobias/playpad/assets/view/option/profile/audioTab.fxml b/PlayWall/assets/de/tobias/playpad/assets/view/option/profile/audioTab.fxml
index 86cb23c1..4bd1254f 100644
--- a/PlayWall/assets/de/tobias/playpad/assets/view/option/profile/audioTab.fxml
+++ b/PlayWall/assets/de/tobias/playpad/assets/view/option/profile/audioTab.fxml
@@ -1,10 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+<?import javafx.geometry.*?>
 <?import java.lang.*?>
 <?import javafx.scene.control.*?>
 <?import javafx.scene.layout.*?>
 
-<AnchorPane xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
+<VBox spacing="14.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
    <children>
       <HBox layoutX="14.0" layoutY="14.0" spacing="14.0">
          <children>
@@ -12,6 +13,9 @@
             <ComboBox fx:id="audioTypeComboBox" layoutX="156.0" layoutY="14.0" prefHeight="26.0" prefWidth="226.0" />
          </children>
       </HBox>
-      <AnchorPane fx:id="audioUserInfoSettings" layoutX="14.0" layoutY="53.0" prefHeight="312.0" prefWidth="617.0" AnchorPane.bottomAnchor="14.0" AnchorPane.leftAnchor="14.0" AnchorPane.rightAnchor="14.0" AnchorPane.topAnchor="53.0" />
+      <VBox fx:id="options" prefHeight="200.0" prefWidth="100.0" spacing="14.0" />
    </children>
-</AnchorPane>
+   <padding>
+      <Insets bottom="14.0" left="14.0" right="14.0" top="14.0" />
+   </padding>
+</VBox>
diff --git a/PlayWall/src/de/tobias/playpad/audio/ClipAudioHandlerConnect.java b/PlayWall/src/de/tobias/playpad/audio/ClipAudioHandlerConnect.java
index bb004a44..55faa689 100644
--- a/PlayWall/src/de/tobias/playpad/audio/ClipAudioHandlerConnect.java
+++ b/PlayWall/src/de/tobias/playpad/audio/ClipAudioHandlerConnect.java
@@ -23,7 +23,15 @@ public class ClipAudioHandlerConnect extends AudioHandlerConnect implements Auto
 
 	@Override
 	public void close() throws Exception {
-		TinyAudioHandler.shutdown();
+		ClipAudioHandler.shutdown();
 	}
 
+	@Override
+	public boolean isFeatureAvaiable(AudioCapability audioCapability) {
+		for (Class<?> clazz : ClipAudioHandler.class.getInterfaces()) {
+			if (clazz.equals(audioCapability.getAudioFeature()))
+				return true;
+		}
+		return false;
+	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/audio/JavaFXHandlerConnect.java b/PlayWall/src/de/tobias/playpad/audio/JavaFXHandlerConnect.java
index baca001b..85cbfc72 100644
--- a/PlayWall/src/de/tobias/playpad/audio/JavaFXHandlerConnect.java
+++ b/PlayWall/src/de/tobias/playpad/audio/JavaFXHandlerConnect.java
@@ -19,4 +19,13 @@ public class JavaFXHandlerConnect extends AudioHandlerConnect {
 	public String getType() {
 		return JavaFXAudioHandler.TYPE;
 	}
+	
+	@Override
+	public boolean isFeatureAvaiable(AudioCapability audioCapability) {
+		for (Class<?> clazz : JavaFXAudioHandler.class.getInterfaces()) {
+			if (clazz.equals(audioCapability.getAudioFeature()))
+				return true;
+		}
+		return false;
+	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/audio/TinyAudioHandlerConnect.java b/PlayWall/src/de/tobias/playpad/audio/TinyAudioHandlerConnect.java
index cf8388f1..2a30f260 100644
--- a/PlayWall/src/de/tobias/playpad/audio/TinyAudioHandlerConnect.java
+++ b/PlayWall/src/de/tobias/playpad/audio/TinyAudioHandlerConnect.java
@@ -25,4 +25,13 @@ public class TinyAudioHandlerConnect extends AudioHandlerConnect implements Auto
 	public void close() throws Exception {
 		TinyAudioHandler.shutdown();
 	}
+
+	@Override
+	public boolean isFeatureAvaiable(AudioCapability audioCapability) {
+		for (Class<?> clazz : TinyAudioHandler.class.getInterfaces()) {
+			if (clazz.equals(audioCapability.getAudioFeature()))
+				return true;
+		}
+		return false;
+	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java
index e83f9a00..b7077096 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java
@@ -3,6 +3,8 @@ package de.tobias.playpad.viewcontroller.option.profile;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
+import de.tobias.playpad.audio.AudioCapability;
+import de.tobias.playpad.audio.AudioHandlerConnect;
 import de.tobias.playpad.audio.AudioRegistry;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.registry.NoSuchComponentException;
@@ -12,17 +14,24 @@ import de.tobias.playpad.viewcontroller.AudioHandlerViewController;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.IProfileReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
+import de.tobias.utils.ui.icon.FontAwesomeType;
+import de.tobias.utils.ui.icon.FontIcon;
 import de.tobias.utils.util.Localization;
 import javafx.concurrent.Task;
 import javafx.fxml.FXML;
+import javafx.geometry.Pos;
+import javafx.scene.Parent;
 import javafx.scene.control.ComboBox;
-import javafx.scene.layout.AnchorPane;
+import javafx.scene.control.Label;
+import javafx.scene.layout.HBox;
+import javafx.scene.layout.VBox;
 
 public class AudioTabViewController extends ProfileSettingsTabViewController implements IProfileReloadTask {
 
 	// Audio
 	@FXML private ComboBox<String> audioTypeComboBox;
-	@FXML private AnchorPane audioUserInfoSettings;
+	@FXML private VBox options;
+
 	private AudioHandlerViewController audioViewController;
 	private boolean changeAudioSettings;
 
@@ -31,7 +40,7 @@ public class AudioTabViewController extends ProfileSettingsTabViewController imp
 
 		if (playerActive) {
 			audioTypeComboBox.setDisable(true);
-			audioUserInfoSettings.setDisable(true);
+			options.setDisable(true);
 		}
 	}
 
@@ -60,21 +69,37 @@ public class AudioTabViewController extends ProfileSettingsTabViewController imp
 			}
 		}
 
-		audioUserInfoSettings.getChildren().clear();
+		options.getChildren().clear();
 
+		AudioRegistry audioHandlerRegistry = PlayPadPlugin.getRegistryCollection().getAudioHandlers();
 		try {
-			AudioRegistry audioHandlerRegistry = PlayPadPlugin.getRegistryCollection().getAudioHandlers();
-			audioViewController = audioHandlerRegistry.getComponent(classID).getAudioHandlerSettingsViewController();
+			AudioHandlerConnect audio = audioHandlerRegistry.getComponent(classID);
 
-			if (audioViewController != null) {
-				audioUserInfoSettings.getChildren().add(audioViewController.getParent());
+			for (AudioCapability audioCapability : AudioCapability.getFeatures()) {
+				options.getChildren().add(createCapabilityView(audio, audioCapability));
 			}
 		} catch (NoSuchComponentException e) {
 			e.printStackTrace();
-			// TODO Errorhandling
 		}
 	}
 
+	private Parent createCapabilityView(AudioHandlerConnect audio, AudioCapability audioCapability) {
+		HBox hbox = new HBox(14);
+		Label nameLabel = new Label(Localization.getString(audioCapability.getName()));
+		nameLabel.setAlignment(Pos.CENTER_RIGHT);
+		nameLabel.setMinWidth(150);
+
+		Label availableLabel;
+		if (audio.isFeatureAvaiable(audioCapability)) {
+			availableLabel = new FontIcon(FontAwesomeType.CHECK);
+		} else {
+			availableLabel = new FontIcon(FontAwesomeType.TIMES);
+		}
+
+		hbox.getChildren().addAll(nameLabel, availableLabel);
+		return hbox;
+	}
+
 	@Override
 	public void loadSettings(Profile profile) {
 		ProfileSettings profileSettings = profile.getProfileSettings();
diff --git a/PlayWallCore/src/de/tobias/playpad/audio/AudioCapability.java b/PlayWallCore/src/de/tobias/playpad/audio/AudioCapability.java
new file mode 100644
index 00000000..12531760
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/audio/AudioCapability.java
@@ -0,0 +1,27 @@
+package de.tobias.playpad.audio;
+
+public class AudioCapability {
+
+	public static final AudioCapability EQUALIZER = new AudioCapability("EQUALIZER", Equalizable.class);
+	public static final AudioCapability SOUNDCARD = new AudioCapability("SOUNDCARD", Soundcardable.class);
+
+	private String name;
+	private Class<? extends AudioFeature> clazz;
+
+	private AudioCapability(String name, Class<? extends AudioFeature> clazz) {
+		this.name = name;
+		this.clazz = clazz;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	public Class<? extends AudioFeature> getAudioFeature() {
+		return clazz;
+	}
+
+	public static AudioCapability[] getFeatures() {
+		return new AudioCapability[] { EQUALIZER, SOUNDCARD };
+	}
+}
diff --git a/PlayWallCore/src/de/tobias/playpad/audio/AudioFeature.java b/PlayWallCore/src/de/tobias/playpad/audio/AudioFeature.java
new file mode 100644
index 00000000..7805f9ff
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/audio/AudioFeature.java
@@ -0,0 +1,11 @@
+package de.tobias.playpad.audio;
+
+/**
+ * Flag für Audiofeature
+ * 
+ * @author tobias
+ *
+ */
+public interface AudioFeature {
+
+}
diff --git a/PlayWallCore/src/de/tobias/playpad/audio/AudioHandlerConnect.java b/PlayWallCore/src/de/tobias/playpad/audio/AudioHandlerConnect.java
index 0d280a36..15ee28d8 100644
--- a/PlayWallCore/src/de/tobias/playpad/audio/AudioHandlerConnect.java
+++ b/PlayWallCore/src/de/tobias/playpad/audio/AudioHandlerConnect.java
@@ -4,8 +4,8 @@ import de.tobias.playpad.pad.conntent.PadContent;
 import de.tobias.playpad.viewcontroller.AudioHandlerViewController;
 
 /**
- * Audio Handler Interface zur Verwaltung einer AudioHandler Implementierung. Für Aktionen beim schließen des
- * Programmes, muss der AudioHandler AutoClosable implementieren.
+ * Audio Handler Interface zur Verwaltung einer AudioHandler Implementierung. Für Aktionen beim schließen des Programmes, muss der AudioHandler
+ * AutoClosable implementieren.
  * 
  * @author tobias
  *
@@ -35,4 +35,13 @@ public abstract class AudioHandlerConnect {
 	 * @return Type
 	 */
 	public abstract String getType();
+
+	/**
+	 * Prüft ob ein Feature verfügbar ist.
+	 * 
+	 * @param audioCapability
+	 *            Feature
+	 * @return <code>true</code> Verfügbar
+	 */
+	public abstract boolean isFeatureAvaiable(AudioCapability audioCapability);
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/audio/Equalizable.java b/PlayWallCore/src/de/tobias/playpad/audio/Equalizable.java
index a0982852..d00c9d62 100644
--- a/PlayWallCore/src/de/tobias/playpad/audio/Equalizable.java
+++ b/PlayWallCore/src/de/tobias/playpad/audio/Equalizable.java
@@ -2,7 +2,7 @@ package de.tobias.playpad.audio;
 
 import javafx.scene.media.AudioEqualizer;
 
-public interface Equalizable {
+public interface Equalizable extends AudioFeature {
 
 	public AudioEqualizer getAudioEqualizer();
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/audio/Soundcardable.java b/PlayWallCore/src/de/tobias/playpad/audio/Soundcardable.java
new file mode 100644
index 00000000..023fbdac
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/audio/Soundcardable.java
@@ -0,0 +1,14 @@
+package de.tobias.playpad.audio;
+
+/**
+ * Setzt die Soundcard für die Audioimplementierung.
+ * 
+ * @author tobias
+ * 
+ * @since 6.0.0
+ *
+ */
+public interface Soundcardable extends AudioFeature {
+
+	public void setOutputDevice(String name);
+}
diff --git a/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java b/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java
index 38c20064..c4f7f393 100644
--- a/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java
+++ b/PlayWallNativeWin/src/de/tobias/playpad/nawin/audio/NativeAudioWinHandlerConnect.java
@@ -1,5 +1,6 @@
 package de.tobias.playpad.nawin.audio;
 
+import de.tobias.playpad.audio.AudioCapability;
 import de.tobias.playpad.audio.AudioHandler;
 import de.tobias.playpad.audio.AudioHandlerConnect;
 import de.tobias.playpad.nawin.NativeAudioWinHandler;
@@ -22,5 +23,14 @@ public class NativeAudioWinHandlerConnect extends AudioHandlerConnect {
 	public String getType() {
 		return "NativeWin";
 	}
+	
+	@Override
+	public boolean isFeatureAvaiable(AudioCapability audioCapability) {
+		for (Class<?> clazz : NativeAudioWinHandler.class.getInterfaces()) {
+			if (clazz.equals(audioCapability.getAudioFeature()))
+				return true;
+		}
+		return false;
+	}
 
 }
-- 
GitLab