Public Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes

audio.AudioCodecAlaw Class Reference

Converts a 16-bit linear PCM stream from and to 8-bit A-law. More...

Inheritance diagram for audio.AudioCodecAlaw:
Inheritance graph
[legend]
Collaboration diagram for audio.AudioCodecAlaw:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 AudioCodecAlaw (AudioInterfacePCM audio)
 Constructs A-Law CODEC above existing PCM audio interface.
int getVoicePduSubclass ()
 Gets the VoicePDU subclass attribute of the AbstractAudio object.
int getSampleSize ()
 Returns the minimum sample size for use in creating buffers etc.
void convertToPCM (byte[] in, byte[] out)
 Encodes data to PCM, i.e.
void convertFromPCM (byte[] in, byte[] out)
 Decodes data from PCM, i.e.

Static Private Member Functions

static byte linear2alaw (short pcm_value)
 Converts a 16-bit linear PCM value to 8-bit A-law.
static short alaw2linear (byte alaw_value)
 Converts an 8-bit A-law value to 16-bit linear PCM.

Private Attributes

int sampleSize

Static Private Attributes

static final int SIGN_BIT = 0x80
static final int QUANT_MASK = 0xf
static final int SEG_SHIFT = 4
static final int SEG_MASK = 0x70
static final int[] seg_end

Detailed Description

Converts a 16-bit linear PCM stream from and to 8-bit A-law.

Author:
Mikica B Kocic, based on Sun Microsystem's C source code.

Definition at line 11 of file AudioCodecAlaw.java.


Constructor & Destructor Documentation

audio.AudioCodecAlaw.AudioCodecAlaw ( AudioInterfacePCM  audio )

Constructs A-Law CODEC above existing PCM audio interface.

Definition at line 18 of file AudioCodecAlaw.java.

References audio.AbstractCODEC.audio, audio.AudioInterfacePCM.getSampleSize(), audio.AbstractCODEC.inputPcmBuf, audio.AbstractCODEC.outputPcmBuf, and audio.AudioCodecAlaw.sampleSize.

    {
        this.audio = audio;
        this.sampleSize = this.audio.getSampleSize ();
        this.outputPcmBuf = new byte[ this.sampleSize ];
        this.inputPcmBuf = new byte[ this.sampleSize ];
    }

Member Function Documentation

static short audio.AudioCodecAlaw.alaw2linear ( byte  alaw_value ) [static, private]

Converts an 8-bit A-law value to 16-bit linear PCM.

Definition at line 156 of file AudioCodecAlaw.java.

References audio.AudioCodecAlaw.QUANT_MASK, audio.AudioCodecAlaw.SEG_MASK, audio.AudioCodecAlaw.SEG_SHIFT, and audio.AudioCodecAlaw.SIGN_BIT.

Referenced by audio.AudioCodecAlaw.convertToPCM().

    {
        
        int a_val = ( ( alaw_value + 0x100 ) & 0xFF ) ^ 0x55;
        
        int t = ( a_val & QUANT_MASK ) << 4;
        int seg = ( a_val & SEG_MASK ) >> SEG_SHIFT;
        
        switch ( seg )
        {
            case 0:
                t += 8;
                break;
            case 1:
                t += 0x108;
                break;
            default:
                t += 0x108;
                t <<= seg - 1;
            }

        return (short)( ( a_val & SIGN_BIT ) != 0 ? t : -t );        
    }
void audio.AudioCodecAlaw.convertFromPCM ( byte[]  in,
byte[]  out 
) [virtual]

Decodes data from PCM, i.e.

converts samples from CODEC to A-Law format.

Implements audio.AbstractCODEC.

Definition at line 58 of file AudioCodecAlaw.java.

References utils.OctetBuffer.getShort(), audio.AudioCodecAlaw.linear2alaw(), and utils.OctetBuffer.wrap().

    {
        OctetBuffer bb = OctetBuffer.wrap( in );

        for( int i = 0; i < in.length / 2; ++i )
        {
            out[i] = linear2alaw( bb.getShort () );
        }
    }
void audio.AudioCodecAlaw.convertToPCM ( byte[]  in,
byte[]  out 
) [virtual]

Encodes data to PCM, i.e.

converts samples from A-Law to CODEC format.

Implements audio.AbstractCODEC.

Definition at line 45 of file AudioCodecAlaw.java.

References audio.AudioCodecAlaw.alaw2linear(), utils.OctetBuffer.putShort(), and utils.OctetBuffer.wrap().

    {
        OctetBuffer bb = OctetBuffer.wrap( out );

        for ( int i = 0; i < in.length; ++i ) 
        {
            bb.putShort( alaw2linear( in[i] ) );
        }
    }
int audio.AudioCodecAlaw.getSampleSize (  ) [virtual]

Returns the minimum sample size for use in creating buffers etc.

Implements audio.AudioInterface.

Definition at line 37 of file AudioCodecAlaw.java.

    {
        return 160;
    }
int audio.AudioCodecAlaw.getVoicePduSubclass (  ) [virtual]

Gets the VoicePDU subclass attribute of the AbstractAudio object.

Implements audio.AbstractCODEC.

Definition at line 29 of file AudioCodecAlaw.java.

    {
        return protocol.VoicePDU.ALAW;
    }
static byte audio.AudioCodecAlaw.linear2alaw ( short  pcm_value ) [static, private]

Converts a 16-bit linear PCM value to 8-bit A-law.

Definition at line 109 of file AudioCodecAlaw.java.

References audio.AudioCodecAlaw.QUANT_MASK, audio.AudioCodecAlaw.seg_end, and audio.AudioCodecAlaw.SEG_SHIFT.

Referenced by audio.AudioCodecAlaw.convertFromPCM().

    {
        
        int pcm = pcm_value >> 3;

        int mask;
        if ( pcm >= 0 )
        {
            mask = 0xD5; // sign (7th) bit = 1 
            }
        else 
        {
            mask = 0x55; // sign bit = 0 
            pcm = -pcm - 1;
            }

        /* Convert the scaled magnitude to segment number. 
         */
        int seg = 8;
        
        for ( int i = 0; i < 8; ++i ) {
            if ( pcm <= seg_end[i] ) {
                seg = i;
                break;
            }
        }

        /* Combine the sign, segment, and quantization bits. 
         */
        if ( seg >= 8 ) { // out of range, return maximum value. 
            return (byte)( (  0x7F ^ mask ) & 0xFF - 0x100 );
        }

        int aval = ( seg << SEG_SHIFT ) & 0xFF;
        
        if ( seg < 2 ) {
            aval |= (pcm >> 1) & QUANT_MASK;
        } else {
            aval |= (pcm >> seg) & QUANT_MASK;
        }
        
        return (byte)( ( aval ^ mask ) & 0xFF - 0x100 );
    }

Member Data Documentation

final int audio.AudioCodecAlaw.QUANT_MASK = 0xf [static, private]

Definition at line 13 of file AudioCodecAlaw.java.

Referenced by audio.AudioCodecAlaw.AudioCodecAlaw().

final int [] audio.AudioCodecAlaw.seg_end [static, private]
Initial value:
 {
            0x1F, 0x3F, 0x7F, 0xFF, 0x1FF, 0x3FF, 0x7FF, 0xFFF
            }

Definition at line 102 of file AudioCodecAlaw.java.

Referenced by audio.AudioCodecAlaw.linear2alaw().

final int audio.AudioCodecAlaw.SEG_MASK = 0x70 [static, private]

Definition at line 99 of file AudioCodecAlaw.java.

Referenced by audio.AudioCodecAlaw.alaw2linear().

final int audio.AudioCodecAlaw.SEG_SHIFT = 4 [static, private]
final int audio.AudioCodecAlaw.SIGN_BIT = 0x80 [static, private]

Definition at line 92 of file AudioCodecAlaw.java.

Referenced by audio.AudioCodecAlaw.alaw2linear().


The documentation for this class was generated from the following file: