|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights ! 7: * Reserved. This file contains Original Code and/or Modifications of ! 8: * Original Code as defined in and that are subject to the Apple Public ! 9: * Source License Version 1.1 (the "License"). You may not use this file ! 10: * except in compliance with the License. Please obtain a copy of the ! 11: * License at http://www.apple.com/publicsource and read it before using ! 12: * this file. ! 13: * ! 14: * The Original Code and all software distributed under the License are ! 15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 18: * FITNESS FOR A PARTICULAR PURPOSE OR NON- INFRINGEMENT. Please see the ! 19: * License for the specific language governing rights and limitations ! 20: * under the License. ! 21: * ! 22: * @APPLE_LICENSE_HEADER_END@ ! 23: */ ! 24: /* ! 25: * audio_mulaw.c ! 26: * ! 27: * Copyright (c) 1992, NeXT Computer, Inc. All rights reserved. ! 28: * ! 29: * Mulaw conversion. ! 30: * ! 31: * HISTORY ! 32: * 05/20/93/mtm Original coding from sound library. ! 33: */ ! 34: ! 35: #import <driverkit/generalFuncs.h> ! 36: ! 37: /* FIXME: no prototype for kernel qsort */ ! 38: extern qsort(); ! 39: ! 40: /* ! 41: * Mulaw to 16 bit linear conversion table. ! 42: */ ! 43: #define MULAWTABLEN 256 ! 44: const short audio_muLaw[MULAWTABLEN] = { ! 45: 0x8284, 0x8684, 0x8a84, 0x8e84, 0x9284, 0x9684, 0x9a84, 0x9e84, ! 46: 0xa284, 0xa684, 0xaa84, 0xae84, 0xb284, 0xb684, 0xba84, 0xbe84, ! 47: 0xc184, 0xc384, 0xc584, 0xc784, 0xc984, 0xcb84, 0xcd84, 0xcf84, ! 48: 0xd184, 0xd384, 0xd584, 0xd784, 0xd984, 0xdb84, 0xdd84, 0xdf84, ! 49: 0xe104, 0xe204, 0xe304, 0xe404, 0xe504, 0xe604, 0xe704, 0xe804, ! 50: 0xe904, 0xea04, 0xeb04, 0xec04, 0xed04, 0xee04, 0xef04, 0xf004, ! 51: 0xf0c4, 0xf144, 0xf1c4, 0xf244, 0xf2c4, 0xf344, 0xf3c4, 0xf444, ! 52: 0xf4c4, 0xf544, 0xf5c4, 0xf644, 0xf6c4, 0xf744, 0xf7c4, 0xf844, ! 53: 0xf8a4, 0xf8e4, 0xf924, 0xf964, 0xf9a4, 0xf9e4, 0xfa24, 0xfa64, ! 54: 0xfaa4, 0xfae4, 0xfb24, 0xfb64, 0xfba4, 0xfbe4, 0xfc24, 0xfc64, ! 55: 0xfc94, 0xfcb4, 0xfcd4, 0xfcf4, 0xfd14, 0xfd34, 0xfd54, 0xfd74, ! 56: 0xfd94, 0xfdb4, 0xfdd4, 0xfdf4, 0xfe14, 0xfe34, 0xfe54, 0xfe74, ! 57: 0xfe8c, 0xfe9c, 0xfeac, 0xfebc, 0xfecc, 0xfedc, 0xfeec, 0xfefc, ! 58: 0xff0c, 0xff1c, 0xff2c, 0xff3c, 0xff4c, 0xff5c, 0xff6c, 0xff7c, ! 59: 0xff88, 0xff90, 0xff98, 0xffa0, 0xffa8, 0xffb0, 0xffb8, 0xffc0, ! 60: 0xffc8, 0xffd0, 0xffd8, 0xffe0, 0xffe8, 0xfff0, 0xfff8, 0x0, ! 61: 0x7d7c, 0x797c, 0x757c, 0x717c, 0x6d7c, 0x697c, 0x657c, 0x617c, ! 62: 0x5d7c, 0x597c, 0x557c, 0x517c, 0x4d7c, 0x497c, 0x457c, 0x417c, ! 63: 0x3e7c, 0x3c7c, 0x3a7c, 0x387c, 0x367c, 0x347c, 0x327c, 0x307c, ! 64: 0x2e7c, 0x2c7c, 0x2a7c, 0x287c, 0x267c, 0x247c, 0x227c, 0x207c, ! 65: 0x1efc, 0x1dfc, 0x1cfc, 0x1bfc, 0x1afc, 0x19fc, 0x18fc, 0x17fc, ! 66: 0x16fc, 0x15fc, 0x14fc, 0x13fc, 0x12fc, 0x11fc, 0x10fc, 0xffc, ! 67: 0xf3c, 0xebc, 0xe3c, 0xdbc, 0xd3c, 0xcbc, 0xc3c, 0xbbc, ! 68: 0xb3c, 0xabc, 0xa3c, 0x9bc, 0x93c, 0x8bc, 0x83c, 0x7bc, ! 69: 0x75c, 0x71c, 0x6dc, 0x69c, 0x65c, 0x61c, 0x5dc, 0x59c, ! 70: 0x55c, 0x51c, 0x4dc, 0x49c, 0x45c, 0x41c, 0x3dc, 0x39c, ! 71: 0x36c, 0x34c, 0x32c, 0x30c, 0x2ec, 0x2cc, 0x2ac, 0x28c, ! 72: 0x26c, 0x24c, 0x22c, 0x20c, 0x1ec, 0x1cc, 0x1ac, 0x18c, ! 73: 0x174, 0x164, 0x154, 0x144, 0x134, 0x124, 0x114, 0x104, ! 74: 0xf4, 0xe4, 0xd4, 0xc4, 0xb4, 0xa4, 0x94, 0x84, ! 75: 0x78, 0x70, 0x68, 0x60, 0x58, 0x50, 0x48, 0x40, ! 76: 0x38, 0x30, 0x28, 0x20, 0x18, 0x10, 0x8, 0x0 ! 77: }; ! 78: ! 79: #define IMULAWOFFSET 8192 ! 80: #define IMULAWTABLEN 16384 ! 81: #define IMULAWMASK 16383 ! 82: ! 83: static unsigned char *iMuLaw = 0; ! 84: ! 85: struct mu { ! 86: short mu, linear; ! 87: }; ! 88: ! 89: static int compar(struct mu **p1, struct mu **p2) ! 90: { ! 91: if ((*p1)->linear > (*p2)->linear) return 1; ! 92: else if ((*p1)->linear == (*p2)->linear) return 0; ! 93: else return -1; ! 94: } ! 95: ! 96: void audio_makeIMuLawTab(void) ! 97: { ! 98: int i,j,k, d1, d2; ! 99: struct mu *mutab[256], mus[256]; ! 100: ! 101: if (iMuLaw) ! 102: return; ! 103: ! 104: iMuLaw = (unsigned char *)IOMalloc(IMULAWTABLEN * sizeof(unsigned char)); ! 105: ! 106: for (i = 0; i < 256; ++i) ! 107: { ! 108: mutab[i] = &mus[i]; ! 109: mus[i].mu = i; ! 110: mus[i].linear = audio_muLaw[i] >> 2; ! 111: } ! 112: qsort(mutab, 256, sizeof(struct mu *), compar); ! 113: ! 114: for (i = 0, j = 0, k = -8192; i < 16384; ++i, ++k) ! 115: { ! 116: if (j < 255) ! 117: { ! 118: d1 = k - mutab[j]->linear; ! 119: d2 = mutab[j+1]->linear - k; ! 120: if (d1 > 0 && d1 > d2) ! 121: ++j; ! 122: } ! 123: iMuLaw[i] = mutab[j]->mu; ! 124: } ! 125: } ! 126: ! 127: void audio_freeIMuLawTab(void) ! 128: { ! 129: if (iMuLaw) ! 130: IOFree(iMuLaw, IMULAWTABLEN * sizeof(unsigned char)); ! 131: } ! 132: ! 133: unsigned char audio_shortToMulaw(short p) ! 134: { ! 135: p >>= 2; /* scale input; table size is for 14 bit number! */ ! 136: ! 137: if (p >= (IMULAWTABLEN/2)) ! 138: return iMuLaw[IMULAWTABLEN-1]; ! 139: if (p < (-IMULAWTABLEN/2)) ! 140: return iMuLaw[0]; ! 141: else ! 142: return iMuLaw[p + IMULAWTABLEN/2]; ! 143: } ! 144: ! 145: unsigned char audio_byteToMulaw(char p) ! 146: { ! 147: /* FIXME: shift up to 14 bits?? */ ! 148: ! 149: return iMuLaw[p + IMULAWTABLEN/2]; ! 150: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.