|
|
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_peak.c ! 26: * ! 27: * Copyright (c) 1992, NeXT Computer, Inc. All rights reserved. ! 28: * ! 29: * Peak calculation routines. ! 30: * ! 31: * HISTORY ! 32: * 12/08/92/mtm Original coding from 68k version. ! 33: */ ! 34: ! 35: #import "audio_peak.h" ! 36: #import "audio_mulaw.h" ! 37: ! 38: /* ! 39: * Calculate peaks in a mulaw 8-bit buffer. ! 40: * Returns peak as 16-bit linear int. ! 41: */ ! 42: void audio_mulaw8_peak(u_int chans, unsigned char *buf, u_int count, ! 43: u_int *peak_left, u_int *peak_right) ! 44: { ! 45: int i; ! 46: short samp; ! 47: ! 48: *peak_left = *peak_right = 0; ! 49: if (chans == 1) { ! 50: for (i = 0; i < count/4; i++) { ! 51: samp = audio_muLaw[*buf++]; ! 52: if (samp < 0) ! 53: samp = -samp; ! 54: if (samp > *peak_left) ! 55: *peak_left = samp; ! 56: buf += 3; ! 57: } ! 58: *peak_right = *peak_left; ! 59: } else { ! 60: for (i = 0; i < count/4; i++) { ! 61: samp = audio_muLaw[*buf++]; ! 62: if (samp < 0) ! 63: samp = -samp; ! 64: if (samp > *peak_left) ! 65: *peak_left = samp; ! 66: buf++; ! 67: samp = audio_muLaw[*buf++]; ! 68: if (samp < 0) ! 69: samp = -samp; ! 70: if (samp > *peak_right) ! 71: *peak_right = samp; ! 72: buf++; ! 73: } ! 74: } ! 75: } ! 76: ! 77: /* ! 78: * Calculate peaks in a linear 16-bit buffer. ! 79: */ ! 80: void audio_linear16_peak(u_int chans, short *buf, u_int count, ! 81: u_int *peak_left, u_int *peak_right) ! 82: { ! 83: int i; ! 84: short samp; ! 85: ! 86: *peak_left = *peak_right = 0; ! 87: if (chans == 1) { ! 88: for (i = 0; i < count/2; i++) { ! 89: samp = *buf++; ! 90: if (samp < 0) ! 91: samp = -samp; ! 92: if (samp > *peak_left) ! 93: *peak_left = samp; ! 94: buf++; ! 95: } ! 96: *peak_right = *peak_left; ! 97: } else { ! 98: for (i = 0; i < count/2; i++) { ! 99: samp = *buf++; ! 100: if (samp < 0) ! 101: samp = -samp; ! 102: if (samp > *peak_left) ! 103: *peak_left = samp; ! 104: samp = *buf++; ! 105: if (samp < 0) ! 106: samp = -samp; ! 107: if (samp > *peak_right) ! 108: *peak_right = samp; ! 109: } ! 110: } ! 111: } ! 112: /* ! 113: * Calculate peaks in a linear 8-bit buffer. ! 114: * Returns peak as 16-bit linear int. ! 115: */ ! 116: void audio_linear8_peak(u_int chans, char *buf, u_int count, u_int *peak_left, ! 117: u_int *peak_right) ! 118: { ! 119: int i; ! 120: char samp; ! 121: ! 122: *peak_left = *peak_right = 0; ! 123: if (chans == 1) { ! 124: for (i = 0; i < count/2; i++) { ! 125: samp = *buf++; ! 126: /* FIXME: iff devIsUnary */ ! 127: /* convert to 2's comp. by xor'ing the high bit */ ! 128: samp = (samp ^ 0x80) | (samp & 0x7f); ! 129: if (samp < 0) ! 130: samp = -samp; ! 131: if (samp > *peak_left) ! 132: *peak_left = samp; ! 133: buf++; ! 134: } ! 135: *peak_right = *peak_left; ! 136: } else { ! 137: for (i = 0; i < count/2; i++) { ! 138: samp = *buf++; ! 139: /* FIXME: iff devIsUnary */ ! 140: /* convert to 2's comp. by xor'ing the high bit */ ! 141: samp = (samp ^ 0x80) | (samp & 0x7f); ! 142: if (samp < 0) ! 143: samp = -samp; ! 144: if (samp > *peak_left) ! 145: *peak_left = samp; ! 146: samp = *buf++; ! 147: /* FIXME: iff devIsUnary */ ! 148: /* convert to 2's comp. by xor'ing the high bit */ ! 149: samp = (samp ^ 0x80) | (samp & 0x7f); ! 150: if (samp < 0) ! 151: samp = -samp; ! 152: if (samp > *peak_right) ! 153: *peak_right = samp; ! 154: } ! 155: } ! 156: *peak_right <<= 8; ! 157: *peak_left <<= 8; ! 158: } ! 159: ! 160: /* ! 161: * Clear peaks in peak buffer. ! 162: */ ! 163: void audio_clear_peaks(u_int *peak_buf, u_int count) ! 164: { ! 165: while (count--) ! 166: *peak_buf++ = 0; ! 167: } ! 168: ! 169: /* ! 170: * Return max peak in peak buffer. ! 171: */ ! 172: u_int audio_max_peak(u_int *peak_buf, u_int count) ! 173: { ! 174: u_int peak, max = 0; ! 175: ! 176: while (count--) { ! 177: peak = *peak_buf++; ! 178: if (peak > max) ! 179: max = peak; ! 180: } ! 181: return max; ! 182: } ! 183: ! 184: /* ! 185: * Add a peak to circular peak buffer and bump cur index. ! 186: */ ! 187: void audio_add_peak(u_int *peak_buf, u_int peak, u_int *cur, u_int count) ! 188: { ! 189: if (count == 0) ! 190: return; ! 191: peak_buf[*cur] = peak; ! 192: *cur = *cur + 1; ! 193: if (*cur == count) ! 194: *cur = 0; ! 195: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.