import java.io.IOException; import java.io.File; import javax.sound.sampled.AudioFileFormat; import javax.sound.sampled.AudioFormat; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; // not portable, but cannot be avoided currently import org.tritonus.share.sampled.AudioFileTypes; import org.tritonus.share.sampled.Encodings; /** Encoding an audio file from GSM 06.10 to wav */ public class GSMDecoder { public static void main(String[] args) { if (args.length != 2) { printUsageAndExit(); } File gsmFile = new File(args[0]); File pcmFile = new File(args[1]); AudioInputStream ais = null; try { ais = AudioSystem.getAudioInputStream(gsmFile); } catch (Exception e) { e.printStackTrace(); } if (ais == null) { System.out.println("cannot open audio file"); System.exit(1); } AudioFormat.Encoding targetEncoding = AudioFormat.Encoding.PCM_SIGNED; //AudioInputStream pcmAIS = AudioSystem.getAudioInputStream(targetEncoding, ais); // hack: Sun's JDK writes a rubbish wave file that causes Winamp and CoolEdit to crash // still this writes rubbish... AudioInputStream pcmAIS = AudioSystem.getAudioInputStream( new AudioFormat(targetEncoding, 8000.0f, 16, 1, 2, 8000.0f, false), ais); AudioFileFormat.Type fileType = AudioFileFormat.Type.WAVE; int nWrittenFrames = 0; try { nWrittenFrames = AudioSystem.write(pcmAIS, fileType, pcmFile); } catch (IOException e) { e.printStackTrace(); } } private static void printUsageAndExit() { System.out.println("GSMDecoder: usage:"); System.out.println("\tjava GSMDecoder "); System.exit(1); } }