^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /***************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * au88x0_a3d.c
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Fri Jul 18 14:16:22 2003
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright 2003 mjander
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * mjander@users.sourceforge.net
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * A3D. You may think i'm crazy, but this may work someday. Who knows...
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) ****************************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include "au88x0_a3d.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include "au88x0_a3ddata.c"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #include "au88x0_xtalk.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include "au88x0.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) a3dsrc_SetTimeConsts(a3dsrc_t * a, short HrtfTrack, short ItdTrack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) short GTrack, short CTrack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) a3d_addrA(a->slice, a->source, A3D_A_HrtfTrackTC), HrtfTrack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) a3d_addrA(a->slice, a->source, A3D_A_ITDTrackTC), ItdTrack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) a3d_addrA(a->slice, a->source, A3D_A_GainTrackTC), GTrack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) a3d_addrA(a->slice, a->source, A3D_A_CoeffTrackTC), CTrack);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) a3dsrc_GetTimeConsts(a3dsrc_t * a, short *HrtfTrack, short *ItdTrack,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) short *GTrack, short *CTrack)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) // stub!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* Atmospheric absorption. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) a3dsrc_SetAtmosTarget(a3dsrc_t * a, short aa, short b, short c, short d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) short e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) a3d_addrB(a->slice, a->source, A3D_B_A21Target),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) (e << 0x10) | d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) a3d_addrB(a->slice, a->source, A3D_B_B10Target),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) (b << 0x10) | aa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) a3d_addrB(a->slice, a->source, A3D_B_B2Target), c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) a3dsrc_SetAtmosCurrent(a3dsrc_t * a, short aa, short b, short c, short d,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) short e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) a3d_addrB(a->slice, a->source, A3D_B_A12Current),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) (e << 0x10) | d);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) a3d_addrB(a->slice, a->source, A3D_B_B01Current),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) (b << 0x10) | aa);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) a3d_addrB(a->slice, a->source, A3D_B_B2Current), c);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) a3dsrc_SetAtmosState(a3dsrc_t * a, short x1, short x2, short y1, short y2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_x1), x1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_x2), x2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_y1), y1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) hwwrite(vortex->mmio, a3d_addrA(a->slice, a->source, A3D_A_y2), y2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) a3dsrc_GetAtmosTarget(a3dsrc_t * a, short *aa, short *b, short *c,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) short *d, short *e)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) a3dsrc_GetAtmosCurrent(a3dsrc_t * a, short *bb01, short *ab01, short *b2,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) short *aa12, short *ba12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) *aa12 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) a3d_addrA(a->slice, a->source, A3D_A_A12Current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) *ba12 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) a3d_addrB(a->slice, a->source, A3D_B_A12Current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) *ab01 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) a3d_addrA(a->slice, a->source, A3D_A_B01Current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) *bb01 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) a3d_addrB(a->slice, a->source, A3D_B_B01Current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) *b2 =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) a3d_addrA(a->slice, a->source, A3D_A_B2Current));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) a3dsrc_GetAtmosState(a3dsrc_t * a, short *x1, short *x2, short *y1, short *y2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) /* HRTF */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) a3dsrc_SetHrtfTarget(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) a3d_addrB(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) A3D_B_HrtfTarget) + (i << 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) (b[i] << 0x10) | aa[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) a3dsrc_SetHrtfCurrent(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) a3d_addrB(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) A3D_B_HrtfCurrent) + (i << 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) (b[i] << 0x10) | aa[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) static void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) a3dsrc_SetHrtfState(a3dsrc_t * a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) a3d_addrB(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) A3D_B_HrtfDelayLine) + (i << 2),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) (b[i] << 0x10) | aa[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) static void a3dsrc_SetHrtfOutput(a3dsrc_t * a, short left, short right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) a3d_addrA(a->slice, a->source, A3D_A_HrtfOutL), left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) a3d_addrA(a->slice, a->source, A3D_A_HrtfOutR), right);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) static void a3dsrc_GetHrtfTarget(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) aa[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) a3d_addrA(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) A3D_A_HrtfTarget + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) b[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) a3d_addrB(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) A3D_B_HrtfTarget + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) static void a3dsrc_GetHrtfCurrent(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) aa[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) a3d_addrA(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) A3D_A_HrtfCurrent + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) b[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) a3d_addrB(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) A3D_B_HrtfCurrent + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) static void a3dsrc_GetHrtfState(a3dsrc_t * a, a3d_Hrtf_t aa, a3d_Hrtf_t b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) // FIXME: verify this!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) aa[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) a3d_addrA(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) A3D_A_HrtfDelayLine + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) for (i = 0; i < HRTF_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) b[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) a3d_addrB(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) A3D_B_HrtfDelayLine + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) static void a3dsrc_GetHrtfOutput(a3dsrc_t * a, short *left, short *right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) *left =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) a3d_addrA(a->slice, a->source, A3D_A_HrtfOutL));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) *right =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) a3d_addrA(a->slice, a->source, A3D_A_HrtfOutR));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) /* Interaural Time Difference.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) * "The other main clue that humans use to locate sounds, is called
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) * Interaural Time Difference (ITD). The differences in distance from
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) * the sound source to a listeners ears means that the sound will
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) * reach one ear slightly before the other....", found somewhere with google.*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) static void a3dsrc_SetItdTarget(a3dsrc_t * a, short litd, short ritd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) if (litd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) litd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) if (litd > 0x57FF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) litd = 0x57FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if (ritd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) ritd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (ritd > 0x57FF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) ritd = 0x57FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) a3d_addrB(a->slice, a->source, A3D_B_ITDTarget),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) (ritd << 0x10) | litd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) //hwwrite(vortex->mmio, addr(0x191DF+5, this04, this08), (ritd<<0x10)|litd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) static void a3dsrc_SetItdCurrent(a3dsrc_t * a, short litd, short ritd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) if (litd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) litd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) if (litd > 0x57FF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) litd = 0x57FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) if (ritd < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) ritd = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) if (ritd > 0x57FF)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) ritd = 0x57FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) a3d_addrB(a->slice, a->source, A3D_B_ITDCurrent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) (ritd << 0x10) | litd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) //hwwrite(vortex->mmio, addr(0x191DF+1, this04, this08), (ritd<<0x10)|litd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static void a3dsrc_SetItdDline(a3dsrc_t * a, a3d_ItdDline_t const dline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) /* 45 != 40 -> Check this ! */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) for (i = 0; i < DLINE_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) a3d_addrA(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) A3D_A_ITDDelayLine) + (i << 2), dline[i]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) static void a3dsrc_GetItdTarget(a3dsrc_t * a, short *litd, short *ritd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) *ritd =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) a3d_addrA(a->slice, a->source, A3D_A_ITDTarget));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) *litd =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) a3d_addrB(a->slice, a->source, A3D_B_ITDTarget));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) static void a3dsrc_GetItdCurrent(a3dsrc_t * a, short *litd, short *ritd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) *ritd =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) a3d_addrA(a->slice, a->source, A3D_A_ITDCurrent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) *litd =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) a3d_addrB(a->slice, a->source, A3D_B_ITDCurrent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) static void a3dsrc_GetItdDline(a3dsrc_t * a, a3d_ItdDline_t dline)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) for (i = 0; i < DLINE_SZ; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) dline[i] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) a3d_addrA(a->slice, a->source,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) A3D_A_ITDDelayLine + (i << 2)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) /* This is may be used for ILD Interaural Level Difference. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) static void a3dsrc_SetGainTarget(a3dsrc_t * a, short left, short right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) a3d_addrB(a->slice, a->source, A3D_B_GainTarget),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) (right << 0x10) | left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) static void a3dsrc_SetGainCurrent(a3dsrc_t * a, short left, short right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) a3d_addrB(a->slice, a->source, A3D_B_GainCurrent),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) (right << 0x10) | left);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) static void a3dsrc_GetGainTarget(a3dsrc_t * a, short *left, short *right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) *right =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) a3d_addrA(a->slice, a->source, A3D_A_GainTarget));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) *left =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) a3d_addrB(a->slice, a->source, A3D_B_GainTarget));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) static void a3dsrc_GetGainCurrent(a3dsrc_t * a, short *left, short *right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) *right =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) a3d_addrA(a->slice, a->source, A3D_A_GainCurrent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) *left =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) hwread(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) a3d_addrB(a->slice, a->source, A3D_B_GainCurrent));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) /* CA3dIO this func seems to be inlined all over this place. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) static void CA3dIO_WriteReg(a3dsrc_t * a, unsigned long addr, short aa, short b)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) hwwrite(vortex->mmio, addr, (aa << 0x10) | b);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) /* Generic A3D stuff */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) static void a3dsrc_SetA3DSampleRate(a3dsrc_t * a, int sr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) int esp0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) esp0 = (((esp0 & 0x7fffffff) | 0xB8000000) & 0x7) | ((sr & 0x1f) << 3);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), esp0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) //hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), esp0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) static void a3dsrc_EnableA3D(a3dsrc_t * a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 0xF0000001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) //hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), 0xF0000001);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) static void a3dsrc_DisableA3D(a3dsrc_t * a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 0xF0000000);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) static void a3dsrc_SetA3DControlReg(a3dsrc_t * a, unsigned long ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) hwwrite(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd), ctrl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) static void a3dsrc_SetA3DPointerReg(a3dsrc_t * a, unsigned long ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) hwwrite(vortex->mmio, A3D_SLICE_Pointers + ((a->slice) << 0xd), ptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) static void a3dsrc_GetA3DSampleRate(a3dsrc_t * a, int *sr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) *sr = ((hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) >> 3) & 0x1f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) //*sr = ((hwread(vortex->mmio, 0x19C38 + (this08<<0xd))>>3)&0x1f);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) static void a3dsrc_GetA3DControlReg(a3dsrc_t * a, unsigned long *ctrl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) *ctrl = hwread(vortex->mmio, A3D_SLICE_Control + ((a->slice) << 0xd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) static void a3dsrc_GetA3DPointerReg(a3dsrc_t * a, unsigned long *ptr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) *ptr = hwread(vortex->mmio, A3D_SLICE_Pointers + ((a->slice) << 0xd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) static void a3dsrc_ZeroSliceIO(a3dsrc_t * a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) for (i = 0; i < 8; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) A3D_SLICE_VDBDest +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) ((((a->slice) << 0xb) + i) << 2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) for (i = 0; i < 4; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) A3D_SLICE_VDBSource +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) ((((a->slice) << 0xb) + i) << 2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) /* Reset Single A3D source. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) static void a3dsrc_ZeroState(a3dsrc_t * a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) pr_debug( "vortex: ZeroState slice: %d, source %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) a->slice, a->source);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) a3dsrc_SetAtmosState(a, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) a3dsrc_SetItdDline(a, A3dItdDlineZeros);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) a3dsrc_SetHrtfOutput(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) a3dsrc_SetTimeConsts(a, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) a3dsrc_SetAtmosCurrent(a, 0, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) a3dsrc_SetAtmosTarget(a, 0, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) a3dsrc_SetItdCurrent(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) a3dsrc_SetItdTarget(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) a3dsrc_SetGainCurrent(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) a3dsrc_SetGainTarget(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) a3dsrc_SetHrtfCurrent(a, A3dHrirZeros, A3dHrirZeros);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) a3dsrc_SetHrtfTarget(a, A3dHrirZeros, A3dHrirZeros);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) /* Reset entire A3D engine */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) static void a3dsrc_ZeroStateA3D(a3dsrc_t *a, vortex_t *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) int i, var, var2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) if ((a->vortex) == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) dev_err(v->card->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) "ZeroStateA3D: ERROR: a->vortex is NULL\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) a3dsrc_SetA3DControlReg(a, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) a3dsrc_SetA3DPointerReg(a, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) var = a->slice;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) var2 = a->source;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) a->slice = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) a3dsrc_ZeroSliceIO(a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) //a3dsrc_ZeroState(a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) a->source = var2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) a->slice = var;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) /* Program A3D block as pass through */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) static void a3dsrc_ProgramPipe(a3dsrc_t * a)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) a3dsrc_SetTimeConsts(a, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) a3dsrc_SetAtmosCurrent(a, 0, 0x4000, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) a3dsrc_SetAtmosTarget(a, 0x4000, 0, 0, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) a3dsrc_SetItdCurrent(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) a3dsrc_SetItdTarget(a, 0, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) a3dsrc_SetGainCurrent(a, 0x7fff, 0x7fff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) a3dsrc_SetGainTarget(a, 0x7fff, 0x7fff);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) /* SET HRTF HERE */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) /* Single spike leads to identity transfer function. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) a3dsrc_SetHrtfCurrent(a, A3dHrirImpulse, A3dHrirImpulse);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) a3dsrc_SetHrtfTarget(a, A3dHrirImpulse, A3dHrirImpulse);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) /* Test: Sounds saturated. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) //a3dsrc_SetHrtfCurrent(a, A3dHrirSatTest, A3dHrirSatTest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) //a3dsrc_SetHrtfTarget(a, A3dHrirSatTest, A3dHrirSatTest);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) /* VDB = Vortex audio Dataflow Bus */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) static void a3dsrc_ClearVDBData(a3dsrc_t * a, unsigned long aa)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) vortex_t *vortex = (vortex_t *) (a->vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) // ((aa >> 2) << 8) - (aa >> 2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) a3d_addrS(a->slice, A3D_SLICE_VDBDest) + (a->source << 2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) hwwrite(vortex->mmio,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) a3d_addrS(a->slice,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) A3D_SLICE_VDBDest + 4) + (a->source << 2), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) hwwrite(vortex->mmio, 0x19c00 + (((aa>>2)*255*4)+aa)*8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) hwwrite(vortex->mmio, 0x19c04 + (((aa>>2)*255*4)+aa)*8, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) /* A3D HwSource stuff. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) static void vortex_A3dSourceHw_Initialize(vortex_t * v, int source, int slice)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) a3dsrc_t *a3dsrc = &(v->a3d[source + (slice * 4)]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) //a3dsrc_t *a3dsrc = &(v->a3d[source + (slice*4)]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) a3dsrc->vortex = (void *)v;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) a3dsrc->source = source; /* source */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) a3dsrc->slice = slice; /* slice */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) a3dsrc_ZeroState(a3dsrc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) /* Added by me. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) a3dsrc_SetA3DSampleRate(a3dsrc, 0x11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) static int Vort3DRend_Initialize(vortex_t * v, unsigned short mode)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) v->xt_mode = mode; /* this_14 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) vortex_XtalkHw_init(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) vortex_XtalkHw_SetGainsAllChan(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) switch (v->xt_mode) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) case XT_SPEAKER0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) vortex_XtalkHw_ProgramXtalkNarrow(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) case XT_SPEAKER1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) vortex_XtalkHw_ProgramXtalkWide(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) case XT_HEADPHONE:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) vortex_XtalkHw_ProgramPipe(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) case XT_DIAMOND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) vortex_XtalkHw_ProgramDiamondXtalk(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) vortex_XtalkHw_SetSampleRate(v, 0x11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) vortex_XtalkHw_Enable(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) /* 3D Sound entry points. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) static int vortex_a3d_register_controls(vortex_t * vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) static void vortex_a3d_unregister_controls(vortex_t * vortex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) /* A3D base support init/shudown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) static void vortex_Vort3D_enable(vortex_t *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) Vort3DRend_Initialize(v, XT_HEADPHONE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) for (i = 0; i < NR_A3D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) a3dsrc_ZeroStateA3D(&v->a3d[0], v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) /* Register ALSA controls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) vortex_a3d_register_controls(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) static void vortex_Vort3D_disable(vortex_t * v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) vortex_XtalkHw_Disable(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) vortex_a3d_unregister_controls(v);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) /* Make A3D subsystem connections. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) static void vortex_Vort3D_connect(vortex_t * v, int en)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) // Disable AU8810 routes, since they seem to be wrong (in au8810.h).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) #ifdef CHIP_AU8810
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) #if 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) /* Alloc Xtalk mixin resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) v->mixxtlk[0] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) if (v->mixxtlk[0] < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) dev_warn(v->card->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) "vortex_Vort3D: ERROR: not enough free mixer resources.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) v->mixxtlk[1] =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) if (v->mixxtlk[1] < 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) dev_warn(v->card->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) "vortex_Vort3D: ERROR: not enough free mixer resources.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) /* Connect A3D -> XTALK */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) for (i = 0; i < 4; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) // 2 outputs per each A3D slice.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) vortex_route(v, en, 0x11, ADB_A3DOUT(i * 2), ADB_XTALKIN(i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) vortex_route(v, en, 0x11, ADB_A3DOUT(i * 2) + 1, ADB_XTALKIN(5 + i));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) vortex_route(v, en, 0x11, ADB_XTALKOUT(0), ADB_EQIN(2));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) vortex_route(v, en, 0x11, ADB_XTALKOUT(1), ADB_EQIN(3));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) /* Connect XTalk -> mixer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) vortex_route(v, en, 0x11, ADB_XTALKOUT(0), ADB_MIXIN(v->mixxtlk[0]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) vortex_route(v, en, 0x11, ADB_XTALKOUT(1), ADB_MIXIN(v->mixxtlk[1]));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) vortex_connection_mixin_mix(v, en, v->mixxtlk[0], v->mixplayb[0], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) vortex_connection_mixin_mix(v, en, v->mixxtlk[1], v->mixplayb[1], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) vortex_mix_setinputvolumebyte(v, v->mixplayb[0], v->mixxtlk[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) en ? MIX_DEFIGAIN : VOL_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) vortex_mix_setinputvolumebyte(v, v->mixplayb[1], v->mixxtlk[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) en ? MIX_DEFIGAIN : VOL_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) if (VORTEX_IS_QUAD(v)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) vortex_connection_mixin_mix(v, en, v->mixxtlk[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) v->mixplayb[2], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) vortex_connection_mixin_mix(v, en, v->mixxtlk[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) v->mixplayb[3], 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) vortex_mix_setinputvolumebyte(v, v->mixplayb[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) v->mixxtlk[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) en ? MIX_DEFIGAIN : VOL_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) vortex_mix_setinputvolumebyte(v, v->mixplayb[3],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) v->mixxtlk[1],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662) en ? MIX_DEFIGAIN : VOL_MIN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) /* Initialize one single A3D source. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) static void vortex_Vort3D_InitializeSource(a3dsrc_t *a, int en, vortex_t *v)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) if (a->vortex == NULL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) dev_warn(v->card->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) "Vort3D_InitializeSource: A3D source not initialized\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) if (en) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) a3dsrc_ProgramPipe(a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) a3dsrc_SetA3DSampleRate(a, 0x11);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) a3dsrc_SetTimeConsts(a, HrtfTCDefault,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) ItdTCDefault, GainTCDefault,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) CoefTCDefault);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) /* Remark: zero gain is muted. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) //a3dsrc_SetGainTarget(a,0,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) //a3dsrc_SetGainCurrent(a,0,0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) a3dsrc_EnableA3D(a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) a3dsrc_DisableA3D(a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) a3dsrc_ZeroState(a);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) /* Conversion of coordinates into 3D parameters. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) static void vortex_a3d_coord2hrtf(a3d_Hrtf_t hrtf, int *coord)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) /* FIXME: implement this. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) static void vortex_a3d_coord2itd(a3d_Itd_t itd, int *coord)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) /* FIXME: implement this. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) static void vortex_a3d_coord2ild(a3d_LRGains_t ild, int left, int right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) /* FIXME: implement this. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) static void vortex_a3d_translate_filter(a3d_atmos_t filter, int *params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) /* FIXME: implement this. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) /* ALSA control interface. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) snd_vortex_a3d_hrtf_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) uinfo->count = 6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721) uinfo->value.integer.min = 0x00000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) uinfo->value.integer.max = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) snd_vortex_a3d_itd_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) uinfo->count = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) uinfo->value.integer.min = 0x00000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) uinfo->value.integer.max = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) snd_vortex_a3d_ild_info(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) uinfo->count = 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) uinfo->value.integer.min = 0x00000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) uinfo->value.integer.max = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) snd_vortex_a3d_filter_info(struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) struct snd_ctl_elem_info *uinfo)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) uinfo->count = 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) uinfo->value.integer.min = 0x00000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) uinfo->value.integer.max = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) snd_vortex_a3d_get(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) //a3dsrc_t *a = kcontrol->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) /* No read yet. Would this be really useable/needed ? */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) snd_vortex_a3d_hrtf_put(struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) a3dsrc_t *a = kcontrol->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) int coord[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) for (i = 0; i < 6; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) coord[i] = ucontrol->value.integer.value[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) /* Translate orientation coordinates to a3d params. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) vortex_a3d_coord2hrtf(a->hrtf[0], coord);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) vortex_a3d_coord2hrtf(a->hrtf[1], coord);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) a3dsrc_SetHrtfTarget(a, a->hrtf[0], a->hrtf[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) a3dsrc_SetHrtfCurrent(a, a->hrtf[0], a->hrtf[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) snd_vortex_a3d_itd_put(struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) a3dsrc_t *a = kcontrol->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) int coord[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) for (i = 0; i < 6; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) coord[i] = ucontrol->value.integer.value[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) /* Translate orientation coordinates to a3d params. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) vortex_a3d_coord2itd(a->hrtf[0], coord);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) vortex_a3d_coord2itd(a->hrtf[1], coord);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) /* Inter aural time difference. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) a3dsrc_SetItdTarget(a, a->itd[0], a->itd[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) a3dsrc_SetItdCurrent(a, a->itd[0], a->itd[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) a3dsrc_SetItdDline(a, a->dline);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) snd_vortex_a3d_ild_put(struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) a3dsrc_t *a = kcontrol->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) int l, r;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) /* There may be some scale tranlation needed here. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) l = ucontrol->value.integer.value[0];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) r = ucontrol->value.integer.value[1];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) vortex_a3d_coord2ild(a->ild, l, r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) /* Left Right panning. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) a3dsrc_SetGainTarget(a, l, r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) a3dsrc_SetGainCurrent(a, l, r);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) snd_vortex_a3d_filter_put(struct snd_kcontrol *kcontrol,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) struct snd_ctl_elem_value *ucontrol)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) a3dsrc_t *a = kcontrol->private_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) int params[6];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) for (i = 0; i < 6; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) params[i] = ucontrol->value.integer.value[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) /* Translate generic filter params to a3d filter params. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) vortex_a3d_translate_filter(a->filter, params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) /* Atmospheric absorption and filtering. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) a3dsrc_SetAtmosTarget(a, a->filter[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) a->filter[1], a->filter[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) a->filter[3], a->filter[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) a3dsrc_SetAtmosCurrent(a, a->filter[0],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) a->filter[1], a->filter[2],
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) a->filter[3], a->filter[4]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) static const struct snd_kcontrol_new vortex_a3d_kcontrol = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) .iface = SNDRV_CTL_ELEM_IFACE_PCM,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838) .name = "Playback PCM advanced processing",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) .access = SNDRV_CTL_ELEM_ACCESS_READWRITE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) .info = snd_vortex_a3d_hrtf_info,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841) .get = snd_vortex_a3d_get,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) .put = snd_vortex_a3d_hrtf_put,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) /* Control (un)registration. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) static int vortex_a3d_register_controls(vortex_t *vortex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) struct snd_kcontrol *kcontrol;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) int err, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) /* HRTF controls. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) for (i = 0; i < NR_A3D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) if ((kcontrol =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) kcontrol->id.numid = CTRLID_HRTF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) kcontrol->info = snd_vortex_a3d_hrtf_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) kcontrol->put = snd_vortex_a3d_hrtf_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) /* ITD controls. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862) for (i = 0; i < NR_A3D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) if ((kcontrol =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864) snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) kcontrol->id.numid = CTRLID_ITD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) kcontrol->info = snd_vortex_a3d_itd_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) kcontrol->put = snd_vortex_a3d_itd_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) /* ILD (gains) controls. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) for (i = 0; i < NR_A3D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) if ((kcontrol =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877) kcontrol->id.numid = CTRLID_GAINS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) kcontrol->info = snd_vortex_a3d_ild_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) kcontrol->put = snd_vortex_a3d_ild_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) /* Filter controls. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) for (i = 0; i < NR_A3D; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) if ((kcontrol =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886) snd_ctl_new1(&vortex_a3d_kcontrol, &vortex->a3d[i])) == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) kcontrol->id.numid = CTRLID_FILTER;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) kcontrol->info = snd_vortex_a3d_filter_info;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) kcontrol->put = snd_vortex_a3d_filter_put;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) if ((err = snd_ctl_add(vortex->card, kcontrol)) < 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) return err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) static void vortex_a3d_unregister_controls(vortex_t * vortex)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) /* End of File*/