package pl.piotrsukiennik.whowhen.shared.util;
import javax.sound.sampled.*;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* @author Piotr Sukiennik
*/
public abstract class AudioUtil {
public static void saveAudioBytesToFile( byte[] audio, AudioFormat audioFormat, AudioFileFormat.Type outputType, File outputFile ) {
InputStream input = new ByteArrayInputStream( audio );
AudioInputStream ais = new AudioInputStream( input, audioFormat, audio.length / audioFormat.getFrameSize() );
try {
AudioSystem.write( ais, outputType, outputFile );
}
catch ( IOException ex ) {
ex.printStackTrace();
}
}
public static void joinAudioFiles( AudioFormat audioFormat, List<File> audioFiles, File output ) throws IOException, UnsupportedAudioFileException {
output.getParentFile().mkdirs();
output.delete();
output.createNewFile();
List<AudioInputStream> audioInputStreams = new ArrayList<AudioInputStream>();
long totalFrameLength = 0;
for ( File audioFile : audioFiles ) {
AudioInputStream fileAudioInputStream = AudioSystem.getAudioInputStream( audioFile );
audioInputStreams.add( fileAudioInputStream );
totalFrameLength += fileAudioInputStream.getFrameLength();
}
AudioInputStream sequenceInputStream = new AudioInputStream( new SequenceInputStream( Collections.enumeration( audioInputStreams ) ), audioFormat, totalFrameLength );
AudioSystem.write( sequenceInputStream, AudioFileFormat.Type.WAVE, output );
}
public static byte[] getAudioFileBytes( File audioFile, AudioFormat audioFormat ) {
AudioInputStream ais = null;
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
try {
ais = AudioSystem.getAudioInputStream( audioFile );
int bufferSize = (int) audioFormat.getSampleRate() * audioFormat.getFrameSize();
byte buffer[] = new byte[bufferSize];
int count = -1;
while ( ( count = ais.read( buffer, 0, buffer.length ) ) > 0 ) {
byteArrayOutputStream.write( buffer, 0, count );
}
byteArrayOutputStream.flush();
byteArrayOutputStream.close();
}
catch ( IOException e ) {
System.err.println( "I/O problems: " + e );
}
catch ( UnsupportedAudioFileException e ) {
System.err.println( e.toString() );
}
finally {
try {
if ( ais != null ) {
ais.close();
}
}
catch ( IOException e ) {
e.printStackTrace();
}
}
return byteArrayOutputStream.toByteArray();
}
public static byte[] splitAudioBytes( byte[] source, int audioSampleSizeInBits, double fromTimeMillis, double toTimeMillis, double totalLengthMillis ) {
int sampleSizeInBytes = audioSampleSizeInBits / 8;
int divisionPointFrom = (int) Math.floor( ( fromTimeMillis * source.length ) / totalLengthMillis );
int divisionPointTo = (int) Math.floor( ( toTimeMillis * source.length ) / totalLengthMillis );
divisionPointFrom += divisionPointFrom % sampleSizeInBytes;
divisionPointTo += divisionPointTo % sampleSizeInBytes;
return Arrays.copyOfRange( source, divisionPointFrom, divisionPointTo );
}
}