Copy the null terminator from the string instead of appending it
[openal-soft.git] / Alc / panning.c
blobd0c890714a45b7585b9172b717b6358df167d4d2
1 /**
2 * OpenAL cross platform audio library
3 * Copyright (C) 1999-2010 by authors.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details.
14 * You should have received a copy of the GNU Library General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 * Or go to http://www.gnu.org/copyleft/lgpl.html
21 #include "config.h"
23 #include <math.h>
24 #include <stdlib.h>
25 #include <string.h>
26 #include <ctype.h>
27 #include <assert.h>
29 #include "alMain.h"
30 #include "AL/al.h"
31 #include "AL/alc.h"
32 #include "alu.h"
34 extern inline void SetGains(const ALCdevice *device, ALfloat ingain, ALfloat gains[MaxChannels]);
37 static inline void Set0thOrder(ALfloat coeffs[16], ALfloat w)
39 coeffs[0] = w;
42 static inline void Set1stOrder(ALfloat coeffs[16], ALfloat w, ALfloat x, ALfloat y, ALfloat z)
44 coeffs[0] = w;
45 coeffs[1] = x;
46 coeffs[2] = y;
47 coeffs[3] = z;
50 static inline void Set2ndOrder(ALfloat coeffs[16], ALfloat w, ALfloat x, ALfloat y, ALfloat z, ALfloat r, ALfloat s, ALfloat t, ALfloat u, ALfloat v)
52 coeffs[0] = w;
53 coeffs[1] = x;
54 coeffs[2] = y;
55 coeffs[3] = z;
56 coeffs[4] = r;
57 coeffs[5] = s;
58 coeffs[6] = t;
59 coeffs[7] = u;
60 coeffs[8] = v;
63 static inline void Set3rdOrder(ALfloat coeffs[16], ALfloat w, ALfloat x, ALfloat y, ALfloat z, ALfloat r, ALfloat s, ALfloat t, ALfloat u, ALfloat v, ALfloat k, ALfloat l, ALfloat m, ALfloat n, ALfloat o, ALfloat p, ALfloat q)
65 coeffs[0] = w;
66 coeffs[1] = x;
67 coeffs[2] = y;
68 coeffs[3] = z;
69 coeffs[4] = r;
70 coeffs[5] = s;
71 coeffs[6] = t;
72 coeffs[7] = u;
73 coeffs[8] = v;
74 coeffs[9] = k;
75 coeffs[10] = l;
76 coeffs[11] = m;
77 coeffs[12] = n;
78 coeffs[13] = o;
79 coeffs[14] = p;
80 coeffs[15] = q;
84 void ComputeAngleGains(const ALCdevice *device, ALfloat angle, ALfloat hwidth, ALfloat ingain, ALfloat gains[MaxChannels])
86 ALfloat tmpgains[MaxChannels] = { 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f };
87 enum Channel Speaker2Chan[MaxChannels];
88 ALfloat SpeakerAngle[MaxChannels];
89 ALfloat langle, rangle;
90 ALfloat a;
91 ALuint i;
93 for(i = 0;i < device->NumSpeakers;i++)
94 Speaker2Chan[i] = device->Speaker[i].ChanName;
95 for(i = 0;i < device->NumSpeakers;i++)
96 SpeakerAngle[i] = device->Speaker[i].Angle;
98 for(i = 0;i < MaxChannels;i++)
99 gains[i] = 0.0f;
101 /* Some easy special-cases first... */
102 if(device->NumSpeakers <= 1 || hwidth >= F_PI)
104 /* Full coverage for all speakers. */
105 for(i = 0;i < device->NumSpeakers;i++)
107 enum Channel chan = Speaker2Chan[i];
108 gains[chan] = ingain;
110 return;
112 if(hwidth <= 0.0f)
114 /* Infinitely small sound point. */
115 for(i = 0;i < device->NumSpeakers-1;i++)
117 if(angle >= SpeakerAngle[i] && angle < SpeakerAngle[i+1])
119 /* Sound is between speakers i and i+1 */
120 a = (angle-SpeakerAngle[i]) /
121 (SpeakerAngle[i+1]-SpeakerAngle[i]);
122 gains[Speaker2Chan[i]] = sqrtf(1.0f-a) * ingain;
123 gains[Speaker2Chan[i+1]] = sqrtf( a) * ingain;
124 return;
127 /* Sound is between last and first speakers */
128 if(angle < SpeakerAngle[0])
129 angle += F_2PI;
130 a = (angle-SpeakerAngle[i]) /
131 (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]);
132 gains[Speaker2Chan[i]] = sqrtf(1.0f-a) * ingain;
133 gains[Speaker2Chan[0]] = sqrtf( a) * ingain;
134 return;
137 if(fabsf(angle)+hwidth > F_PI)
139 /* The coverage area would go outside of -pi...+pi. Instead, rotate the
140 * speaker angles so it would be as if angle=0, and keep them wrapped
141 * within -pi...+pi. */
142 if(angle > 0.0f)
144 ALuint done;
145 ALuint i = 0;
146 while(i < device->NumSpeakers && device->Speaker[i].Angle-angle < -F_PI)
147 i++;
148 for(done = 0;i < device->NumSpeakers;done++)
150 SpeakerAngle[done] = device->Speaker[i].Angle-angle;
151 Speaker2Chan[done] = device->Speaker[i].ChanName;
152 i++;
154 for(i = 0;done < device->NumSpeakers;i++)
156 SpeakerAngle[done] = device->Speaker[i].Angle-angle + F_2PI;
157 Speaker2Chan[done] = device->Speaker[i].ChanName;
158 done++;
161 else
163 /* NOTE: '< device->NumChan' on the iterators is correct here since
164 * we need to handle index 0. Because the iterators are unsigned,
165 * they'll underflow and wrap to become 0xFFFFFFFF, which will
166 * break as expected. */
167 ALuint done;
168 ALuint i = device->NumSpeakers-1;
169 while(i < device->NumSpeakers && device->Speaker[i].Angle-angle > F_PI)
170 i--;
171 for(done = device->NumSpeakers-1;i < device->NumSpeakers;done--)
173 SpeakerAngle[done] = device->Speaker[i].Angle-angle;
174 Speaker2Chan[done] = device->Speaker[i].ChanName;
175 i--;
177 for(i = device->NumSpeakers-1;done < device->NumSpeakers;i--)
179 SpeakerAngle[done] = device->Speaker[i].Angle-angle - F_2PI;
180 Speaker2Chan[done] = device->Speaker[i].ChanName;
181 done--;
184 angle = 0.0f;
186 langle = angle - hwidth;
187 rangle = angle + hwidth;
189 /* First speaker */
190 i = 0;
191 do {
192 ALuint last = device->NumSpeakers-1;
193 enum Channel chan = Speaker2Chan[i];
195 if(SpeakerAngle[i] >= langle && SpeakerAngle[i] <= rangle)
197 tmpgains[chan] = 1.0f;
198 continue;
201 if(SpeakerAngle[i] < langle && SpeakerAngle[i+1] > langle)
203 a = (langle-SpeakerAngle[i]) /
204 (SpeakerAngle[i+1]-SpeakerAngle[i]);
205 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
207 if(SpeakerAngle[i] > rangle)
209 a = (F_2PI + rangle-SpeakerAngle[last]) /
210 (F_2PI + SpeakerAngle[i]-SpeakerAngle[last]);
211 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
213 else if(SpeakerAngle[last] < rangle)
215 a = (rangle-SpeakerAngle[last]) /
216 (F_2PI + SpeakerAngle[i]-SpeakerAngle[last]);
217 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
219 } while(0);
221 for(i = 1;i < device->NumSpeakers-1;i++)
223 enum Channel chan = Speaker2Chan[i];
224 if(SpeakerAngle[i] >= langle && SpeakerAngle[i] <= rangle)
226 tmpgains[chan] = 1.0f;
227 continue;
230 if(SpeakerAngle[i] < langle && SpeakerAngle[i+1] > langle)
232 a = (langle-SpeakerAngle[i]) /
233 (SpeakerAngle[i+1]-SpeakerAngle[i]);
234 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
236 if(SpeakerAngle[i] > rangle && SpeakerAngle[i-1] < rangle)
238 a = (rangle-SpeakerAngle[i-1]) /
239 (SpeakerAngle[i]-SpeakerAngle[i-1]);
240 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
244 /* Last speaker */
245 i = device->NumSpeakers-1;
246 do {
247 enum Channel chan = Speaker2Chan[i];
248 if(SpeakerAngle[i] >= langle && SpeakerAngle[i] <= rangle)
250 tmpgains[Speaker2Chan[i]] = 1.0f;
251 continue;
253 if(SpeakerAngle[i] > rangle && SpeakerAngle[i-1] < rangle)
255 a = (rangle-SpeakerAngle[i-1]) /
256 (SpeakerAngle[i]-SpeakerAngle[i-1]);
257 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, a);
259 if(SpeakerAngle[i] < langle)
261 a = (langle-SpeakerAngle[i]) /
262 (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]);
263 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
265 else if(SpeakerAngle[0] > langle)
267 a = (F_2PI + langle-SpeakerAngle[i]) /
268 (F_2PI + SpeakerAngle[0]-SpeakerAngle[i]);
269 tmpgains[chan] = lerp(tmpgains[chan], 1.0f, 1.0f-a);
271 } while(0);
273 for(i = 0;i < device->NumSpeakers;i++)
275 enum Channel chan = device->Speaker[i].ChanName;
276 gains[chan] = sqrtf(tmpgains[chan]) * ingain;
280 void ComputeDirectionalGains(const ALCdevice *device, const ALfloat dir[3], ALfloat ingain, ALfloat gains[MaxChannels])
282 ALfloat coeffs[MAX_AMBI_COEFFS];
283 ALuint i, j;
285 /* Convert from OpenAL coords to Ambisonics. */
286 coeffs[0] = 0.7071f; /* sqrt(1.0 / 2.0) */
287 coeffs[1] = -dir[2]; /* X */
288 coeffs[2] = -dir[0]; /* Y */
289 coeffs[3] = dir[1]; /* Z */
290 coeffs[4] = 0.5f * (3.0f*dir[1]*dir[1] - 1.0f); /* 0.5 * (3*Z*Z - 1) */
291 coeffs[5] = 2.0f * dir[1] * -dir[2]; /* 2*Z*X */
292 coeffs[6] = 2.0f * -dir[0] * dir[1]; /* 2*Y*Z */
293 coeffs[7] = dir[2]*dir[2] - dir[0]*dir[0]; /* X*X - Y*Y */
294 coeffs[8] = 2.0f * -dir[2] * -dir[0]; /* 2*X*Y */
295 coeffs[9] = 0.5f * dir[1] * (5.0f*dir[1]*dir[1] - 3.0f); /* 0.5 * Z * (5*Z*Z - 3) */
296 coeffs[10] = 0.7262f * -dir[2] * (5.0f*dir[1]*dir[1] - 1.0f); /* sqrt(135.0 / 256.0) * X * (5*Z*Z - 1) */
297 coeffs[11] = 0.7262f * -dir[0] * (5.0f*dir[1]*dir[1] - 1.0f); /* sqrt(135.0 / 256.0) * Y * (5*Z*Z - 1) */
298 coeffs[12] = 2.5981f * dir[1] * (dir[2]*dir[2] - dir[0]*dir[0]); /* sqrt(27.0 / 4.0) * Z * (X*X - Y*Y) */
299 coeffs[13] = 5.1962f * -dir[2] * -dir[0] * dir[1]; /* sqrt(27) * X * Y * Z */
300 coeffs[14] = -dir[2] * (dir[2]*dir[2] - 3.0f*dir[0]*dir[0]); /* X * (X*X - 3*Y*Y) */
301 coeffs[15] = -dir[0] * (3.0f*dir[2]*dir[2] - dir[0]*dir[0]); /* Y * (3*X*X - Y*Y) */
303 for(i = 0;i < MaxChannels;i++)
304 gains[i] = 0.0f;
305 for(i = 0;i < device->NumSpeakers;i++)
307 enum Channel chan = device->Speaker[i].ChanName;
308 for(j = 0;j < MAX_AMBI_COEFFS;j++)
309 gains[chan] += device->Speaker[i].Coeff[j]*coeffs[j];
310 gains[chan] = maxf(gains[chan], 0.0f) * ingain;
315 ALvoid aluInitPanning(ALCdevice *device)
317 memset(device->Speaker, 0, sizeof(device->Speaker));
318 device->NumSpeakers = 0;
320 switch(device->FmtChans)
322 case DevFmtMono:
323 device->NumSpeakers = 1;
324 device->Speaker[0].ChanName = FrontCenter;
325 device->Speaker[0].Angle = DEG2RAD(0.0f);
326 Set0thOrder(device->Speaker[0].Coeff, 1.4142f);
327 break;
329 case DevFmtStereo:
330 device->NumSpeakers = 2;
331 device->Speaker[0].ChanName = FrontLeft;
332 device->Speaker[1].ChanName = FrontRight;
333 device->Speaker[0].Angle = DEG2RAD(-90.0f);
334 device->Speaker[1].Angle = DEG2RAD( 90.0f);
335 Set1stOrder(device->Speaker[0].Coeff, 0.7071f, -0.5f, 0.0f, 0.0f);
336 Set1stOrder(device->Speaker[1].Coeff, 0.7071f, 0.5f, 0.0f, 0.0f);
337 break;
339 case DevFmtQuad:
340 device->NumSpeakers = 4;
341 device->Speaker[0].ChanName = BackLeft;
342 device->Speaker[1].ChanName = FrontLeft;
343 device->Speaker[2].ChanName = FrontRight;
344 device->Speaker[3].ChanName = BackRight;
345 device->Speaker[0].Angle = DEG2RAD(-135.0f);
346 device->Speaker[1].Angle = DEG2RAD( -45.0f);
347 device->Speaker[2].Angle = DEG2RAD( 45.0f);
348 device->Speaker[3].Angle = DEG2RAD( 135.0f);
349 Set2ndOrder(device->Speaker[0].Coeff, 0.353543f, -0.306192f, 0.306181f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.117193f);
350 Set2ndOrder(device->Speaker[1].Coeff, 0.353558f, 0.306181f, 0.306192f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.117183f);
351 Set2ndOrder(device->Speaker[2].Coeff, 0.353543f, 0.306181f, -0.306192f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.117193f);
352 Set2ndOrder(device->Speaker[3].Coeff, 0.353558f, -0.306192f, -0.306181f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.117183f);
353 break;
355 case DevFmtX51:
356 device->NumSpeakers = 5;
357 device->Speaker[0].ChanName = BackLeft;
358 device->Speaker[1].ChanName = FrontLeft;
359 device->Speaker[2].ChanName = FrontCenter;
360 device->Speaker[3].ChanName = FrontRight;
361 device->Speaker[4].ChanName = BackRight;
362 device->Speaker[0].Angle = DEG2RAD(-110.0f);
363 device->Speaker[1].Angle = DEG2RAD( -30.0f);
364 device->Speaker[2].Angle = DEG2RAD( 0.0f);
365 device->Speaker[3].Angle = DEG2RAD( 30.0f);
366 device->Speaker[4].Angle = DEG2RAD( 110.0f);
367 Set3rdOrder(device->Speaker[0].Coeff, 0.470934f, -0.369630f, 0.349383f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031379f, -0.058143f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007116f, -0.043968f);
368 Set3rdOrder(device->Speaker[1].Coeff, 0.208954f, 0.212846f, 0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017738f, 0.204014f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051023f, 0.047490f);
369 Set3rdOrder(device->Speaker[2].Coeff, 0.109403f, 0.179490f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, -0.000001f);
370 Set3rdOrder(device->Speaker[3].Coeff, 0.208950f, 0.212842f, -0.238350f, 0.0f, 0.0f, 0.0f, 0.0f, -0.017740f, -0.204011f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.051022f, -0.047489f);
371 Set3rdOrder(device->Speaker[4].Coeff, 0.470936f, -0.369626f, -0.349386f, 0.0f, 0.0f, 0.0f, 0.0f, -0.031375f, 0.058144f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.007119f, 0.043968f);
372 break;
374 case DevFmtX51Side:
375 device->NumSpeakers = 5;
376 device->Speaker[0].ChanName = SideLeft;
377 device->Speaker[1].ChanName = FrontLeft;
378 device->Speaker[2].ChanName = FrontCenter;
379 device->Speaker[3].ChanName = FrontRight;
380 device->Speaker[4].ChanName = SideRight;
381 device->Speaker[0].Angle = DEG2RAD(-90.0f);
382 device->Speaker[1].Angle = DEG2RAD(-30.0f);
383 device->Speaker[2].Angle = DEG2RAD( 0.0f);
384 device->Speaker[3].Angle = DEG2RAD( 30.0f);
385 device->Speaker[4].Angle = DEG2RAD( 90.0f);
386 Set3rdOrder(device->Speaker[0].Coeff, 0.289151f, -0.081301f, 0.401292f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, -0.071420f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, -0.032897f);
387 Set3rdOrder(device->Speaker[1].Coeff, 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f);
388 Set3rdOrder(device->Speaker[2].Coeff, 0.109403f, 0.179490f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, -0.000001f);
389 Set3rdOrder(device->Speaker[3].Coeff, 0.167058f, 0.200580f, -0.172701f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029846f, -0.186405f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068904f);
390 Set3rdOrder(device->Speaker[4].Coeff, 0.289157f, -0.081298f, -0.401295f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, 0.071419f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, 0.032897f);
391 break;
393 case DevFmtX61:
394 device->NumSpeakers = 6;
395 device->Speaker[0].ChanName = SideLeft;
396 device->Speaker[1].ChanName = FrontLeft;
397 device->Speaker[2].ChanName = FrontCenter;
398 device->Speaker[3].ChanName = FrontRight;
399 device->Speaker[4].ChanName = SideRight;
400 device->Speaker[5].ChanName = BackCenter;
401 device->Speaker[0].Angle = DEG2RAD(-90.0f);
402 device->Speaker[1].Angle = DEG2RAD(-30.0f);
403 device->Speaker[2].Angle = DEG2RAD( 0.0f);
404 device->Speaker[3].Angle = DEG2RAD( 30.0f);
405 device->Speaker[4].Angle = DEG2RAD( 90.0f);
406 device->Speaker[5].Angle = DEG2RAD(180.0f);
407 Set3rdOrder(device->Speaker[0].Coeff, 0.289151f, -0.081301f, 0.401292f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, -0.071420f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, -0.032897f);
408 Set3rdOrder(device->Speaker[1].Coeff, 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f);
409 Set3rdOrder(device->Speaker[2].Coeff, 0.109403f, 0.179490f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, -0.000001f);
410 Set3rdOrder(device->Speaker[3].Coeff, 0.167058f, 0.200580f, -0.172701f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029846f, -0.186405f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068904f);
411 Set3rdOrder(device->Speaker[4].Coeff, 0.289157f, -0.081298f, -0.401295f, 0.0f, 0.0f, 0.0f, 0.0f, -0.188208f, 0.071419f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.010099f, 0.032897f);
412 Set3rdOrder(device->Speaker[5].Coeff, 0.353556f, -0.461940f, -0.000006f, 0.0f, 0.0f, 0.0f, 0.0f, 0.165723f, -0.000000f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.000000f, 0.000005f);
413 break;
415 case DevFmtX71:
416 device->NumSpeakers = 7;
417 device->Speaker[0].ChanName = BackLeft;
418 device->Speaker[1].ChanName = SideLeft;
419 device->Speaker[2].ChanName = FrontLeft;
420 device->Speaker[3].ChanName = FrontCenter;
421 device->Speaker[4].ChanName = FrontRight;
422 device->Speaker[5].ChanName = SideRight;
423 device->Speaker[6].ChanName = BackRight;
424 device->Speaker[0].Angle = DEG2RAD(-150.0f);
425 device->Speaker[1].Angle = DEG2RAD( -90.0f);
426 device->Speaker[2].Angle = DEG2RAD( -30.0f);
427 device->Speaker[3].Angle = DEG2RAD( 0.0f);
428 device->Speaker[4].Angle = DEG2RAD( 30.0f);
429 device->Speaker[5].Angle = DEG2RAD( 90.0f);
430 device->Speaker[6].Angle = DEG2RAD( 150.0f);
431 Set3rdOrder(device->Speaker[0].Coeff, 0.224752f, -0.295009f, 0.170325f, 0.0f, 0.0f, 0.0f, 0.0f, 0.105349f, -0.182473f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.000000f, 0.065799f);
432 Set3rdOrder(device->Speaker[1].Coeff, 0.224739f, 0.000002f, 0.340644f, 0.0f, 0.0f, 0.0f, 0.0f, -0.210697f, 0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.000000f, -0.065795f);
433 Set3rdOrder(device->Speaker[2].Coeff, 0.167065f, 0.200583f, 0.172695f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029855f, 0.186407f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, 0.068910f);
434 Set3rdOrder(device->Speaker[3].Coeff, 0.109403f, 0.179490f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.142031f, -0.000002f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.072024f, -0.000001f);
435 Set3rdOrder(device->Speaker[4].Coeff, 0.167058f, 0.200580f, -0.172701f, 0.0f, 0.0f, 0.0f, 0.0f, 0.029846f, -0.186405f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.039241f, -0.068904f);
436 Set3rdOrder(device->Speaker[5].Coeff, 0.224754f, 0.000004f, -0.340647f, 0.0f, 0.0f, 0.0f, 0.0f, -0.210697f, -0.000004f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.000000f, 0.065796f);
437 Set3rdOrder(device->Speaker[6].Coeff, 0.224739f, -0.295005f, -0.170331f, 0.0f, 0.0f, 0.0f, 0.0f, 0.105342f, 0.182470f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, -0.000000f, -0.065792f);
438 break;