/** * */ package net.sourceforge.gjtapi.protocols; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.util.HashMap; import java.util.Map; import javax.sound.sampled.AudioFormat; /** * A parser for the javasound URL schema. * * @author Dirk Schnelle-Walka * */ public final class JavaSoundParser { /** * Prevent construction from outside. */ private JavaSoundParser() { } /** * Parses the given URI into an audio format. * * @param url * the URL to parse. * @return audio format. * @throws URISyntaxException * error parsing the URL */ public static AudioFormat parse(final URL url) throws URISyntaxException { URI uri = url.toURI(); final Map<String, String> parameters = new HashMap<String, String>(); if (uri.getQuery() != null) { String[] parametersString = uri.getQuery().split("\\&"); for (String part : parametersString) { String[] queryElement = part.split("\\="); parameters.put(queryElement[0], queryElement[1]); } } // Default values for AudioFormat parameters AudioFormat.Encoding encoding = AudioFormat.Encoding.ULAW; float sampleRate = 8000; int bits = 8; int channels = 1; boolean endian = true; boolean signed = true; // Change default values as specified final String signedStr = parameters.get("signed"); if (signedStr != null) { signed = Boolean.valueOf(signedStr); } final String encodingStr = parameters.get("encoding"); if (encodingStr != null) { if (encodingStr.equals("pcm")) { encoding = (signed == true ? AudioFormat.Encoding.PCM_SIGNED : AudioFormat.Encoding.PCM_UNSIGNED); } else if (encodingStr.equals("alaw")) { encoding = AudioFormat.Encoding.ALAW; } else if (encodingStr.equals("ulaw")) { encoding = AudioFormat.Encoding.ULAW; } else if (encodingStr.equals("gsm")) { throw new URISyntaxException(url.toString(), "gsm is currently not supported!"); } } final String rateStr = parameters.get("rate"); if (rateStr != null) { sampleRate = Float.valueOf(rateStr); } final String bitsStr = parameters.get("bits"); if (bitsStr != null) { bits = Integer.valueOf(bitsStr); } final String channelsStr = parameters.get("channels"); if (channelsStr != null) { channels = Integer.valueOf(channelsStr); } final String endianStr = parameters.get("endian"); if (endianStr != null) { if (endianStr.equals("little")) { endian = false; } else if (endianStr.equals("big")) { endian = true; } } // Construct the AudioFormat return new AudioFormat(encoding, sampleRate, bits, channels, bits / 8, sampleRate, endian); } }