linear2alaw static method

int linear2alaw(
  1. int pcm_val
)

Implementation

/*unsigned char*/ static int linear2alaw(
      /*short*/ int pcm_val) /* 2's complement (16-bit range) */
  {
    /*short*/ final int mask;
    /*short*/ final int seg;
    /*unsigned char*/ int aval;

    pcm_val = pcm_val >> 3;

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

    /* Convert the scaled magnitude to segment number. */
    seg = search(pcm_val, seg_aend);

    /* Combine the sign, segment, and quantization bits. */

    if (seg >= 8) /* out of range, return maximum value. */
      return /*(unsigned char)*/ (0x7F ^ mask);
    else {
      aval = /*(unsigned char)*/ seg << SEG_SHIFT;
      if (seg < 2)
        aval |= (pcm_val >> 1) & QUANT_MASK;
      else
        aval |= (pcm_val >> seg) & QUANT_MASK;
      return (aval ^ mask);
    }
  }