/**
* @(#)ArrayToPCM.java 1.8 02/08/21
*/
package com.ibm.media.codec.audio;
import javax.media.format.*;
import javax.media.format.*;
import com.sun.media.*;
import javax.media.*;
public class ArrayToPCM extends BasicCodec{
private static String ArrayToPCM="ArrayToPCM";
public String getName() {
return ArrayToPCM;
}
public ArrayToPCM() {
inputFormats = new Format[] {new AudioFormat(AudioFormat.LINEAR,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.byteArray) };
outputFormats = new Format[] {new AudioFormat(AudioFormat.LINEAR,
Format.NOT_SPECIFIED,
16,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.NOT_SPECIFIED,
Format.shortArray) };
}
public Format [] getSupportedOutputFormats(Format in) {
if (! (in instanceof AudioFormat) )
return outputFormats;
AudioFormat iaf=(AudioFormat) in;
if (!(iaf.getEncoding().equals(AudioFormat.LINEAR)) ||
(iaf.getDataType()!=Format.byteArray) )
return new Format[0];
AudioFormat oaf = new AudioFormat (AudioFormat.LINEAR,
iaf.getSampleRate(),
16,
iaf.getChannels(),
AudioFormat.LITTLE_ENDIAN,
AudioFormat.SIGNED,
iaf.getFrameSizeInBits(),
iaf.getFrameRate(),
Format.shortArray);
return new Format[] {oaf};
}
public int process(Buffer inputBuffer, Buffer outputBuffer){
// == prolog
if (isEOM(inputBuffer) )
return BUFFER_PROCESSED_OK;
byte[] inBuffer = (byte [])inputBuffer.getData();
AudioFormat inFormat = (AudioFormat) inputBuffer.getFormat();
boolean isSigned = inFormat.getSigned() == AudioFormat.SIGNED ;
boolean isBigEndian = inFormat.getEndian() == AudioFormat.BIG_ENDIAN;
int sampleSize = (inFormat.getFrameSizeInBits()+7)>>3;
int inLength = inputBuffer.getLength();
// support only for 8 and 16 bits
int samplesNumber = (sampleSize == 1) ? inLength : (inLength>>1);
int outLength = samplesNumber;
short[] outBuffer = validateShortArraySize(outputBuffer, outLength);
// == main
int offset = isSigned ? 0 : 32768;
int inOffset=0;
int outOffset=0;
if (sampleSize == 1) {
// signed + unsigned 8 bit
for (int i=samplesNumber-1;i>=0;i--) {
outBuffer[i]=(short)((inBuffer[i]<<8) + offset);
}
} else {
// signed + unsigned 16 bit
if (isBigEndian) {
for (int i=samplesNumber-1; i>=0; i--){
int sample1 = inBuffer[inOffset++] << 8;
int sample2 = inBuffer[inOffset++] & 0xff;
outBuffer[outOffset++] = (short)((sample1 | sample2) + offset);
}
} else {
for (int i=samplesNumber-1; i>=0; i--){
int sample1 = inBuffer[inOffset++] & 0Xff;
int sample2 = inBuffer[inOffset++] << 8;
outBuffer[outOffset++] = (short)((sample1 | sample2) + offset);
}
}
}
// == epilog
outputBuffer.setLength(samplesNumber);
outputBuffer.setFormat(outputFormat);
return BUFFER_PROCESSED_OK;
}
public static void main (String[] args) {
Codec codec=new ArrayToPCM();
Format[] ifmt=codec.getSupportedInputFormats();
Format[] ofmt=codec.getSupportedOutputFormats(new AudioFormat(AudioFormat.LINEAR,
8000, 8, 2,
AudioFormat.LITTLE_ENDIAN,
AudioFormat.UNSIGNED));
for (int i=0; i<ifmt.length ; i++) {
System.out.println(ifmt[i]);
}
System.out.println("* out *");
for (int i=0; i<ofmt.length ; i++) {
System.out.println(ofmt[i]);
}
}
}
|