1/*- 2 * Copyright (c) 2005-2009 Ariff Abdullah <ariff@FreeBSD.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 45 unchanged lines hidden (view full) --- 54#endif 55#include <dev/sound/pcm/sound.h> 56#include <dev/sound/pcm/pcm.h> 57#include "feeder_if.h" 58 59#define SND_USE_FXDIV 60#include "snd_fxdiv_gen.h" 61 |
62SND_DECLARE_FILE("$FreeBSD: head/sys/dev/sound/pcm/feeder_rate.c 195378 2009-07-05 18:15:06Z ariff $"); |
63#endif 64 65#include "feeder_rate_gen.h" 66 67#if !defined(_KERNEL) && defined(SND_DIAGNOSTIC) 68#undef Z_DIAGNOSTIC 69#define Z_DIAGNOSTIC 1 70#elif defined(_KERNEL) --- 451 unchanged lines hidden (view full) --- 522 * shifted to a full 32 bit, scaled and restored during write for 523 * maximum dynamic range (only for downsampling). 524 */ 525#define _Z_SINC_ACCUMULATE(SIGN, BIT, ENDIAN, adv) \ 526 c += z >> Z_SHIFT; \ 527 z &= Z_MASK; \ 528 coeff = Z_COEFF_INTERPOLATE(z, z_coeff[c], z_dcoeff[c]); \ 529 x = _PCM_READ_##SIGN##BIT##_##ENDIAN(p); \ |
530 v += Z_NORM_##BIT((intpcm64_t)x * coeff); \ |
531 z += info->z_dy; \ 532 p adv##= info->channels * PCM_##BIT##_BPS 533 534/* 535 * XXX GCC4 optimization is such a !@#$%, need manual unrolling. 536 */ 537#if defined(__GNUC__) && __GNUC__ >= 4 538#define Z_SINC_ACCUMULATE(...) do { \ --- 38 unchanged lines hidden (view full) --- 577 c = 0; \ 578 p = info->z_delay + (center * info->channels * \ 579 PCM_##BIT##_BPS) + ch; \ 580 for (i = info->z_size; i != 0; i -= Z_SINC_ACCUMULATE_DECR) \ 581 Z_SINC_ACCUMULATE(SIGN, BIT, ENDIAN, -); \ 582 if (info->z_scale != Z_ONE) \ 583 v = Z_SCALE_##BIT(v, info->z_scale); \ 584 else \ |
585 v >>= Z_COEFF_SHIFT - Z_GUARD_BIT_##BIT; \ |
586 Z_CLIP_CHECK(v, BIT); \ 587 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, Z_CLAMP(v, BIT)); \ 588 } while (ch != 0); \ 589} 590 591#define Z_DECLARE_SINC_POLYPHASE(SIGN, BIT, ENDIAN) \ 592static void \ 593z_feed_sinc_polyphase_##SIGN##BIT##ENDIAN(struct z_info *info, uint8_t *dst) \ --- 11 unchanged lines hidden (view full) --- 605 dst -= PCM_##BIT##_BPS; \ 606 ch -= PCM_##BIT##_BPS; \ 607 v = 0; \ 608 p = info->z_delay + start + ch; \ 609 z_pcoeff = info->z_pcoeff + \ 610 ((info->z_alpha * info->z_size) << 1); \ 611 for (i = info->z_size; i != 0; i--) { \ 612 x = _PCM_READ_##SIGN##BIT##_##ENDIAN(p); \ |
613 v += Z_NORM_##BIT((intpcm64_t)x * *z_pcoeff); \ |
614 z_pcoeff++; \ 615 p += info->channels * PCM_##BIT##_BPS; \ 616 x = _PCM_READ_##SIGN##BIT##_##ENDIAN(p); \ |
617 v += Z_NORM_##BIT((intpcm64_t)x * *z_pcoeff); \ |
618 z_pcoeff++; \ 619 p += info->channels * PCM_##BIT##_BPS; \ 620 } \ 621 if (info->z_scale != Z_ONE) \ 622 v = Z_SCALE_##BIT(v, info->z_scale); \ 623 else \ |
624 v >>= Z_COEFF_SHIFT - Z_GUARD_BIT_##BIT; \ |
625 Z_CLIP_CHECK(v, BIT); \ 626 _PCM_WRITE_##SIGN##BIT##_##ENDIAN(dst, Z_CLAMP(v, BIT)); \ 627 } while (ch != 0); \ 628} 629 630#define Z_DECLARE(SIGN, BIT, ENDIAN) \ 631 Z_DECLARE_LINEAR(SIGN, BIT, ENDIAN) \ 632 Z_DECLARE_SINC(SIGN, BIT, ENDIAN) \ --- 244 unchanged lines hidden (view full) --- 877 zoz = z - (Z_ONE >> 1); 878 zoe1 = z_coeff[1] + z_coeff[0]; 879 zoe2 = z_coeff[2] + z_coeff[-1]; 880 zoe3 = z_coeff[3] + z_coeff[-2]; 881 zoo1 = z_coeff[1] - z_coeff[0]; 882 zoo2 = z_coeff[2] - z_coeff[-1]; 883 zoo3 = z_coeff[3] - z_coeff[-2]; 884 |
885 zoc0 = ((0x1ac2260dLL * zoe1) >> 30) + |
886 ((0x0526cdcaLL * zoe2) >> 30) + ((0x00170c29LL * zoe3) >> 30); 887 zoc1 = ((0x14f8a49aLL * zoo1) >> 30) + 888 ((0x0d6d1109LL * zoo2) >> 30) + ((0x008cd4dcLL * zoo3) >> 30); 889 zoc2 = ((-0x0d3e94a4LL * zoe1) >> 30) + 890 ((0x0bddded4LL * zoe2) >> 30) + ((0x0160b5d0LL * zoe3) >> 30); 891 zoc3 = ((-0x0de10cc4LL * zoo1) >> 30) + 892 ((0x019b2a7dLL * zoo2) >> 30) + ((0x01cfe914LL * zoo3) >> 30); 893 zoc4 = ((0x02aa12d7LL * zoe1) >> 30) + --- 12 unchanged lines hidden (view full) --- 906 zoz = z - (Z_ONE >> 1); 907 zoe1 = z_coeff[1] + z_coeff[0]; 908 zoe2 = z_coeff[2] + z_coeff[-1]; 909 zoe3 = z_coeff[3] + z_coeff[-2]; 910 zoo1 = z_coeff[1] - z_coeff[0]; 911 zoo2 = z_coeff[2] - z_coeff[-1]; 912 zoo3 = z_coeff[3] - z_coeff[-2]; 913 |
914 zoc0 = ((0x1ac2260dLL * zoe1) >> 30) + |
915 ((0x0526cdcaLL * zoe2) >> 30) + ((0x00170c29LL * zoe3) >> 30); 916 zoc1 = ((0x14f8a49aLL * zoo1) >> 30) + 917 ((0x0d6d1109LL * zoo2) >> 30) + ((0x008cd4dcLL * zoo3) >> 30); 918 zoc2 = ((-0x0d3e94a4LL * zoe1) >> 30) + 919 ((0x0bddded4LL * zoe2) >> 30) + ((0x0160b5d0LL * zoe3) >> 30); 920 zoc3 = ((-0x0de10cc4LL * zoo1) >> 30) + 921 ((0x019b2a7dLL * zoo2) >> 30) + ((0x01cfe914LL * zoo3) >> 30); 922 zoc4 = ((0x02aa12d7LL * zoe1) >> 30) + --- 12 unchanged lines hidden (view full) --- 935 zoz = z - (Z_ONE >> 1); 936 zoe1 = z_coeff[1] + z_coeff[0]; 937 zoe2 = z_coeff[2] + z_coeff[-1]; 938 zoe3 = z_coeff[3] + z_coeff[-2]; 939 zoo1 = z_coeff[1] - z_coeff[0]; 940 zoo2 = z_coeff[2] - z_coeff[-1]; 941 zoo3 = z_coeff[3] - z_coeff[-2]; 942 |
943 zoc0 = ((0x1aa9b47dLL * zoe1) >> 30) + |
944 ((0x053d9944LL * zoe2) >> 30) + ((0x0018b23fLL * zoe3) >> 30); 945 zoc1 = ((0x14a104d1LL * zoo1) >> 30) + 946 ((0x0d7d2504LL * zoo2) >> 30) + ((0x0094b599LL * zoo3) >> 30); 947 zoc2 = ((-0x0d22530bLL * zoe1) >> 30) + 948 ((0x0bb37a2cLL * zoe2) >> 30) + ((0x016ed8e0LL * zoe3) >> 30); 949 zoc3 = ((-0x0d744b1cLL * zoo1) >> 30) + 950 ((0x01649591LL * zoo2) >> 30) + ((0x01dae93aLL * zoo3) >> 30); 951 zoc4 = ((0x02a7ee1bLL * zoe1) >> 30) + --- 12 unchanged lines hidden (view full) --- 964 zoz = z - (Z_ONE >> 1); 965 zoe1 = z_coeff[1] + z_coeff[0]; 966 zoe2 = z_coeff[2] + z_coeff[-1]; 967 zoe3 = z_coeff[3] + z_coeff[-2]; 968 zoo1 = z_coeff[1] - z_coeff[0]; 969 zoo2 = z_coeff[2] - z_coeff[-1]; 970 zoo3 = z_coeff[3] - z_coeff[-2]; 971 |
972 zoc0 = ((0x1a8eda43LL * zoe1) >> 30) + |
973 ((0x0556ee38LL * zoe2) >> 30) + ((0x001a3784LL * zoe3) >> 30); 974 zoc1 = ((0x143d863eLL * zoo1) >> 30) + 975 ((0x0d910e36LL * zoo2) >> 30) + ((0x009ca889LL * zoo3) >> 30); 976 zoc2 = ((-0x0d026821LL * zoe1) >> 30) + 977 ((0x0b837773LL * zoe2) >> 30) + ((0x017ef0c6LL * zoe3) >> 30); 978 zoc3 = ((-0x0cef1502LL * zoo1) >> 30) + 979 ((0x01207a8eLL * zoo2) >> 30) + ((0x01e936dbLL * zoo3) >> 30); 980 zoc4 = ((0x029fe643LL * zoe1) >> 30) + --- 12 unchanged lines hidden (view full) --- 993 zoz = z - (Z_ONE >> 1); 994 zoe1 = z_coeff[1] + z_coeff[0]; 995 zoe2 = z_coeff[2] + z_coeff[-1]; 996 zoe3 = z_coeff[3] + z_coeff[-2]; 997 zoo1 = z_coeff[1] - z_coeff[0]; 998 zoo2 = z_coeff[2] - z_coeff[-1]; 999 zoo3 = z_coeff[3] - z_coeff[-2]; 1000 |
1001 zoc0 = ((0x19edb6fdLL * zoe1) >> 30) + |
1002 ((0x05ebd062LL * zoe2) >> 30) + ((0x00267881LL * zoe3) >> 30); 1003 zoc1 = ((0x1223af76LL * zoo1) >> 30) + 1004 ((0x0de3dd6bLL * zoo2) >> 30) + ((0x00d683cdLL * zoo3) >> 30); 1005 zoc2 = ((-0x0c3ee068LL * zoe1) >> 30) + 1006 ((0x0a5c3769LL * zoe2) >> 30) + ((0x01e2aceaLL * zoe3) >> 30); 1007 zoc3 = ((-0x0a8ab614LL * zoo1) >> 30) + 1008 ((-0x0019522eLL * zoo2) >> 30) + ((0x022cefc7LL * zoo3) >> 30); 1009 zoc4 = ((0x0276187dLL * zoe1) >> 30) + --- 729 unchanged lines hidden --- |