FileDocCategorySizeDatePackage
AmrInputStream.javaAPI DocAndroid 1.5 API4103Wed May 06 22:42:00 BST 2009android.media

AmrInputStream

public final class AmrInputStream extends InputStream
AmrInputStream
hide

Fields Summary
private static final String
TAG
private static final int
SAMPLES_PER_FRAME
private InputStream
mInputStream
private int
mGae
private byte[]
mBuf
private int
mBufIn
private int
mBufOut
private byte[]
mOneByte
Constructors Summary
public AmrInputStream(InputStream inputStream)
Create a new AmrInputStream, which converts 16 bit PCM to AMR

param
inputStream InputStream containing 16 bit PCM.

    
                           
       
        mInputStream = inputStream;
        mGae = GsmAmrEncoderNew();
        GsmAmrEncoderInitialize(mGae);
    
Methods Summary
private static native voidGsmAmrEncoderCleanup(int gae)

private static native voidGsmAmrEncoderDelete(int gae)

private static native intGsmAmrEncoderEncode(int gae, byte[] pcm, int pcmOffset, byte[] amr, int amrOffset)

private static native voidGsmAmrEncoderInitialize(int gae)

private static native intGsmAmrEncoderNew()

public voidclose()

        try {
            if (mInputStream != null) mInputStream.close();
        } finally {
            mInputStream = null;
            try {
                if (mGae != 0) GsmAmrEncoderCleanup(mGae);
            } finally {
                try {
                    if (mGae != 0) GsmAmrEncoderDelete(mGae);
                } finally {
                    mGae = 0;
                }
            }
        }
    
protected voidfinalize()

        if (mGae != 0) {
            close();
            throw new IllegalStateException("someone forgot to close AmrInputStream");
        }
    
public intread()

        int rtn = read(mOneByte, 0, 1);
        return rtn == 1 ? (0xff & mOneByte[0]) : -1;
    
public intread(byte[] b)

        return read(b, 0, b.length);
    
public intread(byte[] b, int offset, int length)

        if (mGae == 0) throw new IllegalStateException("not open");
        
        // local buffer of amr encoded audio empty
        if (mBufOut >= mBufIn) {
            // reset the buffer
            mBufOut = 0;
            mBufIn = 0;
            
            // fetch a 20 msec frame of pcm
            for (int i = 0; i < SAMPLES_PER_FRAME * 2; ) {
                int n = mInputStream.read(mBuf, i, SAMPLES_PER_FRAME * 2 - i);
                if (n == -1) return -1;
                i += n;
            }
            
            // encode it
            mBufIn = GsmAmrEncoderEncode(mGae, mBuf, 0, mBuf, 0);
        }
        
        // return encoded audio to user
        if (length > mBufIn - mBufOut) length = mBufIn - mBufOut;
        System.arraycopy(mBuf, mBufOut, b, offset, length);
        mBufOut += length;
        
        return length;