first commit
This commit is contained in:
3
.gitignore
vendored
Normal file
3
.gitignore
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
target/
|
||||
**/*.iml
|
||||
.idea
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016 Corballis Consulting Ltd.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
75
README.md
Normal file
75
README.md
Normal file
@@ -0,0 +1,75 @@
|
||||
# sox-wrapper-java
|
||||
Java wrapper around the famous [sox](https://sourceforge.net/projects/sox/) audio processing tool.
|
||||
Please note that the sox executable is not part of this project. This is a wrapper application only that points to the
|
||||
executable.
|
||||
|
||||
Few of the arguments are not implemented yet, but with the help of the `SoX argument(String ...args)` method
|
||||
any kind of parameter can be added to the parameter list.
|
||||
|
||||
Although the constructor of the SoX class requires the user to provide the full path of the sox executable,
|
||||
it may not be a good idea to hard-code file system paths to java code. Use property files or environment variables instead.
|
||||
|
||||
Have a nice coding :)
|
||||
|
||||
## How to use
|
||||
|
||||
```
|
||||
<dependency>
|
||||
<groupId>ie.corballis</groupId>
|
||||
<artifactId>sox-wrapper-java</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
## Code Examples
|
||||
|
||||
### Simple sox usage
|
||||
The code below represents the following code in the CLI:
|
||||
```sox --rate 16000 input.wav --encoding signed-integer --bits 16 output.wav remix 1 ```
|
||||
|
||||
```
|
||||
Sox sox = new Sox("/usr/bin/sox");
|
||||
sox
|
||||
.sampleRate(16000)
|
||||
.inputFile("input.wav")
|
||||
.encoding(SoXEncoding.SIGNED_INTEGER)
|
||||
.bits(16)
|
||||
.outputFile("output.wav")
|
||||
.effect(SoXEffect.REMIX,"1")
|
||||
.execute();
|
||||
}
|
||||
```
|
||||
|
||||
### Pass unimplemented arguments to the sox
|
||||
|
||||
If an argument, you are looking for is not implemented yet, feel free to open an issue, or simply use the
|
||||
`SoX argument(String ...args)` method to pass custom arguments to the sox.
|
||||
```
|
||||
Sox sox = new Sox("/usr/bin/sox");
|
||||
sox.argument("--myargumentKey", "myArgumentValue")
|
||||
.inputFile("input.wav")
|
||||
.outputFile("output.wav")
|
||||
.execute();
|
||||
}
|
||||
```
|
||||
|
||||
### Sox with Spring Framework
|
||||
This is a recommendation, how to integrate the sox java wrapper with the Spring Framework
|
||||
|
||||
```
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
|
||||
@Configuration
|
||||
public class SoXConfiguration {
|
||||
|
||||
@Bean(id="sox" scope="prototype")
|
||||
public Sox sox() {
|
||||
Sox sox = new Sox("/usr/bin/sox");
|
||||
return sox;
|
||||
}
|
||||
```
|
||||
|
||||
With the above described Spring configuration class you can inject the sox wrapper anywhere in you Spring project like this:
|
||||
|
||||
```@Autowired private SoX sox;``` and the framework will initialize a new wrapper for you.
|
||||
137
pom.xml
Normal file
137
pom.xml
Normal file
@@ -0,0 +1,137 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
<groupId>ie.corballis</groupId>
|
||||
<artifactId>sox-java</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<url>https://github.com/corballis/sox-wrapper-java</url>
|
||||
|
||||
<parent>
|
||||
<groupId>org.sonatype.oss</groupId>
|
||||
<artifactId>oss-parent</artifactId>
|
||||
<version>7</version>
|
||||
</parent>
|
||||
|
||||
<licenses>
|
||||
<license>
|
||||
<name>MIT License</name>
|
||||
<url>http://www.opensource.org/licenses/mit-license.php</url>
|
||||
<distribution>repo</distribution>
|
||||
</license>
|
||||
</licenses>
|
||||
|
||||
<developers>
|
||||
<developer>
|
||||
<id>sawo</id>
|
||||
<name>Sandor Vasi</name>
|
||||
<email>sawo@freemail.hu</email>
|
||||
</developer>
|
||||
</developers>
|
||||
|
||||
<scm>
|
||||
<connection>scm:git:git@github.com:corballis/sox-wrapper-java.git</connection>
|
||||
<url>scm:git:git@github.com:corballis/sox-wrapper-java.git</url>
|
||||
<developerConnection>scm:git:git@github.com:corballis/sox-wrapper-java.git</developerConnection>
|
||||
<tag>HEAD</tag>
|
||||
</scm>
|
||||
|
||||
<properties>
|
||||
<slf4j-api.version>1.7.8</slf4j-api.version>
|
||||
<junit.version>4.8.2</junit.version>
|
||||
</properties>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>org.slf4j</groupId>
|
||||
<artifactId>slf4j-api</artifactId>
|
||||
<version>${slf4j-api.version}</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<profiles>
|
||||
<profile>
|
||||
<id>release-sign-artifacts</id>
|
||||
<activation>
|
||||
<property>
|
||||
<name>performRelease</name>
|
||||
<value>true</value>
|
||||
</property>
|
||||
</activation>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-gpg-plugin</artifactId>
|
||||
<version>1.4</version>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>verify</phase>
|
||||
<goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-source-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-sources</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<artifactId>maven-javadoc-plugin</artifactId>
|
||||
<executions>
|
||||
<execution>
|
||||
<id>attach-javadocs</id>
|
||||
<goals>
|
||||
<goal>jar</goal>
|
||||
</goals>
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
</profiles>
|
||||
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-compiler-plugin</artifactId>
|
||||
<version>3.1</version>
|
||||
<configuration>
|
||||
<source>1.6</source>
|
||||
<target>1.6</target>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-resources-plugin</artifactId>
|
||||
<version>2.5</version>
|
||||
<configuration>
|
||||
<encoding>UTF-8</encoding>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.apache.maven.plugins</groupId>
|
||||
<artifactId>maven-release-plugin</artifactId>
|
||||
<version>2.4.2</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
|
||||
</project>
|
||||
@@ -0,0 +1,8 @@
|
||||
package ie.corballis.sox;
|
||||
|
||||
public class AlreadyExecutedException extends Exception {
|
||||
|
||||
public AlreadyExecutedException(String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
544
src/main/java/ie/corballis/sox/AudioFileFormat.java
Normal file
544
src/main/java/ie/corballis/sox/AudioFileFormat.java
Normal 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
389
src/main/java/ie/corballis/sox/SoXEffect.java
Normal file
389
src/main/java/ie/corballis/sox/SoXEffect.java
Normal 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";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
55
src/main/java/ie/corballis/sox/SoXEncoding.java
Normal file
55
src/main/java/ie/corballis/sox/SoXEncoding.java
Normal 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";
|
||||
}
|
||||
}
|
||||
}
|
||||
158
src/main/java/ie/corballis/sox/Sox.java
Normal file
158
src/main/java/ie/corballis/sox/Sox.java
Normal 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;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
package ie.corballis.sox;
|
||||
|
||||
public class WrongParametersException extends Throwable {
|
||||
public WrongParametersException(String s) {
|
||||
super(s);
|
||||
}
|
||||
}
|
||||
34
src/test/java/ie/corballis/sox/ArgumentTester.java
Normal file
34
src/test/java/ie/corballis/sox/ArgumentTester.java
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user