/*
* PS3 Media Server, for streaming any medias to your PS3.
* Copyright (C) 2012 I. Sokolov
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; version 2
* of the License only.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.pms.formats.v2;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.apache.commons.lang3.StringUtils.isBlank;
/**
* Enum with possible audio track attributes.
* AUDIO_ATTRIBUTE (Set<String> libMediaInfoKeys, boolean multipleValuesPossible,
* boolean getLargerValue, Integer defaultValue, Integer minimumValue)
*/
public enum AudioAttribute {
CHANNELS_NUMBER (set("Channel(s)"), true, true, 2, 1),
DELAY (set("Video_Delay"), false, false, 0, null),
SAMPLE_FREQUENCY (set("SamplingRate"), true, true, 48000, 1);
private final Set<String> libMediaInfoKeys;
private final boolean multipleValuesPossible;
private final boolean getLargerValue;
private final Integer defaultValue;
private final Integer minimumValue;
private static final Pattern libMediaInfoKeyPattern = Pattern.compile("^\\s*(\\S+)\\s*:");
private final static Map<String, AudioAttribute> libMediaInfoKeyToAudioAttributeMap;
private static Set<String> set(String... args) {
return new HashSet<>(Arrays.asList(args));
}
static {
libMediaInfoKeyToAudioAttributeMap = new HashMap<>();
for (AudioAttribute audioAttribute : values()) {
for (String libMediaInfoKey : audioAttribute.libMediaInfoKeys) {
libMediaInfoKeyToAudioAttributeMap.put(libMediaInfoKey.toLowerCase(), audioAttribute);
}
}
}
private AudioAttribute(Set<String> libMediaInfoKeys, boolean multipleValuesPossible,
boolean getLargerValue, Integer defaultValue, Integer minimumValue) {
this.libMediaInfoKeys = libMediaInfoKeys;
this.multipleValuesPossible = multipleValuesPossible;
this.getLargerValue = getLargerValue;
this.defaultValue = defaultValue;
this.minimumValue = minimumValue;
}
public static AudioAttribute getAudioAttributeByLibMediaInfoKeyValuePair(String keyValuePair) {
if (isBlank(keyValuePair)) {
throw new IllegalArgumentException("Empty keyValuePair passed in.");
}
Matcher keyMatcher = libMediaInfoKeyPattern.matcher(keyValuePair);
if (keyMatcher.find()) {
String key = keyMatcher.group(1);
AudioAttribute audioAttribute = libMediaInfoKeyToAudioAttributeMap.get(key.toLowerCase());
if (audioAttribute == null) {
throw new IllegalArgumentException("Can't find AudioAttribute for key '" + key + "'.");
} else {
return audioAttribute;
}
} else {
throw new IllegalArgumentException("Can't find key in keyValuePair '" + keyValuePair + "'.");
}
}
public Integer getDefaultValue() {
return defaultValue;
}
public boolean isGetLargerValue() {
return getLargerValue;
}
public boolean isMultipleValuesPossible() {
return multipleValuesPossible;
}
public Integer getMinimumValue() {
return minimumValue;
}
}