/[openvortex]/alsa/pci/au88x0/au88x0_a3d.c
ViewVC logotype

Diff of /alsa/pci/au88x0/au88x0_a3d.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.4 by mjander, Wed Nov 19 23:48:50 2003 UTC revision 1.5 by mjander, Sun Nov 30 14:00:39 2003 UTC
# Line 10  Line 10 
10    
11  #include "au88x0_a3d.h"  #include "au88x0_a3d.h"
12  #include "au88x0_a3ddata.c"  #include "au88x0_a3ddata.c"
13    #include "au88x0_xtalk.h"
14  #include "au88x0.h"  #include "au88x0.h"
15    
16  void a3dsrc_SetTimeConsts(a3dsrc_t *a, short HrtfTrack, short ItdTrack, short GTrack, short CTrack) {  void a3dsrc_SetTimeConsts(a3dsrc_t *a, short HrtfTrack, short ItdTrack, short GTrack, short CTrack) {
17          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
18          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfTrackTC), HrtfTrack);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfTrackTC), HrtfTrack);
19          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDTrackTC), ItdTrack);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDTrackTC), ItdTrack);
20          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_GainTrackTC), GTrack);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_GainTrackTC), GTrack);
# Line 27  void a3dsrc_GetTimeConsts(a3dsrc_t *a, Line 28  void a3dsrc_GetTimeConsts(a3dsrc_t *a,
28  /* Atmospheric absorbtion. */  /* Atmospheric absorbtion. */
29    
30  void a3dsrc_SetAtmosTarget(a3dsrc_t *a, short aa,short b,short c,short d,short e) {  void a3dsrc_SetAtmosTarget(a3dsrc_t *a, short aa,short b,short c,short d,short e) {
31          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
         //hwwrite(vortex->mmio, addr(0x190Ec, this04, this08), (e << 0x10) | d);  
32          hwwrite(vortex->mmio,a3d_addr(a->slice,a->source,A3D_B_A21Target),(e << 0x10) | d);          hwwrite(vortex->mmio,a3d_addr(a->slice,a->source,A3D_B_A21Target),(e << 0x10) | d);
         //hwwrite(vortex->mmio, addr(0x190F4, this04, this08), (b << 0x10) | a);  
33          hwwrite(vortex->mmio,a3d_addr(a->slice,a->source,A3D_B_B10Target),(b << 0x10) | aa);          hwwrite(vortex->mmio,a3d_addr(a->slice,a->source,A3D_B_B10Target),(b << 0x10) | aa);
         //hwwrite(vortex->mmio, addr(0x190FC, this04, this08), c);  
34          hwwrite(vortex->mmio,a3d_addr(a->slice,a->source,A3D_B_B2Target), c);          hwwrite(vortex->mmio,a3d_addr(a->slice,a->source,A3D_B_B2Target), c);
35  }  }
36    
# Line 40  void a3dsrc_GetAtmosTarget(a3dsrc_t *a, Line 38  void a3dsrc_GetAtmosTarget(a3dsrc_t *a,
38  }  }
39    
40  void a3dsrc_SetAtmosCurrent(a3dsrc_t *a, short aa,short b,short c,short d,short e) {  void a3dsrc_SetAtmosCurrent(a3dsrc_t *a, short aa,short b,short c,short d,short e) {
41          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
42          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_A12Current), (e << 0x10) | d);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_A12Current), (e << 0x10) | d);
43          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_B01Current), (b << 0x10) | aa);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_B01Current), (b << 0x10) | aa);
44          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_B2Current), c);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_B2Current), c);
45  }  }
46    
47  void a3dsrc_GetAtmosCurrent(a3dsrc_t *a, short *aa, short *b, short *c, short *d, short *e) {  void a3dsrc_GetAtmosCurrent(a3dsrc_t *a, short *bb01, short *ab01, short *b2, short *aa12, short *ba12) {
48          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
49          *d = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_A12Current));          *aa12 = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_A12Current));
50          *e = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_A12Current));          *ba12 = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_A12Current));
51          *b = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_B01Current));          *ab01 = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_B01Current));
52          *aa = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_B01Current));          *bb01 = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_B01Current));
53          *c = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_B2Current));          *b2 = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_B2Current));
54  }  }
55    
56  void a3dsrc_SetAtmosState(a3dsrc_t *a, short aa,short b,short c,short d) {  void a3dsrc_SetAtmosState(a3dsrc_t *a, short x1,short x2,short y1,short y2) {
57          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
58          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_x1), aa);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_x1), x1);
59          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_x2), b);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_x2), x2);
60          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_y1), c);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_y1), y1);
61          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_y2), d);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_y2), y2);
62  }  }
63    
64  void a3dsrc_GetAtmosState(a3dsrc_t *a, short aa,short b,short c,short d) {  void a3dsrc_GetAtmosState(a3dsrc_t *a, short *x1,short *x2,short *y1,short *y2) {
65                    
66  }  }
67    
68    
69  /* HRTF */  /* HRTF */
70    
71  void a3dsrc_SetHrtfTarget(a3dsrc_t *a, short const *aa, short const *b) {  void a3dsrc_SetHrtfTarget(a3dsrc_t *a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b) {
72          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
73          int i;          int i;
74                    
75          for (i=0; i<HRTF_SZ; i++)          for (i=0; i<HRTF_SZ; i++)
76                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfTarget + (i<<2)), (b[i]<<0x10) | aa[i]);                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfTarget) + (i<<2), (b[i]<<0x10) | aa[i]);
77  }  }
78    
79  void a3dsrc_GetHrtfTarget(a3dsrc_t *a, short *aa, short *b) {  void a3dsrc_GetHrtfTarget(a3dsrc_t *a, a3d_Hrtf_t aa, a3d_Hrtf_t b) {
80          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
81          int i;          int i;
82                    
83          for (i=0; i<HRTF_SZ; i++)          for (i=0; i<HRTF_SZ; i++)
# Line 88  void a3dsrc_GetHrtfTarget(a3dsrc_t *a, s Line 86  void a3dsrc_GetHrtfTarget(a3dsrc_t *a, s
86                  b[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfTarget + (i<<2)));                    b[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfTarget + (i<<2)));  
87  }  }
88    
89  void a3dsrc_SetHrtfCurrent(a3dsrc_t *a, short const *aa, short const *b) {  void a3dsrc_SetHrtfCurrent(a3dsrc_t *a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b) {
90          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
91          int i;          int i;
92                    
93          for (i=0; i<HRTF_SZ; i++)          for (i=0; i<HRTF_SZ; i++)
94                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfCurrent + (i<<2)), (b[i]<<0x10) | aa[i]);                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfCurrent) + (i<<2), (b[i]<<0x10) | aa[i]);
95  }  }
96    
97  void a3dsrc_GetHrtfCurrent(a3dsrc_t *a, short *aa, short *b) {  void a3dsrc_GetHrtfCurrent(a3dsrc_t *a, a3d_Hrtf_t aa, a3d_Hrtf_t b) {
98          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
99          int i;          int i;
100                    
101          for (i=0; i<HRTF_SZ; i++)          for (i=0; i<HRTF_SZ; i++)
# Line 106  void a3dsrc_GetHrtfCurrent(a3dsrc_t *a, Line 104  void a3dsrc_GetHrtfCurrent(a3dsrc_t *a,
104                  b[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfCurrent + (i<<2)));                  b[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfCurrent + (i<<2)));
105  }  }
106    
107  void a3dsrc_SetHrtfState(a3dsrc_t *a, short const *aa, short const *b) {  void a3dsrc_SetHrtfState(a3dsrc_t *a, a3d_Hrtf_t const aa, a3d_Hrtf_t const b) {
108          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
109          int i;          int i;
110                    
111          for (i=0; i<HRTF_SZ; i++)          for (i=0; i<HRTF_SZ; i++)
112                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfDelayLine + (i<<2)), (b[i]<<0x10) | aa[i]);                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfDelayLine) + (i<<2), (b[i]<<0x10) | aa[i]);
113  }  }
114    
115  void a3dsrc_GetHrtfState(a3dsrc_t *a, short *aa, short *b) {  void a3dsrc_GetHrtfState(a3dsrc_t *a, a3d_Hrtf_t aa, a3d_Hrtf_t b) {
116          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
117          int i;          int i;
118          // FIXME: verify this!          // FIXME: verify this!
119          for (i=0; i<HRTF_SZ; i++)          for (i=0; i<HRTF_SZ; i++)
# Line 124  void a3dsrc_GetHrtfState(a3dsrc_t *a, sh Line 122  void a3dsrc_GetHrtfState(a3dsrc_t *a, sh
122                  b[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfDelayLine + (i<<2)));                        b[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_HrtfDelayLine + (i<<2)));      
123  }  }
124    
 void a3dsrc_GetHrtfOutput(a3dsrc_t *a, short *left, short *right) {  
         vortex_t *vortex = (vortex_t*)a->vortex;  
         *left = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutL));  
         *right = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutR));  
 }  
   
125  void a3dsrc_SetHrtfOutput(a3dsrc_t *a, short left,short right) {  void a3dsrc_SetHrtfOutput(a3dsrc_t *a, short left,short right) {
126          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
127          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutL), left);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutL), left);
128          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutR), right);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutR), right);
129  }  }
130    
131    void a3dsrc_GetHrtfOutput(a3dsrc_t *a, short *left, short *right) {
132            vortex_t *vortex = (vortex_t*)(a->vortex);
133            *left = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutL));
134            *right = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_HrtfOutR));
135    }
136    
137  /* Interaural Time Difference.  /* Interaural Time Difference.
138   * "The other main clue that humans use to locate sounds, is called   * "The other main clue that humans use to locate sounds, is called
139   * Interaural Time Difference (ITD). The differences in distance from   * Interaural Time Difference (ITD). The differences in distance from
140   * the sound source to a listeners ears means  that the sound will   * the sound source to a listeners ears means  that the sound will
141   * reach one ear slightly before the other....", found somewhere with google.*/   * reach one ear slightly before the other....", found somewhere with google.*/
142  void a3dsrc_SetItdTarget(a3dsrc_t *a, short litd,short ritd) {  void a3dsrc_SetItdTarget(a3dsrc_t *a, short litd,short ritd) {
143          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
144                    
145          if (litd < 0)          if (litd < 0)
146                  litd = 0;                  litd = 0;
# Line 157  void a3dsrc_SetItdTarget(a3dsrc_t *a, sh Line 155  void a3dsrc_SetItdTarget(a3dsrc_t *a, sh
155  }  }
156    
157  void a3dsrc_GetItdTarget(a3dsrc_t *a, short *litd, short *ritd) {  void a3dsrc_GetItdTarget(a3dsrc_t *a, short *litd, short *ritd) {
158          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
159          *ritd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDTarget));          *ritd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDTarget));
160          *litd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_ITDTarget));          *litd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_ITDTarget));
161  }  }
162    
163  void a3dsrc_SetItdCurrent(a3dsrc_t *a, short litd, short ritd) {  void a3dsrc_SetItdCurrent(a3dsrc_t *a, short litd, short ritd) {
164          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
165                    
166          if (litd < 0)          if (litd < 0)
167                  litd = 0;                  litd = 0;
# Line 178  void a3dsrc_SetItdCurrent(a3dsrc_t *a, s Line 176  void a3dsrc_SetItdCurrent(a3dsrc_t *a, s
176  }  }
177    
178  void a3dsrc_GetItdCurrent(a3dsrc_t *a, short *litd,short *ritd) {  void a3dsrc_GetItdCurrent(a3dsrc_t *a, short *litd,short *ritd) {
179          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
180                    
181          *ritd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDCurrent));          *ritd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDCurrent));
182          *litd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_ITDCurrent));          *litd = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_ITDCurrent));
183  }  }
184    
185  void a3dsrc_SetItdDline(a3dsrc_t *a, short const *dline) {  void a3dsrc_SetItdDline(a3dsrc_t *a, a3d_ItdDline_t const dline) {
186          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
187          int i;          int i;
188          /* 45 != 40 -> Check this ! */          /* 45 != 40 -> Check this ! */
189          for (i=0; i<DLINE_SZ; i++)          for (i=0; i<DLINE_SZ; i++)
190                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDDelayLine + (i<<2)), dline[i]);                  hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDDelayLine) + (i<<2), dline[i]);
191  }  }
192    
193  void a3dsrc_GetItdDline(a3dsrc_t *a, short *dline) {  void a3dsrc_GetItdDline(a3dsrc_t *a, a3d_ItdDline_t dline) {
194          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
195          int i;          int i;
196                    
197          for (i=0; i<DLINE_SZ; i++)          for (i=0; i<DLINE_SZ; i++)
198                  dline[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDDelayLine + (i<<2)));                      dline[i] = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_ITDDelayLine + (i<<2)));    
199  }  }
200    
201  /* This is may be used for IID Interaural Intensity Difference. */  /* This is may be used for ILD Interaural Level Difference. */
202    
203  void a3dsrc_SetGainTarget(a3dsrc_t *a, short aa, short b) {  void a3dsrc_SetGainTarget(a3dsrc_t *a, short left, short right) {
204          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
205          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainTarget), (b<<0x10)|aa);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainTarget), (right<<0x10)|left);
206  }  }
207    
208  void a3dsrc_GetGainTarget(a3dsrc_t *a, short *aa, short *b) {  void a3dsrc_GetGainTarget(a3dsrc_t *a, short *left, short *right) {
209          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
210          *b = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_GainTarget));          *right = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_GainTarget));
211          *aa = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainTarget));          *left = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainTarget));
212  }  }
213    
214  void a3dsrc_SetGainCurrent(a3dsrc_t *a, short aa, short b) {  void a3dsrc_SetGainCurrent(a3dsrc_t *a, short left, short right) {
215          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
216          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainCurrent), (b<<0x10)|aa);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainCurrent), (right<<0x10)|left);
         //hwwrite(vortex->mmio, addr(0x190DC+4, this04, this08), (b<<0x10)|a);  
217  }  }
218    
219  void a3dsrc_GetGainCurrent(a3dsrc_t *a, short *aa, short *b) {  void a3dsrc_GetGainCurrent(a3dsrc_t *a, short *left, short *right) {
220          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
221          *b = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_GainCurrent));          *right = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_A_GainCurrent));
222          *aa = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainCurrent));          *left = hwread(vortex->mmio, a3d_addr(a->slice, a->source, A3D_B_GainCurrent));
223  }  }
224    
225  /* CA3dIO this func seems to be inlined all over this place. */  /* CA3dIO this func seems to be inlined all over this place. */
226  void CA3dIO_WriteReg(a3dsrc_t *a, unsigned long addr, short aa, short b) {  void CA3dIO_WriteReg(a3dsrc_t *a, unsigned long addr, short aa, short b) {
227          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
228          hwwrite(vortex->mmio, addr, (aa<<0x10)|b);          hwwrite(vortex->mmio, addr, (aa<<0x10)|b);
229  }  }
230    
231  /* Generic A3D stuff */  /* Generic A3D stuff */
232    
233  void a3dsrc_SetA3DSampleRate(a3dsrc_t *a, int sr) {  void a3dsrc_SetA3DSampleRate(a3dsrc_t *a, int sr) {
234          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
235          int esp0 = 0;          int esp0 = 0;
236                    
237          esp0 = (((esp0 & 0x7fffffff)|0xB8000000)&0x7) | ((sr&0x1f)<<3);          esp0 = (((esp0 & 0x7fffffff)|0xB8000000)&0x7) | ((sr&0x1f)<<3);
# Line 243  void a3dsrc_SetA3DSampleRate(a3dsrc_t *a Line 240  void a3dsrc_SetA3DSampleRate(a3dsrc_t *a
240  }  }
241    
242  void a3dsrc_GetA3DSampleRate(a3dsrc_t *a, int *sr) {  void a3dsrc_GetA3DSampleRate(a3dsrc_t *a, int *sr) {
243          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
244          *sr = ((hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd))>>3)&0x1f);          *sr = ((hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd))>>3)&0x1f);
245          //*sr = ((hwread(vortex->mmio, 0x19C38 + (this08<<0xd))>>3)&0x1f);          //*sr = ((hwread(vortex->mmio, 0x19C38 + (this08<<0xd))>>3)&0x1f);
246  }  }
247    
248  void a3dsrc_EnableA3D(a3dsrc_t *a) {  void a3dsrc_EnableA3D(a3dsrc_t *a) {
249          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
250          hwwrite(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd), 0xF0000001);          hwwrite(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd), 0xF0000001);
251          //hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), 0xF0000001);          //hwwrite(vortex->mmio, 0x19C38 + (this08<<0xd), 0xF0000001);
252  }  }
253    
254  void a3dsrc_DisableA3D(a3dsrc_t *a) {  void a3dsrc_DisableA3D(a3dsrc_t *a) {
255          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
256          hwwrite(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd), 0xF0000000);          hwwrite(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd), 0xF0000000);
257  }  }
258    
259  void a3dsrc_SetA3DControlReg(a3dsrc_t *a, unsigned long ctrl) {  void a3dsrc_SetA3DControlReg(a3dsrc_t *a, unsigned long ctrl) {
260          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
261          hwwrite(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd), ctrl);          hwwrite(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd), ctrl);
262  }  }
263    
264  void a3dsrc_GetA3DControlReg(a3dsrc_t *a, unsigned long *ctrl) {  void a3dsrc_GetA3DControlReg(a3dsrc_t *a, unsigned long *ctrl) {
265          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
266          *ctrl = hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd));          *ctrl = hwread(vortex->mmio, A3D_SLICE_Control + (a->slice << 0xd));
267  }  }
268    
269  void a3dsrc_SetA3DPointerReg(a3dsrc_t *a, unsigned long ptr) {  void a3dsrc_SetA3DPointerReg(a3dsrc_t *a, unsigned long ptr) {
270          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
271          hwwrite(vortex->mmio, A3D_SLICE_Pointers + (a->slice << 0xd), ptr);          hwwrite(vortex->mmio, A3D_SLICE_Pointers + (a->slice << 0xd), ptr);
272  }  }
273    
274  void a3dsrc_GetA3DPointerReg(a3dsrc_t *a, unsigned long *ptr) {  void a3dsrc_GetA3DPointerReg(a3dsrc_t *a, unsigned long *ptr) {
275          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
276          *ptr = hwread(vortex->mmio, A3D_SLICE_Pointers + (a->slice << 0xd));          *ptr = hwread(vortex->mmio, A3D_SLICE_Pointers + (a->slice << 0xd));
277  }  }
278    
279  void a3dsrc_ZeroSliceIO(a3dsrc_t *a) {  void a3dsrc_ZeroSliceIO(a3dsrc_t *a) {
280          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
281          int i;          int i;
282                    
283          for (i=0; i<8; i++)          for (i=0; i<8; i++)
# Line 292  void a3dsrc_ZeroSliceIO(a3dsrc_t *a) { Line 289  void a3dsrc_ZeroSliceIO(a3dsrc_t *a) {
289  /* Reset Single A3D source. */  /* Reset Single A3D source. */
290  void a3dsrc_ZeroState(a3dsrc_t *a) {  void a3dsrc_ZeroState(a3dsrc_t *a) {
291                    
292            //printk("vortex: ZeroState slice: %d, source %d\n", a->slice, a->source);
293            
294          a3dsrc_SetAtmosState(a, 0,0,0,0);          a3dsrc_SetAtmosState(a, 0,0,0,0);
295          a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros);          a3dsrc_SetHrtfState(a, A3dHrirZeros, A3dHrirZeros);
296          a3dsrc_SetItdDline(a, A3dItdDlineZeros);          a3dsrc_SetItdDline(a, A3dItdDlineZeros); //crash
297          a3dsrc_SetHrtfOutput(a, 0, 0);          a3dsrc_SetHrtfOutput(a, 0,0);
298          a3dsrc_SetTimeConsts(a, 0,0,0,0);          a3dsrc_SetTimeConsts(a, 0,0,0,0);
299            
300          a3dsrc_SetAtmosCurrent(a, 0,0,0,0,0);          a3dsrc_SetAtmosCurrent(a, 0,0,0,0,0);
301          a3dsrc_SetAtmosTarget(a, 0,0,0,0,0);          a3dsrc_SetAtmosTarget(a, 0,0,0,0,0);
302          a3dsrc_SetItdCurrent(a, 0,0);          a3dsrc_SetItdCurrent(a, 0,0);
303          a3dsrc_SetItdTarget(a, 0,0);          a3dsrc_SetItdTarget(a, 0,0);
304          a3dsrc_SetGainCurrent(a, 0,0);          a3dsrc_SetGainCurrent(a, 0,0);
305          /* The person who originally wrote this surely was smoking crack ...*/          a3dsrc_SetGainTarget(a, 0,0);
         /* (or his/her compiler) */  
         //CA3dIO_WriteReg(a->vortex, A3D_B_GainTarget + (a->slice << 0xd) + (a->source *5*9*2 - a->source)*8,0,0);  
         CA3dIO_WriteReg(a, a3d_addr(a->slice, a->source, A3D_B_GainTarget),0,0);  
306                    
307          a3dsrc_SetHrtfCurrent(a, A3dHrirZeros, A3dHrirZeros);          a3dsrc_SetHrtfCurrent(a, A3dHrirZeros, A3dHrirZeros);
308          a3dsrc_SetHrtfTarget(a, A3dHrirZeros, A3dHrirZeros);          a3dsrc_SetHrtfTarget(a, A3dHrirZeros, A3dHrirZeros);
# Line 313  void a3dsrc_ZeroState(a3dsrc_t *a) { Line 310  void a3dsrc_ZeroState(a3dsrc_t *a) {
310    
311  /* Reset entire A3D engine */  /* Reset entire A3D engine */
312  void a3dsrc_ZeroStateA3D(a3dsrc_t *a) {  void a3dsrc_ZeroStateA3D(a3dsrc_t *a) {
313          int i, ii, var, var2;          int i, var, var2;
314            
315            if ((a->vortex) == NULL) {
316                    printk("vortex: ZeroStateA3D: ERROR: a->vortex is NULL\n");
317                    return;
318            }
319                    
320          a3dsrc_SetA3DControlReg(a, 0);          a3dsrc_SetA3DControlReg(a, 0);
321          a3dsrc_SetA3DPointerReg(a, 0);          a3dsrc_SetA3DPointerReg(a, 0);
322            
323          var = a->slice;          var = a->slice;
324          var2 = a->source;          var2 = a->source;
325          for (i=0; i<4; i++) {          for (i=0; i<4; i++) {
326                  a->slice = i;                  a->slice = i;
327                  a3dsrc_ZeroSliceIO(a);                  a3dsrc_ZeroSliceIO(a);
328                  for (ii=0; ii<4; ii++) {                  //a3dsrc_ZeroState(a);
                         a->source = ii;  
                         a3dsrc_ZeroState(a);  
                 }  
329          }          }
330          a->source = var2;          a->source = var2;
331          a->slice = var;          a->slice = var;
# Line 345  void a3dsrc_ProgramPipe(a3dsrc_t *a) { Line 345  void a3dsrc_ProgramPipe(a3dsrc_t *a) {
345  }  }
346  /* VDB = Vortex audio Dataflow Bus */  /* VDB = Vortex audio Dataflow Bus */
347  void a3dsrc_ClearVDBData(a3dsrc_t *a, unsigned long aa) {  void a3dsrc_ClearVDBData(a3dsrc_t *a, unsigned long aa) {
348          vortex_t *vortex = (vortex_t*)a->vortex;          vortex_t *vortex = (vortex_t*)(a->vortex);
349          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_SLICE_VDBDest), 0);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_SLICE_VDBDest), 0);
350          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_SLICE_VDBDest + 4), 0);          hwwrite(vortex->mmio, a3d_addr(a->slice, a->source, A3D_SLICE_VDBDest + 4), 0);
351          /*          /*
# Line 479  int Vort3DRend_Initialize(vortex_t *v, u Line 479  int Vort3DRend_Initialize(vortex_t *v, u
479          v->xt_mode = mode; /* this_14 */          v->xt_mode = mode; /* this_14 */
480                    
481          //vortex_XtalkHw_CXtalkHw(v, this04);          //vortex_XtalkHw_CXtalkHw(v, this04);
   
482          vortex_XtalkHw_SetGains(v, asXtalkGainsAllChan);          vortex_XtalkHw_SetGains(v, asXtalkGainsAllChan);
483          if (v->xt_mode) {          if (v->xt_mode) {
484                  //if (this08==0xffff) {                  //if (this08==0xffff) {
# Line 488  int Vort3DRend_Initialize(vortex_t *v, u Line 487  int Vort3DRend_Initialize(vortex_t *v, u
487                          vortex_XtalkHw_ProgramXtalkNarrow(v);                          vortex_XtalkHw_ProgramXtalkNarrow(v);
488                  } else{                  } else{
489                          /* Speaker type 2 ? */                          /* Speaker type 2 ? */
490                          vortex_XtalkHw_ProgramXtalkWide(v)                          vortex_XtalkHw_ProgramXtalkWide(v);
491                  }                  }
492          } else {          } else {
493                  /* Headphones ? */                  /* Headphones ? */
# Line 496  int Vort3DRend_Initialize(vortex_t *v, u Line 495  int Vort3DRend_Initialize(vortex_t *v, u
495          }          }
496          vortex_XtalkHw_SetSampleRate(v, 0x11);          vortex_XtalkHw_SetSampleRate(v, 0x11);
497          vortex_XtalkHw_Enable(v);          vortex_XtalkHw_Enable(v);
498            return 0;
499  }  }
500    
501  int Vort3DRend_SetGlobalControl(vortex_t *v) {  int Vort3DRend_SetGlobalControl(vortex_t *v) {
# Line 514  int Vort3DRend_SetGlobalControl(vortex_t Line 514  int Vort3DRend_SetGlobalControl(vortex_t
514                          vortex_XtalkHw_ProgramXtalkNarrow(v);                          vortex_XtalkHw_ProgramXtalkNarrow(v);
515                  } else {                  } else {
516                          /* Speaker type 2 */                          /* Speaker type 2 */
517                          vortex_XtalkHw_ProgramXtalkWide(v)                          vortex_XtalkHw_ProgramXtalkWide(v);
518                  }                  }
519          } else {          } else {
520                  /* Headphones */                  /* Headphones */
521                  vortex_XtalkHw_ProgramPipe(v);                  vortex_XtalkHw_ProgramPipe(v);
522          }          }
523            return 0;
524  }  }
525    
526  int Vort3DRend_GetGlobalControl(struct _XTALKctrl *xtctrl) {  int Vort3DRend_GetGlobalControl(vortex_t *v) {
527            return 0;
528  }  }
529  #if 0  #if 0
530  int Vort3DRend_AddBuffer(class CVort3dWave *a) {  int Vort3DRend_AddBuffer(class CVort3dWave *a) {
# Line 693  void AuWt_WriteReg(unsigned long addr, u Line 694  void AuWt_WriteReg(unsigned long addr, u
694  int  AuWt_ReadReg(unsigned long addr) {  int  AuWt_ReadReg(unsigned long addr) {
695          return hwread(vortex->mmio, (this_04 << 0xf) + addr);          return hwread(vortex->mmio, (this_04 << 0xf) + addr);
696  }  }
697    
698    int  Asp4Topology::IncrementA3DRefCount(unsigned long *arg_0) {
699            int var_0, var_4, var_8, var_C, edi, ebx;
700            /* this_10: A3DRef count */
701            
702            //CAsp4Core: this_78
703            CAsp4Core::GetProperty(COREPROPERTY3,(void *)&var4,ulong 4);
704            if (var_4 == 1 || var_4 == 2)
705                    edi = 1;
706            else
707                    edi = 0;
708            
709            Asp4Topology::ConfigureWT(0,edi,0)
710            Asp4Topology::ConfigureWT(1, (var_4>>1)&1 ,1)
711            
712            if (this_10) {
713                    if (arg_0 == NULL)
714                            return 1;
715                    this_10++;
716                    *arg_0 = this_10;
717                    return 1;
718            }
719            /* RefCount is zero */
720            CResource::SetDsMode((DSMODE)2);
721            /* Connect A3D -> XTALK */
722            for (ebx=0; ebx<4; ebx++) {
723                    vortex_route(1, 0x11, ADB_A3DOUT(ebx*2), ADB_XTALKIN(ebx);
724                    vortex_route(1, 0x11, ADB_A3DOUT(ebx*2)+1, ADB_XTALKIN(8-(ebx*2)));
725            }
726            vortex_route(1, 0x11, ADB_XTALKOUT(0), vortex->mixxtlk[0]);
727            vortex_route(1, 0x11, ADB_XTALKOUT(1), vortex->mixxtlk[1]);
728            vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[0],     vortex->mixplayb[0], 0);
729            vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[1],     vortex->mixplayb[1], 0);
730            vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[0], vortex->mixxtlk[0], MIX_DEFIGAIN);
731            vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[1], vortex->mixxtlk[1], MIX_DEFIGAIN);
732            if (VORTEX_IS_QUAD {
733                    vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[0],     vortex->mixplayb[2], 0);
734                    vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[1],     vortex->mixplayb[3], 0);
735                    vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[2], vortex->mixxtlk[0], MIX_DEFIGAIN);
736                    vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[3], vortex->mixxtlk[1], MIX_DEFIGAIN);  
737            }
738            /* Connect SPDIF: not needed to due different topology. */
739            
740            /* Increment ref count. */
741            this_10++;
742            if (arg_0 == NULL)
743                    return 1;
744            *arg_0 = this_10;
745            return 1;
746    }
747  #endif  #endif
748  /* 3D Sound renderer. creeepy... */  /* 3D Sound renderer. creeepy... */
749    
750    
751  /* A3D base support (de)allocator */  /* A3D base support init/shudown */
752  void vortex_Vort3D(vortex_t *v, int en) {  void vortex_Vort3D(vortex_t *v, int en) {
753          int i;          int i;
754                    
         /* Alloc mixer resources */  
         v->mixa3d[0] = vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXOUT);  
         v->mixa3d[1] = vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXOUT);  
         v->mixxtlk[0] = vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);  
         v->mixxtlk[1] = vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);  
           
         /* Connect Crosstalk canceler to audio outputs. */  
 #if 1  
         vortex_route(v, en, 0x11, v->mixa3d[0], ADB_XTALKIN(0));  
         vortex_route(v, en, 0x11, v->mixa3d[1], ADB_XTALKIN(1));  
         vortex_route(v, en, 0x11, ADB_XTALKOUT(0), v->mixxtlk[0]);  
         vortex_route(v, en, 0x11, ADB_XTALKOUT(1), v->mixxtlk[1]);  
           
         vortex_connection_mixin_mix(v, en, v->mixxtlk[0], v->mixplayb[0], 0);  
         vortex_connection_mixin_mix(v, en, v->mixxtlk[1], v->mixplayb[1], 0);  
         if (VORTEX_IS_QUAD(v)) {  
                 vortex_connection_mixin_mix(v, en, v->mixxtlk[0], v->mixplayb[2], 0);  
                 vortex_connection_mixin_mix(v, en, v->mixxtlk[1], v->mixplayb[3], 0);            
         }  
 #ifndef CHIP_AU8820  
         vortex_connection_mixin_mix(v, en, v->mixxtlk[0], v->mixspdif[0], 0);  
         vortex_connection_mixin_mix(v, en, v->mixxtlk[1], v->mixspdif[1], 0);  
 #endif  
 #endif  
         /*  
755          Vort3DRend_Initialize(v, 0);          Vort3DRend_Initialize(v, 0);
756          for (i=0; i<NR_A3D; i++)          for (i=0; i<NR_A3D; i++)
757                  vortex_A3dSourceHw_Initialize(v, i % 4, i / 4);                  vortex_A3dSourceHw_Initialize(v, i % 4, i >> 2);        
758          a3dsrc_ZeroStateA3D(&(v->a3d[0]));          a3dsrc_ZeroStateA3D(&(v->a3d[0]));
         */  
759  }  }
760    /* Make A3D subsystem connections. */
761    void vortex_Vort3D_connect(vortex_t *v, int en) {
762            
763            /* Allow Xtalk mixin resources */
764            v->mixxtlk[0] = vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
765            if (v->mixxtlk[0]<0) {
766                    printk("vortex: vortex_Vort3D: ERROR: not enough free mixer resources.\n");
767                    return;        
768            }
769            v->mixxtlk[1] = vortex_adb_checkinout(v, v->fixed_res, en, VORTEX_RESOURCE_MIXIN);
770            if (v->mixxtlk[1]<0) {
771                    printk("vortex: vortex_Vort3D: ERROR: not enough free mixer resources.\n");
772                    return;        
773            }
774            
775            /* Connect A3D -> XTALK */
776            for (i=0; i<4; i++) {
777                    /* 2 outputs per each A3D slice. */
778                    vortex_route(en, 0x11, ADB_A3DOUT(ebx*2), ADB_XTALKIN(ebx);
779                    vortex_route(en, 0x11, ADB_A3DOUT(ebx*2)+1, ADB_XTALKIN(5+ebx));
780            }
781            vortex_route(en, 0x11, ADB_XTALKOUT(0), vortex->mixxtlk[0]);
782            vortex_route(en, 0x11, ADB_XTALKOUT(1), vortex->mixxtlk[1]);
783            vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[0],     vortex->mixplayb[0], 0);
784            vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[1],     vortex->mixplayb[1], 0);
785            vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[0], vortex->mixxtlk[0], MIX_DEFIGAIN);
786            vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[1], vortex->mixxtlk[1], MIX_DEFIGAIN);
787            if (VORTEX_IS_QUAD {
788                    vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[0],     vortex->mixplayb[2], 0);
789                    vortex_connection_mixin_mix(vortex, en, vortex->mixxtlk[1],     vortex->mixplayb[3], 0);
790                    vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[2], vortex->mixxtlk[0], MIX_DEFIGAIN);
791                    vortex_mix_setinputvolumebyte(vortex, vortex->mixplayb[3], vortex->mixxtlk[1], MIX_DEFIGAIN);  
792            }
793    }
794  /* Initialize one single A3D source. */  /* Initialize one single A3D source. */
795  void vortex_Vort3D_InitializeSource(a3dsrc_t *a, int en) {  void vortex_Vort3D_InitializeSource(a3dsrc_t *a, int en) {
796            if (a->vortex == NULL) {
797                    printk("vortex: Vort3D_InitializeSource: A3D source not initialized\n");
798                    return;
799            }
800            
801          if (en) {          if (en) {
802                  a3dsrc_ZeroState(a);                  a3dsrc_ProgramPipe(a);
803                    a3dsrc_SetA3DSampleRate(a, 0x11);
804                  a3dsrc_SetTimeConsts(a, HrtfTCDefault, ItdTCDefault, GainTCDefault ,CoefTCDefault);                  a3dsrc_SetTimeConsts(a, HrtfTCDefault, ItdTCDefault, GainTCDefault ,CoefTCDefault);
805                  a3dsrc_SetGainTarget(a,0,0);                  a3dsrc_SetGainTarget(a,0,0);
806                  a3dsrc_SetGainCurrent(a,0,0);                  a3dsrc_SetGainCurrent(a,0,0);
807                  a3dsrc_EnableA3D(a);                  a3dsrc_EnableA3D(a);
808                  /* Set as pipe for now for testing. */          } else {
                 a3dsrc_ProgramPipe(a);  
         } else  
809                  a3dsrc_DisableA3D(a);                  a3dsrc_DisableA3D(a);
810                    a3dsrc_ZeroState(a);
811            }
812  }  }
813    
814  /*  /*
# Line 778  void vortex_Vort3D_setparms(a3dsrc_t *a, Line 842  void vortex_Vort3D_setparms(a3dsrc_t *a,
842          a3dsrc_SetItdTarget(a, p->itd_current[0], p->itd_current[1]);          a3dsrc_SetItdTarget(a, p->itd_current[0], p->itd_current[1]);
843          a3dsrc_SetItdDline(a, p->dline);          a3dsrc_SetItdDline(a, p->dline);
844  }  }
845    
846    /* End of File*/

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.5

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26