Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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*/