first commit

This commit is contained in:
Sandor Vasi
2016-03-01 08:40:00 +01:00
commit 737bef4759
11 changed files with 1431 additions and 0 deletions

View File

@@ -0,0 +1,8 @@
package ie.corballis.sox;
public class AlreadyExecutedException extends Exception {
public AlreadyExecutedException(String message) {
super(message);
}
}

View File

@@ -0,0 +1,544 @@
package ie.corballis.sox;
public enum AudioFileFormat {
_8SVX {
@Override
public String toString() {
return "8svx";
}
},
AIF {
@Override
public String toString() {
return "aif";
}
},
AIFC {
@Override
public String toString() {
return "aifc";
}
},
AIFF {
@Override
public String toString() {
return "aiff";
}
},
AIFFC {
@Override
public String toString() {
return "aiffc";
}
},
AL {
@Override
public String toString() {
return "al";
}
},
AMB {
@Override
public String toString() {
return "amb";
}
},
AU {
@Override
public String toString() {
return "au";
}
},
AVR {
@Override
public String toString() {
return "avr";
}
},
CAF {
@Override
public String toString() {
return "caf";
}
},
CDDA {
@Override
public String toString() {
return "cdda";
}
},
CDR {
@Override
public String toString() {
return "cdr";
}
},
CVS {
@Override
public String toString() {
return "cvs";
}
},
CVSD {
@Override
public String toString() {
return "cvsd";
}
},
CVU {
@Override
public String toString() {
return "cvu";
}
},
DAT {
@Override
public String toString() {
return "dat";
}
},
DVMS {
@Override
public String toString() {
return "dvms";
}
},
F32 {
@Override
public String toString() {
return "f32";
}
},
F4 {
@Override
public String toString() {
return "f4";
}
},
F64 {
@Override
public String toString() {
return "f64";
}
},
F8 {
@Override
public String toString() {
return "f8";
}
},
FAP {
@Override
public String toString() {
return "fap";
}
},
FLAC {
@Override
public String toString() {
return "flac";
}
},
FSSD {
@Override
public String toString() {
return "fssd";
}
},
GSM {
@Override
public String toString() {
return "gsm";
}
},
GSRT {
@Override
public String toString() {
return "gsrt";
}
},
HCOM {
@Override
public String toString() {
return "hcom";
}
},
HTK {
@Override
public String toString() {
return "htk";
}
},
IMA {
@Override
public String toString() {
return "ima";
}
},
IRCAM {
@Override
public String toString() {
return "ircam";
}
},
LA {
@Override
public String toString() {
return "la";
}
},
LPC {
@Override
public String toString() {
return "lpc";
}
},
LPC10 {
@Override
public String toString() {
return "lpc10";
}
},
LU {
@Override
public String toString() {
return "lu";
}
},
MAT {
@Override
public String toString() {
return "mat";
}
},
MAT4 {
@Override
public String toString() {
return "mat4";
}
},
MAT5 {
@Override
public String toString() {
return "mat5";
}
},
MAUD {
@Override
public String toString() {
return "maud";
}
},
NIST {
@Override
public String toString() {
return "nist";
}
},
OGG {
@Override
public String toString() {
return "ogg";
}
},
PAF {
@Override
public String toString() {
return "paf";
}
},
PRC {
@Override
public String toString() {
return "prc";
}
},
PVF {
@Override
public String toString() {
return "pvf";
}
},
RAW {
@Override
public String toString() {
return "raw";
}
},
S1 {
@Override
public String toString() {
return "s1";
}
},
S16 {
@Override
public String toString() {
return "s16";
}
},
S2 {
@Override
public String toString() {
return "s2";
}
},
S24 {
@Override
public String toString() {
return "s24";
}
},
S3 {
@Override
public String toString() {
return "s3";
}
},
S32 {
@Override
public String toString() {
return "s32";
}
},
S4 {
@Override
public String toString() {
return "s4";
}
},
S8 {
@Override
public String toString() {
return "s8";
}
},
SB {
@Override
public String toString() {
return "sb";
}
},
SD2 {
@Override
public String toString() {
return "sd2";
}
},
SDS {
@Override
public String toString() {
return "sds";
}
},
SF {
@Override
public String toString() {
return "sf";
}
},
SL {
@Override
public String toString() {
return "sl";
}
},
SLN {
@Override
public String toString() {
return "sln";
}
},
SMP {
@Override
public String toString() {
return "smp";
}
},
SND {
@Override
public String toString() {
return "snd";
}
},
SNDFILE {
@Override
public String toString() {
return "sndfile";
}
},
SNDR {
@Override
public String toString() {
return "sndr";
}
},
SNDT {
@Override
public String toString() {
return "sndt";
}
},
SOU {
@Override
public String toString() {
return "sou";
}
},
SOX {
@Override
public String toString() {
return "sox";
}
},
SPH {
@Override
public String toString() {
return "sph";
}
},
SW {
@Override
public String toString() {
return "sw";
}
},
TXW {
@Override
public String toString() {
return "txw";
}
},
U1 {
@Override
public String toString() {
return "u1";
}
},
U16 {
@Override
public String toString() {
return "u16";
}
},
U2 {
@Override
public String toString() {
return "u2";
}
},
U24 {
@Override
public String toString() {
return "u24";
}
},
U3 {
@Override
public String toString() {
return "u3";
}
},
U32 {
@Override
public String toString() {
return "u32";
}
},
U4 {
@Override
public String toString() {
return "u4";
}
},
U8 {
@Override
public String toString() {
return "u8";
}
},
UB {
@Override
public String toString() {
return "ub";
}
},
UL {
@Override
public String toString() {
return "ul";
}
},
UW {
@Override
public String toString() {
return "uw";
}
},
VMS {
@Override
public String toString() {
return "vms";
}
},
VOC {
@Override
public String toString() {
return "voc";
}
},
VORBIS {
@Override
public String toString() {
return "vorbis";
}
},
VOX {
@Override
public String toString() {
return "vox";
}
},
W64 {
@Override
public String toString() {
return "w64";
}
},
WAV {
@Override
public String toString() {
return "wav";
}
},
WAVPCM {
@Override
public String toString() {
return "wavpcm";
}
},
WV {
@Override
public String toString() {
return "wv";
}
},
WVE {
@Override
public String toString() {
return "wve";
}
},
XA {
@Override
public String toString() {
return "xa";
}
},
XI {
@Override
public String toString() {
return "xi";
}
}
}

View File

@@ -0,0 +1,389 @@
package ie.corballis.sox;
public enum SoXEffect {
ALLPASS {
@Override
public String toString() {
return "allpass";
}
},
BAND {
@Override
public String toString() {
return "band";
}
},
BANDPASS {
@Override
public String toString() {
return "bandpass";
}
},
BANDREJECT {
@Override
public String toString() {
return "bandreject";
}
},
BASS {
@Override
public String toString() {
return "bass";
}
},
BEND {
@Override
public String toString() {
return "bend";
}
},
BIQUAD {
@Override
public String toString() {
return "biquad";
}
},
CHORUS {
@Override
public String toString() {
return "chorus";
}
},
CHANNELS {
@Override
public String toString() {
return "channels";
}
},
COMPAND {
@Override
public String toString() {
return "compand";
}
},
CONTRAST {
@Override
public String toString() {
return "contrast";
}
},
DCSHIFT {
@Override
public String toString() {
return "dcshift";
}
},
DEEMPH {
@Override
public String toString() {
return "deemph";
}
},
DELAY {
@Override
public String toString() {
return "delay";
}
},
DITHER {
@Override
public String toString() {
return "dither";
}
},
DIVIDE_PLUS {
@Override
public String toString() {
return "divide+";
}
},
DOWNSAMPLE {
@Override
public String toString() {
return "downsample";
}
},
EARWAX {
@Override
public String toString() {
return "earwax";
}
},
ECHO {
@Override
public String toString() {
return "echo";
}
},
ECHOS {
@Override
public String toString() {
return "echos";
}
},
EQUALIZER {
@Override
public String toString() {
return "equalizer";
}
},
FADE {
@Override
public String toString() {
return "fade";
}
},
FIR {
@Override
public String toString() {
return "fir";
}
},
FIRFIT_PLUS {
@Override
public String toString() {
return "firfit+";
}
},
FLANGER {
@Override
public String toString() {
return "flanger";
}
},
GAIN {
@Override
public String toString() {
return "gain";
}
},
HIGHPASS {
@Override
public String toString() {
return "highpass";
}
},
HILBERT {
@Override
public String toString() {
return "hilbert";
}
},
INPUT_HASH {
@Override
public String toString() {
return "input#";
}
},
LOUDNESS {
@Override
public String toString() {
return "loudness";
}
},
LOWPASS {
@Override
public String toString() {
return "lowpass";
}
},
MCOMPAND {
@Override
public String toString() {
return "mcompand";
}
},
NOISEPROF {
@Override
public String toString() {
return "noiseprof";
}
},
NOISERED {
@Override
public String toString() {
return "noisered";
}
},
NORM {
@Override
public String toString() {
return "norm";
}
},
OOPS {
@Override
public String toString() {
return "oops";
}
},
OUTPUT_HASH {
@Override
public String toString() {
return "output#";
}
},
OVERDRIVE {
@Override
public String toString() {
return "overdrive";
}
},
PAD {
@Override
public String toString() {
return "pad";
}
},
PHASER {
@Override
public String toString() {
return "phaser";
}
},
PITCH {
@Override
public String toString() {
return "pitch";
}
},
RATE {
@Override
public String toString() {
return "rate";
}
},
REMIX {
@Override
public String toString() {
return "remix";
}
},
REPEAT {
@Override
public String toString() {
return "repeat";
}
},
REVERB {
@Override
public String toString() {
return "reverb";
}
},
REVERSE {
@Override
public String toString() {
return "reverse";
}
},
RIAA {
@Override
public String toString() {
return "riaa";
}
},
SILENCE {
@Override
public String toString() {
return "silence";
}
},
SINC {
@Override
public String toString() {
return "sinc";
}
},
SPECTROGRAM {
@Override
public String toString() {
return "spectrogram";
}
},
SPEED {
@Override
public String toString() {
return "speed";
}
},
SPLICE {
@Override
public String toString() {
return "splice";
}
},
STAT {
@Override
public String toString() {
return "stat";
}
},
STATS {
@Override
public String toString() {
return "stats";
}
},
STRETCH {
@Override
public String toString() {
return "stretch";
}
},
SWAP {
@Override
public String toString() {
return "swap";
}
},
SYNTH {
@Override
public String toString() {
return "synth";
}
},
TEMPO {
@Override
public String toString() {
return "tempo";
}
},
TREBLE {
@Override
public String toString() {
return "treble";
}
},
TREMOLO {
@Override
public String toString() {
return "tremolo";
}
},
TRIM {
@Override
public String toString() {
return "trim";
}
},
UPSAMPLE {
@Override
public String toString() {
return "upsample";
}
},
VAD {
@Override
public String toString() {
return "vad";
}
},
VOL {
@Override
public String toString() {
return "vol";
}
}
}

View File

@@ -0,0 +1,55 @@
package ie.corballis.sox;
public enum SoXEncoding {
SIGNED_INTEGER {
@Override
public String toString() {
return "signed-integer";
}
},
UNSIGNED_INTEGER {
@Override
public String toString() {
return "unsigned-integer";
}
},
FLOATING_POINT {
@Override
public String toString() {
return "floating-point";
}
},
MU_LAW {
@Override
public String toString() {
return "mu-law";
}
},
A_LAW {
@Override
public String toString() {
return "a-law";
}
},
IMA_ADPCM {
@Override
public String toString() {
return "ima-adpcm";
}
},
MS_ADPCM {
@Override
public String toString() {
return "ms-adpcm";
}
},
GSM_FULL_RATE {
@Override
public String toString() {
return "gsm-full-rate";
}
}
}

View File

@@ -0,0 +1,158 @@
package ie.corballis.sox;
import java.io.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class Sox {
private static Logger logger = LoggerFactory.getLogger(Sox.class);
private final String soXBinaryPath;
private List<String> arguments = new ArrayList<String>();
private boolean globalOptionSet = false;
private boolean formatOptionSet = false;
private boolean inputFileSet = false;
private boolean outputFileSet = false;
private boolean hasBeenExecuted = false;
public Sox(String soxPath) {
this.soXBinaryPath = soxPath;
}
public Sox ignoreLength() {
arguments.add("--ignore-length");
formatOptionSet = true;
return this;
}
// format options
public Sox fileType(AudioFileFormat format) {
arguments.add("--type");
arguments.add(format.toString());
return this;
}
public Sox encoding(SoXEncoding encoding) {
arguments.add("--encoding");
arguments.add(encoding.toString());
return this;
}
public Sox bits(Integer bits) {
arguments.add("--bits");
arguments.add(bits.toString());
return this;
}
public Sox reverseNibbles() {
arguments.add("--reverse-nibbles");
return this;
}
public Sox reverseBits() {
arguments.add("--reverse-bits");
return this;
}
public Sox sampleRate(Integer sample) {
arguments.add("--rate");
arguments.add(sample.toString());
formatOptionSet = true;
return this;
}
// global options
public Sox verbose(Integer level) {
arguments.add("-V" + level.toString());
globalOptionSet = true;
return this;
}
public Sox effect(SoXEffect effect, String ... effectArguments) {
arguments.add(effect.toString());
for (String effectArgument : effectArguments) {
arguments.add(effectArgument);
}
return this;
}
public Sox argument(String ... arguments) {
Collections.addAll(this.arguments, arguments);
return this;
}
public Sox inputFile(String inputFile) {
arguments.add(inputFile);
return this;
}
public Sox outputFile(String outputFile) throws WrongParametersException {
if (inputFileSet) {
throw new WrongParametersException("The output file has to be later then an input file");
}
arguments.add(outputFile);
outputFileSet = true;
return this;
}
public void execute() throws IOException, WrongParametersException, AlreadyExecutedException {
if (hasBeenExecuted) {
throw new AlreadyExecutedException("The execute() method cannot be called twice");
}
File soxBinary = new File(soXBinaryPath);
if (!soxBinary.exists()) {
throw new FileNotFoundException("Sox binary is not available under the following path: " + soXBinaryPath);
}
if (!outputFileSet) {
throw new WrongParametersException("The output file argument is missing");
}
arguments.add(0, soXBinaryPath);
logger.debug("Sox arguments: {}", arguments);
ProcessBuilder processBuilder = new ProcessBuilder(arguments);
processBuilder.redirectErrorStream(true);
Process process = null;
IOException errorDuringExecution = null;
try {
process = processBuilder.start();
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line;
while ((line = reader.readLine()) != null) {
logger.debug(line);
}
} catch (IOException e) {
errorDuringExecution = e;
logger.error("Error while running Sox. {}", e.getMessage());
} finally {
if (process != null) {
process.destroy();
}
if (errorDuringExecution != null) {
throw errorDuringExecution;
}
}
}
public String getSoXBinaryPath() {
return soXBinaryPath;
}
public List<String> getArguments() {
return arguments;
}
public void setArguments(List<String> arguments) {
this.arguments = arguments;
}
}

View File

@@ -0,0 +1,7 @@
package ie.corballis.sox;
public class WrongParametersException extends Throwable {
public WrongParametersException(String s) {
super(s);
}
}

View File

@@ -0,0 +1,34 @@
package ie.corballis.sox;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
import static org.junit.Assert.assertEquals;
public class ArgumentTester {
@Test
public void testArguments() throws WrongParametersException {
Sox sox = new Sox("/usr/local/bin/sox");
List<String> arguments = sox
.sampleRate(16000)
.inputFile("input.wav")
.outputFile("output.wav")
.bits(16)
.encoding(SoXEncoding.SIGNED_INTEGER)
.effect(SoXEffect.REMIX).argument("1")
.getArguments();
List<String> expectedArguments = Arrays.asList(
"input.wav",
"output.wav",
"--bits",
"16",
"--encoding",
"signed-integer",
"remix",
"1");
assertEquals(expectedArguments, arguments);
}
}