|
|
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.