One of the coolest things about CFML is the fact that it was designed for rapid application development. Even more so, as the language (and server platform) evolved, it quickly turned into one of those tools that knew how to talk to just about everything. From FTP, to the Web, to SSH connection, to specialized JDNI connections, it is pretty darn simple to make ColdFusion the glue that holds disparate systems together.
Last month I was tasked with coming up with a tool to allow some of my PBX users to record announcements. The current system they were used to involved them calling a phone number, entering in a special code and then recording their announcements. It was easy because the phone already had a mic, speakers and everything else setup to the point where the user didn’t have to worry about all the related computer settings. I tried to re-create a solution that was just as easy using the Flash Player (and ever a Java applet) — but it turns out that very few people have microphones hooked up to their computers — and those who do have no idea how to tune it so that the sound levels are descent.
I came up with a nifty idea. I wrote a really quick CFML app to interact with Twilio (an online phone company that provides a really wicked API for dealing with live telephone calls). Essentially, they post back form requests to you, and you pass back XML documents back to them. They even have an API that can do recordings.
The only problem was the recordings they saved weren’t in a format that my PBX understood. While they provided me mono, 16-bit PCM, 16k wave files, I needed 64-bit, 8k mono uLaw wave files. To a normal computer, these look the same, but to these two different systems, they were radically different.
The solution? I found a really cool Java application known as JAVE. JAVE is a wrapper for ffmpeg, which is a very well known application that can work with audio and video files. JAVE allows me to convert from one type of wave file to another, or even from an mp3 to a wave, or from a Windows Media file to an MP4 file.
Using it? Like dealing with most Java classes, you drop it into your CFML’s LIB directory. I tried it both with Adobe ColdFusion and Railo and it worked flawlessly. Once you have the Java class (jave-1.0.2.jar) in the lib directory and re-start your CFML server, you are ready to start writing some code. Here is what I came up with to convert between my two wave formats :
jave = createObject("java","it.sauronsoftware.jave.Encoder");
incomingFile = createObject("java","java.io.File").init("C:\temp\incoming.wav");
outgoingFile = createObject("java","java.io.File").init("C:\temp\outgoing.wav");
audio = createObject("java","it.sauronsoftware.jave.AudioAttributes");
attrib = createObject("java","it.sauronsoftware.jave.EncodingAttributes");
jave.encode(incomingFile, outgoingFile, attrib);
That’s pretty much it. If you do a cfdump of the “jave.getAudioDecoders()”, “jave.getSupportedDecodingFormats()” you will get a good feeling of all the different file types you can convert between.
This is more of the type of magic we need to be talking about. Sure, converting between file formats can seem dull, but being able to come up with a solution to do it quickly is what makes a language, and a platform useful.