OLD | NEW |
1 // Utilities for mixing rule testing. | 1 // Utilities for mixing rule testing. |
2 // http://webaudio.github.io/web-audio-api/#channel-up-mixing-and-down-mixing | 2 // http://webaudio.github.io/web-audio-api/#channel-up-mixing-and-down-mixing |
3 | 3 |
4 | 4 |
5 /** | 5 /** |
6 * Create an n-channel buffer, with all sample data zero except for a shifted | 6 * Create an n-channel buffer, with all sample data zero except for a shifted |
7 * impulse. The impulse position depends on the channel index. For example, for | 7 * impulse. The impulse position depends on the channel index. For example, for |
8 * a 4-channel buffer: | 8 * a 4-channel buffer: |
9 * channel 0: 1 0 0 0 0 0 0 0 | 9 * channel 0: 1 0 0 0 0 0 0 0 |
10 * channel 1: 0 1 0 0 0 0 0 0 | 10 * channel 1: 0 1 0 0 0 0 0 0 |
11 * channel 2: 0 0 1 0 0 0 0 0 | 11 * channel 2: 0 0 1 0 0 0 0 0 |
12 * channel 3: 0 0 0 1 0 0 0 0 | 12 * channel 3: 0 0 0 1 0 0 0 0 |
13 * @param {AudioContext} context Associated AudioContext. | 13 * @param {AudioContext} context Associated AudioContext. |
14 * @param {Number} numberOfChannels Number of channels of test buffer. | 14 * @param {Number} numberOfChannels Number of channels of test buffer. |
15 * @param {Number} frameLength Buffer length in frames. | 15 * @param {Number} frameLength Buffer length in frames. |
16 * @return {AudioBuffer} | 16 * @return {AudioBuffer} |
17 */ | 17 */ |
18 function createShiftedImpulseBuffer(context, numberOfChannels, frameLength) { | 18 function createShiftedImpulseBuffer(context, numberOfChannels, frameLength) { |
19 var shiftedImpulseBuffer = context.createBuffer(numberOfChannels, frameLengt
h, context.sampleRate); | 19 let shiftedImpulseBuffer = |
20 for (var channel = 0; channel < numberOfChannels; ++channel) { | 20 context.createBuffer(numberOfChannels, frameLength, context.sampleRate); |
21 var data = shiftedImpulseBuffer.getChannelData(channel); | 21 for (let channel = 0; channel < numberOfChannels; ++channel) { |
22 data[channel] = 1; | 22 let data = shiftedImpulseBuffer.getChannelData(channel); |
23 } | 23 data[channel] = 1; |
| 24 } |
24 | 25 |
25 return shiftedImpulseBuffer; | 26 return shiftedImpulseBuffer; |
26 } | 27 } |
27 | 28 |
28 /** | 29 /** |
29 * Create a string that displays the content of AudioBuffer. | 30 * Create a string that displays the content of AudioBuffer. |
30 * @param {AudioBuffer} audioBuffer AudioBuffer object to stringify. | 31 * @param {AudioBuffer} audioBuffer AudioBuffer object to stringify. |
31 * @param {Number} frameLength Number of frames to be printed. | 32 * @param {Number} frameLength Number of frames to be printed. |
32 * @param {Number} frameOffset Starting frame position for printing. | 33 * @param {Number} frameOffset Starting frame position for printing. |
33 * @return {String} | 34 * @return {String} |
34 */ | 35 */ |
35 function stringifyBuffer(audioBuffer, frameLength, frameOffset) { | 36 function stringifyBuffer(audioBuffer, frameLength, frameOffset) { |
36 frameOffset = (frameOffset || 0); | 37 frameOffset = (frameOffset || 0); |
37 | 38 |
38 var stringifiedBuffer = ''; | 39 let stringifiedBuffer = ''; |
39 for (var channel = 0; channel < audioBuffer.numberOfChannels; ++channel) { | 40 for (let channel = 0; channel < audioBuffer.numberOfChannels; ++channel) { |
40 var channelData = audioBuffer.getChannelData(channel); | 41 let channelData = audioBuffer.getChannelData(channel); |
41 for (var i = 0; i < frameLength; ++i) | 42 for (let i = 0; i < frameLength; ++i) |
42 stringifiedBuffer += channelData[i + frameOffset] + ' '; | 43 stringifiedBuffer += channelData[i + frameOffset] + ' '; |
43 stringifiedBuffer += '\n'; | 44 stringifiedBuffer += '\n'; |
44 } | 45 } |
45 | 46 |
46 return stringifiedBuffer; | 47 return stringifiedBuffer; |
47 } | 48 } |
48 | 49 |
49 /** | 50 /** |
50 * Compute number of channels from the connection. | 51 * Compute number of channels from the connection. |
51 * http://webaudio.github.io/web-audio-api/#dfn-computednumberofchannels | 52 * http://webaudio.github.io/web-audio-api/#dfn-computednumberofchannels |
52 * @param {String} connections A string specifies the connection. For | 53 * @param {String} connections A string specifies the connection. For |
53 * example, the string "128" means 3 | 54 * example, the string "128" means 3 |
54 * connections, having 1, 2, and 8 channels | 55 * connections, having 1, 2, and 8 channels |
55 * respectively. | 56 * respectively. |
56 * @param {Number} channelCount Channel count. | 57 * @param {Number} channelCount Channel count. |
57 * @param {String} channelCountMode Channel count mode. | 58 * @param {String} channelCountMode Channel count mode. |
58 * @return {Number} Computed number of channels. | 59 * @return {Number} Computed number of channels. |
59 */ | 60 */ |
60 function computeNumberOfChannels(connections, channelCount, channelCountMode) { | 61 function computeNumberOfChannels(connections, channelCount, channelCountMode) { |
61 if (channelCountMode == "explicit") | 62 if (channelCountMode == 'explicit') |
62 return channelCount; | 63 return channelCount; |
63 | 64 |
64 // Must have at least one channel. | 65 // Must have at least one channel. |
65 var computedNumberOfChannels = 1; | 66 let computedNumberOfChannels = 1; |
66 | 67 |
67 // Compute "computedNumberOfChannels" based on all the connections. | 68 // Compute "computedNumberOfChannels" based on all the connections. |
68 for (var i = 0; i < connections.length; ++i) { | 69 for (let i = 0; i < connections.length; ++i) { |
69 var connectionNumberOfChannels = parseInt(connections[i]); | 70 let connectionNumberOfChannels = parseInt(connections[i]); |
70 computedNumberOfChannels = Math.max(computedNumberOfChannels, connectionNumb
erOfChannels); | 71 computedNumberOfChannels = |
| 72 Math.max(computedNumberOfChannels, connectionNumberOfChannels); |
71 } | 73 } |
72 | 74 |
73 if (channelCountMode == "clamped-max") | 75 if (channelCountMode == 'clamped-max') |
74 computedNumberOfChannels = Math.min(computedNumberOfChannels, channelCount); | 76 computedNumberOfChannels = Math.min(computedNumberOfChannels, channelCount); |
75 | 77 |
76 return computedNumberOfChannels; | 78 return computedNumberOfChannels; |
77 } | 79 } |
78 | 80 |
79 /** | 81 /** |
80 * Apply up/down-mixing (in-place summing) based on 'speaker' interpretation. | 82 * Apply up/down-mixing (in-place summing) based on 'speaker' interpretation. |
81 * @param {AudioBuffer} input Input audio buffer. | 83 * @param {AudioBuffer} input Input audio buffer. |
82 * @param {AudioBuffer} output Output audio buffer. | 84 * @param {AudioBuffer} output Output audio buffer. |
83 */ | 85 */ |
84 function speakersSum(input, output) { | 86 function speakersSum(input, output) { |
85 if (input.length != output.length) { | 87 if (input.length != output.length) { |
86 throw '[mixing-rules.js] speakerSum(): buffer lengths mismatch (input: ' | 88 throw '[mixing-rules.js] speakerSum(): buffer lengths mismatch (input: ' + |
87 + input.length + ', output: ' + output.length + ')'; | 89 input.length + ', output: ' + output.length + ')'; |
88 } | 90 } |
89 | 91 |
90 if (input.numberOfChannels === output.numberOfChannels) { | 92 if (input.numberOfChannels === output.numberOfChannels) { |
91 for (var channel = 0; channel < output.numberOfChannels; ++channel) { | 93 for (let channel = 0; channel < output.numberOfChannels; ++channel) { |
92 var inputChannel = input.getChannelData(channel); | 94 let inputChannel = input.getChannelData(channel); |
93 var outputChannel = output.getChannelData(channel); | 95 let outputChannel = output.getChannelData(channel); |
94 for (var i = 0; i < outputChannel.length; i++) | 96 for (let i = 0; i < outputChannel.length; i++) |
95 outputChannel[i] += inputChannel[i]; | 97 outputChannel[i] += inputChannel[i]; |
96 } | 98 } |
97 } else if (input.numberOfChannels < output.numberOfChannels) { | 99 } else if (input.numberOfChannels < output.numberOfChannels) { |
98 processUpMix(input, output); | 100 processUpMix(input, output); |
99 } else { | 101 } else { |
100 processDownMix(input, output); | 102 processDownMix(input, output); |
101 } | 103 } |
102 } | 104 } |
103 | 105 |
104 /** | 106 /** |
105 * In-place summing to |output| based on 'discrete' channel interpretation. | 107 * In-place summing to |output| based on 'discrete' channel interpretation. |
106 * @param {AudioBuffer} input Input audio buffer. | 108 * @param {AudioBuffer} input Input audio buffer. |
107 * @param {AudioBuffer} output Output audio buffer. | 109 * @param {AudioBuffer} output Output audio buffer. |
108 */ | 110 */ |
109 function discreteSum(input, output) { | 111 function discreteSum(input, output) { |
110 if (input.length != output.length) { | 112 if (input.length != output.length) { |
111 throw '[mixing-rules.js] speakerSum(): buffer lengths mismatch (input: ' | 113 throw '[mixing-rules.js] speakerSum(): buffer lengths mismatch (input: ' + |
112 + input.length + ', output: ' + output.length + ')'; | 114 input.length + ', output: ' + output.length + ')'; |
113 } | 115 } |
114 | 116 |
115 var numberOfChannels = Math.min(input.numberOfChannels, output.numberOfChannel
s) | 117 let numberOfChannels = |
| 118 Math.min(input.numberOfChannels, output.numberOfChannels) |
116 | 119 |
117 for (var channel = 0; channel < numberOfChannels; ++channel) { | 120 for (let channel = 0; channel < numberOfChannels; ++channel) { |
118 var inputChannel = input.getChannelData(channel); | 121 let inputChannel = input.getChannelData(channel); |
119 var outputChannel = output.getChannelData(channel); | 122 let outputChannel = output.getChannelData(channel); |
120 for (var i = 0; i < outputChannel.length; i++) | 123 for (let i = 0; i < outputChannel.length; i++) |
121 outputChannel[i] += inputChannel[i]; | 124 outputChannel[i] += inputChannel[i]; |
122 } | 125 } |
123 } | 126 } |
124 | 127 |
125 /** | 128 /** |
126 * Perform up-mix by in-place summing to |output| buffer. | 129 * Perform up-mix by in-place summing to |output| buffer. |
127 * @param {AudioBuffer} input Input audio buffer. | 130 * @param {AudioBuffer} input Input audio buffer. |
128 * @param {AudioBuffer} output Output audio buffer. | 131 * @param {AudioBuffer} output Output audio buffer. |
129 */ | 132 */ |
130 function processUpMix(input, output) { | 133 function processUpMix(input, output) { |
131 var numberOfInputChannels = input.numberOfChannels; | 134 let numberOfInputChannels = input.numberOfChannels; |
132 var numberOfOutputChannels = output.numberOfChannels; | 135 let numberOfOutputChannels = output.numberOfChannels; |
133 var i, length = output.length; | 136 let i, length = output.length; |
134 | 137 |
135 // Up-mixing: 1 -> 2, 1 -> 4 | 138 // Up-mixing: 1 -> 2, 1 -> 4 |
136 // output.L += input | 139 // output.L += input |
137 // output.R += input | 140 // output.R += input |
138 // output.SL += 0 (in the case of 1 -> 4) | 141 // output.SL += 0 (in the case of 1 -> 4) |
139 // output.SR += 0 (in the case of 1 -> 4) | 142 // output.SR += 0 (in the case of 1 -> 4) |
140 if ((numberOfInputChannels === 1 && numberOfOutputChannels === 2) || | 143 if ((numberOfInputChannels === 1 && numberOfOutputChannels === 2) || |
141 (numberOfInputChannels === 1 && numberOfOutputChannels === 4)) { | 144 (numberOfInputChannels === 1 && numberOfOutputChannels === 4)) { |
142 var inputChannel = input.getChannelData(0); | 145 let inputChannel = input.getChannelData(0); |
143 var outputChannel0 = output.getChannelData(0); | 146 let outputChannel0 = output.getChannelData(0); |
144 var outputChannel1 = output.getChannelData(1); | 147 let outputChannel1 = output.getChannelData(1); |
145 for (i = 0; i < length; i++) { | 148 for (i = 0; i < length; i++) { |
146 outputChannel0[i] += inputChannel[i]; | 149 outputChannel0[i] += inputChannel[i]; |
147 outputChannel1[i] += inputChannel[i]; | 150 outputChannel1[i] += inputChannel[i]; |
148 } | 151 } |
149 | 152 |
150 return; | 153 return; |
151 } | 154 } |
152 | 155 |
153 // Up-mixing: 1 -> 5.1 | 156 // Up-mixing: 1 -> 5.1 |
154 // output.L += 0 | 157 // output.L += 0 |
155 // output.R += 0 | 158 // output.R += 0 |
156 // output.C += input | 159 // output.C += input |
157 // output.LFE += 0 | 160 // output.LFE += 0 |
158 // output.SL += 0 | 161 // output.SL += 0 |
159 // output.SR += 0 | 162 // output.SR += 0 |
160 if (numberOfInputChannels == 1 && numberOfOutputChannels == 6) { | 163 if (numberOfInputChannels == 1 && numberOfOutputChannels == 6) { |
161 var inputChannel = input.getChannelData(0); | 164 let inputChannel = input.getChannelData(0); |
162 var outputChannel2 = output.getChannelData(2); | 165 let outputChannel2 = output.getChannelData(2); |
163 for (i = 0; i < length; i++) | 166 for (i = 0; i < length; i++) |
164 outputChannel2[i] += inputChannel[i]; | 167 outputChannel2[i] += inputChannel[i]; |
165 | 168 |
166 return; | 169 return; |
167 } | 170 } |
168 | 171 |
169 // Up-mixing: 2 -> 4, 2 -> 5.1 | 172 // Up-mixing: 2 -> 4, 2 -> 5.1 |
170 // output.L += input.L | 173 // output.L += input.L |
171 // output.R += input.R | 174 // output.R += input.R |
172 // output.C += 0 (in the case of 2 -> 5.1) | 175 // output.C += 0 (in the case of 2 -> 5.1) |
173 // output.LFE += 0 (in the case of 2 -> 5.1) | 176 // output.LFE += 0 (in the case of 2 -> 5.1) |
174 // output.SL += 0 | 177 // output.SL += 0 |
175 // output.SR += 0 | 178 // output.SR += 0 |
176 if ((numberOfInputChannels === 2 && numberOfOutputChannels === 4) || | 179 if ((numberOfInputChannels === 2 && numberOfOutputChannels === 4) || |
177 (numberOfInputChannels === 2 && numberOfOutputChannels === 6)) { | 180 (numberOfInputChannels === 2 && numberOfOutputChannels === 6)) { |
178 var inputChannel0 = input.getChannelData(0); | 181 let inputChannel0 = input.getChannelData(0); |
179 var inputChannel1 = input.getChannelData(1); | 182 let inputChannel1 = input.getChannelData(1); |
180 var outputChannel0 = output.getChannelData(0); | 183 let outputChannel0 = output.getChannelData(0); |
181 var outputChannel1 = output.getChannelData(1); | 184 let outputChannel1 = output.getChannelData(1); |
182 for (i = 0; i < length; i++) { | 185 for (i = 0; i < length; i++) { |
183 outputChannel0[i] += inputChannel0[i]; | 186 outputChannel0[i] += inputChannel0[i]; |
184 outputChannel1[i] += inputChannel1[i]; | 187 outputChannel1[i] += inputChannel1[i]; |
185 } | 188 } |
186 | 189 |
187 return; | 190 return; |
188 } | 191 } |
189 | 192 |
190 // Up-mixing: 4 -> 5.1 | 193 // Up-mixing: 4 -> 5.1 |
191 // output.L += input.L | 194 // output.L += input.L |
192 // output.R += input.R | 195 // output.R += input.R |
193 // output.C += 0 | 196 // output.C += 0 |
194 // output.LFE += 0 | 197 // output.LFE += 0 |
195 // output.SL += input.SL | 198 // output.SL += input.SL |
196 // output.SR += input.SR | 199 // output.SR += input.SR |
197 if (numberOfInputChannels === 4 && numberOfOutputChannels === 6) { | 200 if (numberOfInputChannels === 4 && numberOfOutputChannels === 6) { |
198 var inputChannel0 = input.getChannelData(0); // input.L | 201 let inputChannel0 = input.getChannelData(0); // input.L |
199 var inputChannel1 = input.getChannelData(1); // input.R | 202 let inputChannel1 = input.getChannelData(1); // input.R |
200 var inputChannel2 = input.getChannelData(2); // input.SL | 203 let inputChannel2 = input.getChannelData(2); // input.SL |
201 var inputChannel3 = input.getChannelData(3); // input.SR | 204 let inputChannel3 = input.getChannelData(3); // input.SR |
202 var outputChannel0 = output.getChannelData(0); // output.L | 205 let outputChannel0 = output.getChannelData(0); // output.L |
203 var outputChannel1 = output.getChannelData(1); // output.R | 206 let outputChannel1 = output.getChannelData(1); // output.R |
204 var outputChannel4 = output.getChannelData(4); // output.SL | 207 let outputChannel4 = output.getChannelData(4); // output.SL |
205 var outputChannel5 = output.getChannelData(5); // output.SR | 208 let outputChannel5 = output.getChannelData(5); // output.SR |
206 for (i = 0; i < length; i++) { | 209 for (i = 0; i < length; i++) { |
207 outputChannel0[i] += inputChannel0[i]; | 210 outputChannel0[i] += inputChannel0[i]; |
208 outputChannel1[i] += inputChannel1[i]; | 211 outputChannel1[i] += inputChannel1[i]; |
209 outputChannel4[i] += inputChannel2[i]; | 212 outputChannel4[i] += inputChannel2[i]; |
210 outputChannel5[i] += inputChannel3[i]; | 213 outputChannel5[i] += inputChannel3[i]; |
211 } | 214 } |
212 | 215 |
213 return; | 216 return; |
214 } | 217 } |
215 | 218 |
216 // All other cases, fall back to the discrete sum. | 219 // All other cases, fall back to the discrete sum. |
217 discreteSum(input, output); | 220 discreteSum(input, output); |
218 } | 221 } |
219 | 222 |
220 /** | 223 /** |
221 * Perform down-mix by in-place summing to |output| buffer. | 224 * Perform down-mix by in-place summing to |output| buffer. |
222 * @param {AudioBuffer} input Input audio buffer. | 225 * @param {AudioBuffer} input Input audio buffer. |
223 * @param {AudioBuffer} output Output audio buffer. | 226 * @param {AudioBuffer} output Output audio buffer. |
224 */ | 227 */ |
225 function processDownMix(input, output) { | 228 function processDownMix(input, output) { |
226 var numberOfInputChannels = input.numberOfChannels; | 229 let numberOfInputChannels = input.numberOfChannels; |
227 var numberOfOutputChannels = output.numberOfChannels; | 230 let numberOfOutputChannels = output.numberOfChannels; |
228 var i, length = output.length; | 231 let i, length = output.length; |
229 | 232 |
230 // Down-mixing: 2 -> 1 | 233 // Down-mixing: 2 -> 1 |
231 // output += 0.5 * (input.L + input.R) | 234 // output += 0.5 * (input.L + input.R) |
232 if (numberOfInputChannels === 2 && numberOfOutputChannels === 1) { | 235 if (numberOfInputChannels === 2 && numberOfOutputChannels === 1) { |
233 var inputChannel0 = input.getChannelData(0); // input.L | 236 let inputChannel0 = input.getChannelData(0); // input.L |
234 var inputChannel1 = input.getChannelData(1); // input.R | 237 let inputChannel1 = input.getChannelData(1); // input.R |
235 var outputChannel0 = output.getChannelData(0); | 238 let outputChannel0 = output.getChannelData(0); |
236 for (i = 0; i < length; i++) | 239 for (i = 0; i < length; i++) |
237 outputChannel0[i] += 0.5 * (inputChannel0[i] + inputChannel1[i]); | 240 outputChannel0[i] += 0.5 * (inputChannel0[i] + inputChannel1[i]); |
238 | 241 |
239 return; | 242 return; |
240 } | 243 } |
241 | 244 |
242 // Down-mixing: 4 -> 1 | 245 // Down-mixing: 4 -> 1 |
243 // output += 0.25 * (input.L + input.R + input.SL + input.SR) | 246 // output += 0.25 * (input.L + input.R + input.SL + input.SR) |
244 if (numberOfInputChannels === 4 && numberOfOutputChannels === 1) { | 247 if (numberOfInputChannels === 4 && numberOfOutputChannels === 1) { |
245 var inputChannel0 = input.getChannelData(0); // input.L | 248 let inputChannel0 = input.getChannelData(0); // input.L |
246 var inputChannel1 = input.getChannelData(1); // input.R | 249 let inputChannel1 = input.getChannelData(1); // input.R |
247 var inputChannel2 = input.getChannelData(2); // input.SL | 250 let inputChannel2 = input.getChannelData(2); // input.SL |
248 var inputChannel3 = input.getChannelData(3); // input.SR | 251 let inputChannel3 = input.getChannelData(3); // input.SR |
249 var outputChannel0 = output.getChannelData(0); | 252 let outputChannel0 = output.getChannelData(0); |
250 for (i = 0; i < length; i++) { | 253 for (i = 0; i < length; i++) { |
251 outputChannel0[i] += 0.25 * (inputChannel0[i] + inputChannel1[i] | 254 outputChannel0[i] += 0.25 * |
252 + inputChannel2[i] + inputChannel3[i]); | 255 (inputChannel0[i] + inputChannel1[i] + inputChannel2[i] + |
| 256 inputChannel3[i]); |
253 } | 257 } |
254 | 258 |
255 return; | 259 return; |
256 } | 260 } |
257 | 261 |
258 // Down-mixing: 5.1 -> 1 | 262 // Down-mixing: 5.1 -> 1 |
259 // output += sqrt(1/2) * (input.L + input.R) + input.C | 263 // output += sqrt(1/2) * (input.L + input.R) + input.C |
260 // + 0.5 * (input.SL + input.SR) | 264 // + 0.5 * (input.SL + input.SR) |
261 if (numberOfInputChannels === 6 && numberOfOutputChannels === 1) { | 265 if (numberOfInputChannels === 6 && numberOfOutputChannels === 1) { |
262 var inputChannel0 = input.getChannelData(0); // input.L | 266 let inputChannel0 = input.getChannelData(0); // input.L |
263 var inputChannel1 = input.getChannelData(1); // input.R | 267 let inputChannel1 = input.getChannelData(1); // input.R |
264 var inputChannel2 = input.getChannelData(2); // input.C | 268 let inputChannel2 = input.getChannelData(2); // input.C |
265 var inputChannel4 = input.getChannelData(4); // input.SL | 269 let inputChannel4 = input.getChannelData(4); // input.SL |
266 var inputChannel5 = input.getChannelData(5); // input.SR | 270 let inputChannel5 = input.getChannelData(5); // input.SR |
267 var outputChannel0 = output.getChannelData(0); | 271 let outputChannel0 = output.getChannelData(0); |
268 var scaleSqrtHalf = Math.sqrt(0.5); | 272 let scaleSqrtHalf = Math.sqrt(0.5); |
269 for (i = 0; i < length; i++) { | 273 for (i = 0; i < length; i++) { |
270 outputChannel0[i] += | 274 outputChannel0[i] += |
271 scaleSqrtHalf * (inputChannel0[i] + inputChannel1[i]) | 275 scaleSqrtHalf * (inputChannel0[i] + inputChannel1[i]) + |
272 + inputChannel2[i] + 0.5 * (inputChannel4[i] + inputChannel5[i]); | 276 inputChannel2[i] + 0.5 * (inputChannel4[i] + inputChannel5[i]); |
273 } | 277 } |
274 | 278 |
275 return; | 279 return; |
276 } | 280 } |
277 | 281 |
278 // Down-mixing: 4 -> 2 | 282 // Down-mixing: 4 -> 2 |
279 // output.L += 0.5 * (input.L + input.SL) | 283 // output.L += 0.5 * (input.L + input.SL) |
280 // output.R += 0.5 * (input.R + input.SR) | 284 // output.R += 0.5 * (input.R + input.SR) |
281 if (numberOfInputChannels == 4 && numberOfOutputChannels == 2) { | 285 if (numberOfInputChannels == 4 && numberOfOutputChannels == 2) { |
282 var inputChannel0 = input.getChannelData(0); // input.L | 286 let inputChannel0 = input.getChannelData(0); // input.L |
283 var inputChannel1 = input.getChannelData(1); // input.R | 287 let inputChannel1 = input.getChannelData(1); // input.R |
284 var inputChannel2 = input.getChannelData(2); // input.SL | 288 let inputChannel2 = input.getChannelData(2); // input.SL |
285 var inputChannel3 = input.getChannelData(3); // input.SR | 289 let inputChannel3 = input.getChannelData(3); // input.SR |
286 var outputChannel0 = output.getChannelData(0); // output.L | 290 let outputChannel0 = output.getChannelData(0); // output.L |
287 var outputChannel1 = output.getChannelData(1); // output.R | 291 let outputChannel1 = output.getChannelData(1); // output.R |
288 for (i = 0; i < length; i++) { | 292 for (i = 0; i < length; i++) { |
289 outputChannel0[i] += 0.5 * (inputChannel0[i] + inputChannel2[i]); | 293 outputChannel0[i] += 0.5 * (inputChannel0[i] + inputChannel2[i]); |
290 outputChannel1[i] += 0.5 * (inputChannel1[i] + inputChannel3[i]); | 294 outputChannel1[i] += 0.5 * (inputChannel1[i] + inputChannel3[i]); |
291 } | 295 } |
292 | 296 |
293 return; | 297 return; |
294 } | 298 } |
295 | 299 |
296 // Down-mixing: 5.1 -> 2 | 300 // Down-mixing: 5.1 -> 2 |
297 // output.L += input.L + sqrt(1/2) * (input.C + input.SL) | 301 // output.L += input.L + sqrt(1/2) * (input.C + input.SL) |
298 // output.R += input.R + sqrt(1/2) * (input.C + input.SR) | 302 // output.R += input.R + sqrt(1/2) * (input.C + input.SR) |
299 if (numberOfInputChannels == 6 && numberOfOutputChannels == 2) { | 303 if (numberOfInputChannels == 6 && numberOfOutputChannels == 2) { |
300 var inputChannel0 = input.getChannelData(0); // input.L | 304 let inputChannel0 = input.getChannelData(0); // input.L |
301 var inputChannel1 = input.getChannelData(1); // input.R | 305 let inputChannel1 = input.getChannelData(1); // input.R |
302 var inputChannel2 = input.getChannelData(2); // input.C | 306 let inputChannel2 = input.getChannelData(2); // input.C |
303 var inputChannel4 = input.getChannelData(4); // input.SL | 307 let inputChannel4 = input.getChannelData(4); // input.SL |
304 var inputChannel5 = input.getChannelData(5); // input.SR | 308 let inputChannel5 = input.getChannelData(5); // input.SR |
305 var outputChannel0 = output.getChannelData(0); // output.L | 309 let outputChannel0 = output.getChannelData(0); // output.L |
306 var outputChannel1 = output.getChannelData(1); // output.R | 310 let outputChannel1 = output.getChannelData(1); // output.R |
307 var scaleSqrtHalf = Math.sqrt(0.5); | 311 let scaleSqrtHalf = Math.sqrt(0.5); |
308 for (i = 0; i < length; i++) { | 312 for (i = 0; i < length; i++) { |
309 outputChannel0[i] += inputChannel0[i] | 313 outputChannel0[i] += inputChannel0[i] + |
310 + scaleSqrtHalf * (inputChannel2[i] + inputChannel4[i]); | 314 scaleSqrtHalf * (inputChannel2[i] + inputChannel4[i]); |
311 outputChannel1[i] += inputChannel1[i] | 315 outputChannel1[i] += inputChannel1[i] + |
312 + scaleSqrtHalf * (inputChannel2[i] + inputChannel5[i]); | 316 scaleSqrtHalf * (inputChannel2[i] + inputChannel5[i]); |
313 } | 317 } |
314 | 318 |
315 return; | 319 return; |
316 } | 320 } |
317 | 321 |
318 // Down-mixing: 5.1 -> 4 | 322 // Down-mixing: 5.1 -> 4 |
319 // output.L += input.L + sqrt(1/2) * input.C | 323 // output.L += input.L + sqrt(1/2) * input.C |
320 // output.R += input.R + sqrt(1/2) * input.C | 324 // output.R += input.R + sqrt(1/2) * input.C |
321 // output.SL += input.SL | 325 // output.SL += input.SL |
322 // output.SR += input.SR | 326 // output.SR += input.SR |
323 if (numberOfInputChannels === 6 && numberOfOutputChannels === 4) { | 327 if (numberOfInputChannels === 6 && numberOfOutputChannels === 4) { |
324 var inputChannel0 = input.getChannelData(0); // input.L | 328 let inputChannel0 = input.getChannelData(0); // input.L |
325 var inputChannel1 = input.getChannelData(1); // input.R | 329 let inputChannel1 = input.getChannelData(1); // input.R |
326 var inputChannel2 = input.getChannelData(2); // input.C | 330 let inputChannel2 = input.getChannelData(2); // input.C |
327 var inputChannel4 = input.getChannelData(4); // input.SL | 331 let inputChannel4 = input.getChannelData(4); // input.SL |
328 var inputChannel5 = input.getChannelData(5); // input.SR | 332 let inputChannel5 = input.getChannelData(5); // input.SR |
329 var outputChannel0 = output.getChannelData(0); // output.L | 333 let outputChannel0 = output.getChannelData(0); // output.L |
330 var outputChannel1 = output.getChannelData(1); // output.R | 334 let outputChannel1 = output.getChannelData(1); // output.R |
331 var outputChannel2 = output.getChannelData(2); // output.SL | 335 let outputChannel2 = output.getChannelData(2); // output.SL |
332 var outputChannel3 = output.getChannelData(3); // output.SR | 336 let outputChannel3 = output.getChannelData(3); // output.SR |
333 var scaleSqrtHalf = Math.sqrt(0.5); | 337 let scaleSqrtHalf = Math.sqrt(0.5); |
334 for (i = 0; i < length; i++) { | 338 for (i = 0; i < length; i++) { |
335 outputChannel0[i] += inputChannel0[i] + scaleSqrtHalf * inputChannel2[i]; | 339 outputChannel0[i] += inputChannel0[i] + scaleSqrtHalf * inputChannel2[i]; |
336 outputChannel1[i] += inputChannel1[i] + scaleSqrtHalf * inputChannel2[i]; | 340 outputChannel1[i] += inputChannel1[i] + scaleSqrtHalf * inputChannel2[i]; |
337 outputChannel2[i] += inputChannel4[i]; | 341 outputChannel2[i] += inputChannel4[i]; |
338 outputChannel3[i] += inputChannel5[i]; | 342 outputChannel3[i] += inputChannel5[i]; |
339 } | 343 } |
340 | 344 |
341 return; | 345 return; |
342 } | 346 } |
343 | 347 |
344 // All other cases, fall back to the discrete sum. | 348 // All other cases, fall back to the discrete sum. |
345 discreteSum(input, output); | 349 discreteSum(input, output); |
346 } | 350 } |
OLD | NEW |