88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * CDDL HEADER START
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * The contents of this file are subject to the terms of the
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Common Development and Distribution License (the "License").
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * You may not use this file except in compliance with the License.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * or http://www.opensolaris.org/os/licensing.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * See the License for the specific language governing permissions
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * and limitations under the License.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * When distributing Covered Code, include this CDDL HEADER in each
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * If applicable, add the following below this CDDL HEADER, with the
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * fields enclosed by brackets "[]" replaced with your own identifying
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * information: Portions Copyright [yyyy] [name of copyright owner]
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * CDDL HEADER END
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Copyright (C) 4Front Technologies 1996-2008.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Use is subject to license terms.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * Purpose: GRC3 Sample Rate Converter
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * GRC library version 3.1
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore_muldivu64(uint32_t a, uint32_t val1, uint32_t val2)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore return ((uint32_t)(v));
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int64_t v = ((int64_t)a) * filter_data_##T[idx >> 15]; \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore (((int64_t)(idx & 32767)) * (filter_data_##T[idx2 + 1] - \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore_conv31d_##T(int32_t *history, uint32_t filter, uint32_t incv) \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(L); ITERATION(L); ITERATION(L); ITERATION(L);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(M); ITERATION(M); ITERATION(M); ITERATION(M);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(M); ITERATION(M); ITERATION(M); ITERATION(M);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(H); ITERATION(H); ITERATION(H); ITERATION(H);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore_conv31_HX(int32_t *history, uint32_t filter)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(HX); ITERATION(HX); ITERATION(HX); ITERATION(HX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(P); ITERATION(P); ITERATION(P); ITERATION(P);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore_conv31_PX(int32_t *history, uint32_t filter)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore ITERATION(PX); ITERATION(PX); ITERATION(PX); ITERATION(PX);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_upsample_##QUAL(grc3state_t *grc, const int32_t *src, \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int32_t *dst, uint32_t sz, uint32_t bufsz, int inc, int offset) \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore while (sz > 0) { \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore if (history >= (grc->history + GRC3_MAXHISTORY * 2)) \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore history[0] = history[-GRC3_MAXHISTORY] = (*src); \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_dnsample_##QUAL(grc3state_t *grc, const int32_t *src, \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore int32_t *dst, uint32_t sz, uint32_t bufsz, int inc, int offset) \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore while (sz > 0) { \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore if (history >= (grc->history + GRC3_MAXHISTORY * 2)) \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * TODO: for better quality multiplier is worth moving \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * to output cascade \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_resample_##QUAL(grc3state_t *grc, const void *src, void *dst, \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore uint32_t sz, uint32_t bufsz, int inc, int offset) \
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore * For performance reasons, we only support 24-bit SRC.
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_convert(grc3state_t *grc, int quality, const void *src,
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore void *dst, int sz, int bufsz, int inc, int offset)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc3_resample_L(grc, src, dst, sz, bufsz, inc, offset);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc3_resample_M(grc, src, dst, sz, bufsz, inc, offset);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc3_resample_H(grc, src, dst, sz, bufsz, inc, offset);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc3_resample_HX(grc, src, dst, sz, bufsz, inc, offset);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc3_resample_P(grc, src, dst, sz, bufsz, inc, offset);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc3_resample_PX(grc, src, dst, sz, bufsz, inc, offset);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc->historyptr = grc->history + GRC3_MAXHISTORY;
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_setup_up(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_setup_dn(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc->ptr_incv = _muldivu64(1024 << 15, toRate, fromRate);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore grc->sat = _muldivu64(0x80000000U, toRate, fromRate);
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amoregrc3_setup(grc3state_t *grc, uint32_t fromRate, uint32_t toRate)
88447a05f537aabe9a1bc3d5313f22581ec992a7Garrett D'Amore while ((!(fromRate & 1)) && (!(toRate & 1)) && (fromRate > 0)) {