/*
* RoutineConfig.java
* Eisenkraut
*
* Copyright (c) 2004-2016 Hanns Holger Rutz. All rights reserved.
*
* This software is published under the GNU General Public License v3+
*
*
* For further information, please contact Hanns Holger Rutz at
* contact@sciss.de
*/
package de.sciss.eisenkraut.io;
import java.util.StringTokenizer;
import java.util.prefs.Preferences;
public class RoutingConfig {
/*
* Preferences key. Value: Integer representing the number
* of channels for this configuration
*/
public static final String KEY_RC_NUMCHANNELS = "numchannels";
/*
* Preferences key. Value: Float representing the start angle (in degrees)
* for the first mapped channel fo this configuration
*/
private static final String KEY_RC_STARTANGLE = "startangle";
/*
* Preferences key. Value: String which is space separated list of
* integers representing the audio interface channels (first channel = 0)
* for this configuration
*/
private static final String KEY_RC_MAPPING = "mapping";
/**
* Preferences key. Value: String representing the driver
* name for this configuration
*/
public static final String KEY_NAME = "name";
public final String id;
public final String name;
public final int numChannels;
public final int[] mapping;
public final float startAngle;
public static final String[] KEYS = { KEY_NAME, KEY_RC_NUMCHANNELS, KEY_RC_MAPPING, KEY_RC_STARTANGLE };
public RoutingConfig( String id, String name )
{
this.id = id;
this.name = name;
this.numChannels = 0;
this.mapping = new int[ 0 ];
this.startAngle = 0f;
}
public RoutingConfig( String id, String name, int[] mapping, float startAngle )
{
this.id = id;
this.name = name;
this.numChannels = mapping.length;
this.mapping = mapping;
this.startAngle = startAngle;
}
public RoutingConfig( Preferences cfgPrefs )
throws NumberFormatException
{
final StringTokenizer tok = new StringTokenizer( cfgPrefs.get( KEY_RC_MAPPING, "" ));
id = cfgPrefs.name();
name = cfgPrefs.get( KEY_NAME, id );
numChannels = cfgPrefs.getInt( KEY_RC_NUMCHANNELS, 0 );
startAngle = cfgPrefs.getFloat( KEY_RC_STARTANGLE, 0.0f );
mapping = new int[ numChannels ];
for( int j = 0; (j < numChannels) && tok.hasMoreTokens(); j++ ) {
mapping[ j ] = Integer.parseInt( tok.nextToken() );
}
}
public boolean equals( Object o )
{
if( (o == null) || !o.getClass().equals( getClass() )) return false;
final RoutingConfig cfg2 = (RoutingConfig) o;
if( id.equals( cfg2.id ) &&
name.equals( cfg2.name ) &&
(numChannels == cfg2.numChannels) &&
(mapping.length == cfg2.mapping.length) &&
(startAngle == cfg2.startAngle )) {
for( int i = 0; i < mapping.length; i++ ) {
if( mapping[ i ] != cfg2.mapping[ i ]) return false;
}
return true;
}
return false;
}
public int hashCode() {
int hash = id.hashCode() ^ name.hashCode() ^ numChannels ^ Float.floatToRawIntBits(startAngle);
for (int i = 0; i < mapping.length; i++) {
hash ^= mapping[i] << i;
}
return hash;
}
public void toPrefs(Preferences cfgPrefs) {
final StringBuilder sb = new StringBuilder();
cfgPrefs.put(KEY_NAME, name);
cfgPrefs.putInt(KEY_RC_NUMCHANNELS, numChannels);
cfgPrefs.putFloat(KEY_RC_STARTANGLE, startAngle);
if (numChannels > 0) {
sb.append(mapping[0]);
}
for (int j = 1; j < numChannels; j++) {
sb.append(' ');
sb.append(mapping[j]);
}
cfgPrefs.put(KEY_RC_MAPPING, sb.toString());
}
public String toString() {
final StringBuilder bMap = new StringBuilder("[ ");
for (int i = 0; i < mapping.length; i++) {
if (i > 0) bMap.append(", ");
bMap.append(String.valueOf(mapping[i]));
}
bMap.append(" ]");
return "RoutingConfig( \"" + id + "\", \"" + name + "\", " + bMap.toString() + ", " + startAngle + " )";
}
}