| 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 |