Title: [266501] trunk
Revision
266501
Author
cdu...@apple.com
Date
2020-09-02 20:22:28 -0700 (Wed, 02 Sep 2020)

Log Message

Choose adequate number of channels for ConvolverNode's output
https://bugs.webkit.org/show_bug.cgi?id=216099

Reviewed by Eric Carlson.

LayoutTests/imported/w3c:

Rebaseline WPT tests now that more checks are passing.

* web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-cascade-expected.txt:
* web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-1-chan-expected.txt:
* web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-2-chan-expected.txt:
* web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan-expected.txt:
* web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-upmixing-1-channel-response-expected.txt:
* web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv-expected.txt:

Source/WebCore:

Choose adequate number of channels for ConvolverNode's output. We were using 2 channels for
the output no matter what but we're supposed to use a single channel if both the input
and the response buffer are mono.

This is based on the following Blink change by Raymond Toy:
- https://codereview.chromium.org/2732523003

No new tests, rebaselined existing tests.

* Modules/webaudio/ConvolverNode.cpp:
(WebCore::computeNumberOfOutputChannels):
(WebCore::ConvolverNode::create):
Set the shouldNormalize flag *before* we set the buffer since setBuffer() relies on
the flag. This gives us a few more test passes.

(WebCore::ConvolverNode::ConvolverNode):
(WebCore::ConvolverNode::setBuffer):
(WebCore::ConvolverNode::checkNumberOfChannelsForInput):
* Modules/webaudio/ConvolverNode.h:
* platform/audio/Reverb.cpp:
(WebCore::Reverb::Reverb):
(WebCore::Reverb::initialize):
(WebCore::Reverb::process):
* platform/audio/Reverb.h:

Modified Paths

Diff

Modified: trunk/LayoutTests/imported/w3c/ChangeLog (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/ChangeLog	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/ChangeLog	2020-09-03 03:22:28 UTC (rev 266501)
@@ -1,5 +1,21 @@
 2020-09-02  Chris Dumez  <cdu...@apple.com>
 
+        Choose adequate number of channels for ConvolverNode's output
+        https://bugs.webkit.org/show_bug.cgi?id=216099
+
+        Reviewed by Eric Carlson.
+
+        Rebaseline WPT tests now that more checks are passing.
+
+        * web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-cascade-expected.txt:
+        * web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-1-chan-expected.txt:
+        * web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-2-chan-expected.txt:
+        * web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan-expected.txt:
+        * web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-upmixing-1-channel-response-expected.txt:
+        * web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv-expected.txt:
+
+2020-09-02  Chris Dumez  <cdu...@apple.com>
+
         Fix rounding for DelayDSPKernel's buffer size calculation
         https://bugs.webkit.org/show_bug.cgi?id=216091
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-cascade-expected.txt (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-cascade-expected.txt	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-cascade-expected.txt	2020-09-03 03:22:28 UTC (rev 266501)
@@ -3,7 +3,7 @@
 PASS Executing "cascade-mono" 
 PASS Audit report 
 PASS > [cascade-mono] Cascaded mono convolvers 
-FAIL X Output of cascaded mono convolvers should have contain at least one value different from 0. assert_true: expected true got false
-FAIL < [cascade-mono] 1 out of 1 assertions were failed. assert_true: expected true got false
-FAIL # AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed. assert_true: expected true got false
+PASS   Output of cascaded mono convolvers is not constantly 0 (contains 1996 different values). 
+PASS < [cascade-mono] All assertions passed. (total 1 assertions) 
+PASS # AUDIT TASK RUNNER FINISHED: 1 tasks ran successfully. 
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-1-chan-expected.txt (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-1-chan-expected.txt	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-1-chan-expected.txt	2020-09-03 03:22:28 UTC (rev 266501)
@@ -16,27 +16,9 @@
 PASS   new AudioBuffer({numberOfChannels: 1, length: 2, sampleRate: 8192}) did not throw an exception. 
 PASS < [initialize] All assertions passed. (total 1 assertions) 
 PASS > [1-channel input] produces 1-channel output 
-FAIL X 1: Channel 1: Expected 0 for all values but found 1278 unexpected values: 
-	Index	Actual
-	[2]	0.0005517149693332613
-	[3]	0.0011016002390533686
-	[4]	0.0016478316392749548
-	[5]	0.0021885987371206284
-	...and 1274 more errors. assert_true: expected true got false
-FAIL X Convolver output does not equal [0,0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	5.5171496933326125e-4	5.7564035058021545e-2	5.7012320088688284e-2	9.9041563071843097e-1	4.7683715820312500e-7
-	[3]	1.1016002390533686e-3	1.1493717133998871e-1	1.1383557110093534e-1	9.9041563119911147e-1	4.7683715820312500e-7
-	[4]	1.6478316392749548e-3	1.7192906141281128e-1	1.7028122977353632e-1	9.9041563057615711e-1	4.7683715820312500e-7
-	[5]	2.1885987371206284e-3	2.2835084795951843e-1	2.2616224922239780e-1	9.9041563122415632e-1	4.7683715820312500e-7
-	[6]	2.7221068739891052e-3	2.8401523828506470e-1	2.8129313141107559e-1	9.9041563089915285e-1	4.7683715820312500e-7
-	...and 1273 more errors.
-	Max AbsError of 9.9041563086211681e-1 at index of 301.
-	[301]	-9.5843691378831863e-3	-1.0000000000000000e+0	9.9041563086211681e-1	9.9041563086211681e-1	4.7683715820312500e-7
-	Max RelError of 9.9041563141564226e-1 at index of 966.
-	[966]	-7.8987376764416695e-3	-8.2412707805633545e-1	8.1622834037989378e-1	9.9041563141564226e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL < [1-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   1: Channel 1 contains only the constant 0. 
+PASS   Convolver output equals [0,0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS < [1-channel input] All assertions passed. (total 2 assertions) 
 PASS > [2-channel input] produces 2-channel output 
 FAIL X 2: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
@@ -194,80 +176,18 @@
  assert_true: expected true got false
 FAIL < [4-channel input, explicit] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [5.1-channel input, explicit] 5.1->2 explicit downmix producing 2-channel output 
-FAIL X 5.1 chan downmix explicit: Channel 0 does not equal [0,0,2.302107334136963,2.0779101848602295,1.536412000656128,0.8359496593475342,-0.2123139351606369,-0.0052925655618309975,0.8362105488777161,1.0198440551757812,0.32619065046310425,-0.6783384680747986,-1.0576409101486206,-0.5491995811462402,0.2516634166240692,-0.10923532396554947...] with an element-wise tolerance of {"absoluteThreshold":0.0000011511867343774294,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	0.0000000000000000e+0	2.3021073341369629e+0	2.3021073341369629e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	[3]	0.0000000000000000e+0	2.0779101848602295e+0	2.0779101848602295e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	[4]	0.0000000000000000e+0	1.5364120006561279e+0	1.5364120006561279e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	[5]	0.0000000000000000e+0	8.3594965934753418e-1	8.3594965934753418e-1	1.0000000000000000e+0	1.1511867343774294e-6
-	[6]	0.0000000000000000e+0	-2.1231393516063690e-1	2.1231393516063690e-1	1.0000000000000000e+0	1.1511867343774294e-6
-	...and 1271 more errors.
-	Max AbsError of 2.4404382705688477e+0 at index of 896.
-	[896]	0.0000000000000000e+0	2.4404382705688477e+0	2.4404382705688477e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	Max RelError of 1.0000000000000000e+0 at index of 2.
- assert_true: expected true got false
-FAIL X 5.1 chan downmix explicit: Channel 1 does not equal [0,0,2.407027244567871,1.851643443107605,1.2457610368728638,0.5805020928382874,0.3625302314758301,0.1648862212896347,-0.7450207471847534,-1.5345407724380493,-1.904326319694519,-0.7297847867012024,0.01058983150869608,0.7125816941261292,1.75357985496521,0.26786839962005615...] with an element-wise tolerance of {"absoluteThreshold":0.0000011511867343774294,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	0.0000000000000000e+0	2.4070272445678711e+0	2.4070272445678711e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	[3]	0.0000000000000000e+0	1.8516434431076050e+0	1.8516434431076050e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	[4]	0.0000000000000000e+0	1.2457610368728638e+0	1.2457610368728638e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	[5]	0.0000000000000000e+0	5.8050209283828735e-1	5.8050209283828735e-1	1.0000000000000000e+0	1.1511867343774294e-6
-	[6]	0.0000000000000000e+0	3.6253023147583008e-1	3.6253023147583008e-1	1.0000000000000000e+0	1.1511867343774294e-6
-	...and 1272 more errors.
-	Max AbsError of 2.4601652622222900e+0 at index of 186.
-	[186]	0.0000000000000000e+0	-2.4601652622222900e+0	2.4601652622222900e+0	1.0000000000000000e+0	1.1511867343774294e-6
-	Max RelError of 1.0000000000000000e+0 at index of 2.
- assert_true: expected true got false
-FAIL < [5.1-channel input, explicit] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   5.1 chan downmix explicit: Channel 0 equals [0,0,2.302107334136963,2.0779101848602295,1.536412000656128,0.8359496593475342,-0.2123139351606369,-0.0052925655618309975,0.8362105488777161,1.0198440551757812,0.32619065046310425,-0.6783384680747986,-1.0576409101486206,-0.5491995811462402,0.2516634166240692,-0.10923532396554947...] with an element-wise tolerance of {"absoluteThreshold":0.0000011511867343774294,"relativeThreshold":0}. 
+PASS   5.1 chan downmix explicit: Channel 1 equals [0,0,2.407027244567871,1.851643443107605,1.2457610368728638,0.5805020928382874,0.3625302314758301,0.1648862212896347,-0.7450207471847534,-1.5345407724380493,-1.904326319694519,-0.7297847867012024,0.01058983150869608,0.7125816941261292,1.75357985496521,0.26786839962005615...] with an element-wise tolerance of {"absoluteThreshold":0.0000011511867343774294,"relativeThreshold":0}. 
+PASS < [5.1-channel input, explicit] All assertions passed. (total 2 assertions) 
 PASS > [mono-upmix-explicit] 1->2 upmix, count mode explicit 
 PASS   new ConvolverNode({channelCountMode: 'explicit'}) did not throw an exception. 
-FAIL X 1->2 explicit upmix: channel 0 does not equal [0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572,0.7604058980941772...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[1]	0.0000000000000000e+0	5.7564035058021545e-2	5.7564035058021545e-2	1.0000000000000000e+0	4.7683715820312500e-7
-	[2]	0.0000000000000000e+0	1.1493717133998871e-1	1.1493717133998871e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	[3]	0.0000000000000000e+0	1.7192906141281128e-1	1.7192906141281128e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	[4]	0.0000000000000000e+0	2.2835084795951843e-1	2.2835084795951843e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	[5]	0.0000000000000000e+0	2.8401523828506470e-1	2.8401523828506470e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	...and 1273 more errors.
-	Max AbsError of 1.0000000000000000e+0 at index of 300.
-	[300]	0.0000000000000000e+0	-1.0000000000000000e+0	1.0000000000000000e+0	1.0000000000000000e+0	4.7683715820312500e-7
-	Max RelError of 1.0000000000000000e+0 at index of 1.
- assert_true: expected true got false
-FAIL X 1->2 explicit upmix: channel 1 does not equal [0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572,0.7604058980941772...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[1]	0.0000000000000000e+0	5.7564035058021545e-2	5.7564035058021545e-2	1.0000000000000000e+0	4.7683715820312500e-7
-	[2]	0.0000000000000000e+0	1.1493717133998871e-1	1.1493717133998871e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	[3]	0.0000000000000000e+0	1.7192906141281128e-1	1.7192906141281128e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	[4]	0.0000000000000000e+0	2.2835084795951843e-1	2.2835084795951843e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	[5]	0.0000000000000000e+0	2.8401523828506470e-1	2.8401523828506470e-1	1.0000000000000000e+0	4.7683715820312500e-7
-	...and 1273 more errors.
-	Max AbsError of 1.0000000000000000e+0 at index of 300.
-	[300]	0.0000000000000000e+0	-1.0000000000000000e+0	1.0000000000000000e+0	1.0000000000000000e+0	4.7683715820312500e-7
-	Max RelError of 1.0000000000000000e+0 at index of 1.
- assert_true: expected true got false
-FAIL < [mono-upmix-explicit] 2 out of 3 assertions were failed. assert_true: expected true got false
+PASS   1->2 explicit upmix: channel 0 equals [0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572,0.7604058980941772...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS   1->2 explicit upmix: channel 1 equals [0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572,0.7604058980941772...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS < [mono-upmix-explicit] All assertions passed. (total 3 assertions) 
 PASS > [mono-upmix-clamped-max] 1->2 upmix, count mode clamped-max 
 PASS   new ConvolverNode({channelCountMode: 'clamped-max'}) did not throw an exception. 
-FAIL X 1->2 clamped-max upmix: channel 0 does not equal [0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572,0.7604058980941772...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[1]	5.5171496933326125e-4	5.7564035058021545e-2	5.7012320088688284e-2	9.9041563071843097e-1	4.7683715820312500e-7
-	[2]	1.1016002390533686e-3	1.1493717133998871e-1	1.1383557110093534e-1	9.9041563119911147e-1	4.7683715820312500e-7
-	[3]	1.6478316392749548e-3	1.7192906141281128e-1	1.7028122977353632e-1	9.9041563057615711e-1	4.7683715820312500e-7
-	[4]	2.1885987371206284e-3	2.2835084795951843e-1	2.2616224922239780e-1	9.9041563122415632e-1	4.7683715820312500e-7
-	[5]	2.7221068739891052e-3	2.8401523828506470e-1	2.8129313141107559e-1	9.9041563089915285e-1	4.7683715820312500e-7
-	...and 1273 more errors.
-	Max AbsError of 9.9041563086211681e-1 at index of 300.
-	[300]	-9.5843691378831863e-3	-1.0000000000000000e+0	9.9041563086211681e-1	9.9041563086211681e-1	4.7683715820312500e-7
-	Max RelError of 9.9041563141564226e-1 at index of 965.
-	[965]	-7.8987376764416695e-3	-8.2412707805633545e-1	8.1622834037989378e-1	9.9041563141564226e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL X 1->2 clamped-max upmix: channel 1: Expected 0 for all values but found 1278 unexpected values: 
-	Index	Actual
-	[2]	0.0005517149693332613
-	[3]	0.0011016002390533686
-	[4]	0.0016478316392749548
-	[5]	0.0021885987371206284
-	...and 1274 more errors. assert_true: expected true got false
-FAIL < [mono-upmix-clamped-max] 2 out of 3 assertions were failed. assert_true: expected true got false
-FAIL # AUDIT TASK RUNNER FINISHED: 10 out of 11 tasks were failed. assert_true: expected true got false
+PASS   1->2 clamped-max upmix: channel 0 equals [0,0.057564035058021545,0.11493717133998871,0.17192906141281128,0.22835084795951843,0.2840152382850647,0.3387378752231598,0.39233696460723877,0.44463497400283813,0.4954586327075958,0.5446387529373169,0.5920130610466003,0.6374237537384033,0.6807206869125366,0.7217600345611572,0.7604058980941772...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS   1->2 clamped-max upmix: channel 1 contains only the constant 0. 
+PASS < [mono-upmix-clamped-max] All assertions passed. (total 3 assertions) 
+FAIL # AUDIT TASK RUNNER FINISHED: 6 out of 11 tasks were failed. assert_true: expected true got false
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-2-chan-expected.txt (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-2-chan-expected.txt	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-2-chan-expected.txt	2020-09-03 03:22:28 UTC (rev 266501)
@@ -15,256 +15,150 @@
 PASS   new AudioBuffer({numberOfChannels: 2, length: 4, sampleRate: 8192}) did not throw an exception. 
 PASS < [initialize] All assertions passed. (total 1 assertions) 
 PASS > [1-channel input] produces 2-channel output 
-FAIL X 1: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[3]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[4]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[5]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[6]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
-	...and 1271 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 235.
-	[235]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 196.
-	[196]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL X 1: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[4]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[5]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[6]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[7]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
-	...and 1270 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 236.
-	[236]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 197.
-	[197]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL < [1-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   1: Channel 0 equals [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS   1: Channel 1 equals [0,0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS < [1-channel input] All assertions passed. (total 2 assertions) 
 PASS > [2-channel input] produces 2-channel output 
-FAIL X 2: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[3]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[4]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[5]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[6]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
-	...and 1271 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 235.
-	[235]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 196.
-	[196]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL X 2: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[4]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[5]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[6]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[7]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
-	...and 1270 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 236.
-	[236]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 197.
-	[197]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL < [2-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   2: Channel 0 equals [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS   2: Channel 1 equals [0,0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS < [2-channel input] All assertions passed. (total 2 assertions) 
 PASS > [3-channel input] 3->2 downmix producing 2-channel output 
 FAIL X 3: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[3]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[4]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[5]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[6]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
+	[2]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.2335621118545532e-1	8.2335621118545532e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.6454612016677856e-1	8.6454612016677856e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	8.4542512893676758e-1	8.4542512893676758e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1271 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 235.
-	[235]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 196.
-	[196]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
+	Max AbsError of 9.9012923240661621e-1 at index of 235.
+	[235]	0.0000000000000000e+0	-9.9012923240661621e-1	9.9012923240661621e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 3: Channel 1 does not equal [0,0,0,0.9947001934051514,0.770577609539032,0.9109301567077637,0.7706682085990906,0.9842367172241211,0.3202291429042816,-0.9348859190940857,-0.8055058121681213,-0.8837443590164185,-0.8007677793502808,-0.9286618232727051,-0.6026888489723206,0.7909701466560364...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.3482510112226009e-2	9.9470019340515137e-1	9.8121768329292536e-1	9.8644565447798760e-1	4.7683715820312500e-7
-	[4]	1.0444675572216511e-2	7.7057760953903198e-1	7.6013293396681547e-1	9.8644565395760120e-1	4.7683715820312500e-7
-	[5]	1.2347062118351460e-2	9.1093015670776367e-1	8.9858309458941221e-1	9.8644565444734467e-1	4.7683715820312500e-7
-	[6]	1.0445903055369854e-2	7.7066820859909058e-1	7.6022230554372072e-1	9.8644565464253642e-1	4.7683715820312500e-7
-	[7]	1.3340684585273266e-2	9.8423671722412109e-1	9.7089603263884783e-1	9.8644565443270749e-1	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	9.9470019340515137e-1	9.9470019340515137e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	7.7057760953903198e-1	7.7057760953903198e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	9.1093015670776367e-1	9.1093015670776367e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	7.7066820859909058e-1	7.7066820859909058e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[7]	0.0000000000000000e+0	9.8423671722412109e-1	9.8423671722412109e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1271 more errors.
-	Max AbsError of 9.8443668708205223e-1 at index of 274.
-	[274]	-1.3526741415262222e-2	-9.9796342849731445e-1	9.8443668708205223e-1	9.8644565419032426e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565485846292e-1 at index of 350.
-	[350]	8.9482078328728676e-3	6.6017264127731323e-1	6.5122443344444036e-1	9.8644565485846292e-1	4.7683715820312500e-7
+	Max AbsError of 9.9796342849731445e-1 at index of 274.
+	[274]	0.0000000000000000e+0	-9.9796342849731445e-1	9.9796342849731445e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [3-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [4-channel input] 4->2 downmix producing 2-channel output 
 FAIL X 4: Channel 0 does not equal [0,0,0.9734256267547607,0.8085750341415405,0.8596615791320801,0.8377397060394287,0.18206259608268738,-0.06961163878440857,0.037733376026153564,-0.007562130689620972,-0.018085792660713196,0.029709041118621826,-0.02168998122215271,-0.005516946315765381,0.05647379159927368,-0.4439384341239929...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.3194147497415543e-2	9.7342562675476074e-1	9.6023147925734520e-1	9.8644565425978903e-1	4.7683715820312500e-7
-	[3]	1.0959705337882042e-2	8.0857503414154053e-1	7.9761532880365849e-1	9.8644565454643562e-1	4.7683715820312500e-7
-	[4]	1.1652150191366673e-2	8.5966157913208008e-1	8.4800942894071341e-1	9.8644565434326992e-1	4.7683715820312500e-7
-	[5]	1.1355013586580753e-2	8.3773970603942871e-1	8.2638469245284796e-1	9.8644565429485997e-1	4.7683715820312500e-7
-	[6]	2.4677393957972527e-3	1.8206259608268738e-1	1.7959485668689013e-1	9.8644565413822571e-1	4.7683715820312500e-7
+	[2]	0.0000000000000000e+0	9.7342562675476074e-1	9.7342562675476074e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	8.0857503414154053e-1	8.0857503414154053e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.5966157913208008e-1	8.5966157913208008e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.3773970603942871e-1	8.3773970603942871e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	1.8206259608268738e-1	1.8206259608268738e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1271 more errors.
-	Max AbsError of 9.8887207824736834e-1 at index of 428.
-	[428]	-1.3587686233222485e-2	-1.0024597644805908e+0	9.8887207824736834e-1	9.8644565426497421e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565496724246e-1 at index of 193.
-	[193]	-9.9873158615082502e-4	-7.3683500289916992e-2	7.2684768703766167e-2	9.8644565496724246e-1	4.7683715820312500e-7
+	Max AbsError of 1.0024597644805908e+0 at index of 428.
+	[428]	0.0000000000000000e+0	-1.0024597644805908e+0	1.0024597644805908e+0	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 4: Channel 1 does not equal [0,0,0,0.971980094909668,0.8049001097679138,0.8850501775741577,0.18059252202510834,0.027723312377929688,-0.2852807641029358,-0.7788606882095337,-0.03758403658866882,-0.008258670568466187,0.07240843772888184,-0.33466455340385437,-0.7563190460205078,-0.020491331815719604...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.3174554333090782e-2	9.7198009490966797e-1	9.5880554057657719e-1	9.8644565418357133e-1	4.7683715820312500e-7
-	[4]	1.0909894481301308e-2	8.0490010976791382e-1	7.9399021528661251e-1	9.8644565412663809e-1	4.7683715820312500e-7
-	[5]	1.1996275745332241e-2	8.8505017757415771e-1	8.7305390182882547e-1	9.8644565466535139e-1	4.7683715820312500e-7
-	[6]	2.4478135164827108e-3	1.8059252202510834e-1	1.7814470850862563e-1	9.8644565406677032e-1	4.7683715820312500e-7
-	[7]	3.7577137118205428e-4	2.7723312377929688e-2	2.7347541006747633e-2	9.8644565389375327e-1	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	9.7198009490966797e-1	9.7198009490966797e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.0490010976791382e-1	8.0490010976791382e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.8505017757415771e-1	8.8505017757415771e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	1.8059252202510834e-1	1.8059252202510834e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[7]	0.0000000000000000e+0	2.7723312377929688e-2	2.7723312377929688e-2	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1271 more errors.
-	Max AbsError of 9.6179059240967035e-1 at index of 485.
-	[485]	-1.3215570710599422e-2	-9.7500616312026978e-1	9.6179059240967035e-1	9.8644565418098873e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565494492031e-1 at index of 125.
-	[125]	-7.9908343032002449e-3	-5.8954042196273804e-1	5.8154958765953779e-1	9.8644565494492031e-1	4.7683715820312500e-7
+	Max AbsError of 9.7500616312026978e-1 at index of 485.
+	[485]	0.0000000000000000e+0	-9.7500616312026978e-1	9.7500616312026978e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [4-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [5.1-channel input] 5.1->2 downmix producing 2-channel output 
 FAIL X 5.1: Channel 0 does not equal [0,0,2.302107334136963,2.0779101848602295,1.536412000656128,0.8359496593475342,-0.2123139351606369,-0.0052925655618309975,0.8362105488777161,1.0198440551757812,0.32619065046310425,-0.6783384680747986,-1.0576409101486206,-0.5491995811462402,0.2516634166240692,-0.10923532396554947...] with an element-wise tolerance of {"absoluteThreshold":0.0000011511867343774294,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	3.1203558668494225e-2	2.3021073341369629e+0	2.2709037754684687e+0	9.8644565428996722e-1	1.1511867343774294e-6
-	[3]	2.8164712712168694e-2	2.0779101848602295e+0	2.0497454721480608e+0	9.8644565442848375e-1	1.1511867343774294e-6
-	[4]	2.0825060084462166e-2	1.5364120006561279e+0	1.5155869405716658e+0	9.8644565385094052e-1	1.1511867343774294e-6
-	[5]	1.1330750770866871e-2	8.3594965934753418e-1	8.2461890857666731e-1	9.8644565418004881e-1	1.1511867343774294e-6
-	[6]	-2.8777765110135078e-3	-2.1231393516063690e-1	2.0943615864962339e-1	9.8644565412611196e-1	1.1511867343774294e-6
+	[2]	0.0000000000000000e+0	2.3021073341369629e+0	2.3021073341369629e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	[3]	0.0000000000000000e+0	2.0779101848602295e+0	2.0779101848602295e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	[4]	0.0000000000000000e+0	1.5364120006561279e+0	1.5364120006561279e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	[5]	0.0000000000000000e+0	8.3594965934753418e-1	8.3594965934753418e-1	1.0000000000000000e+0	1.1511867343774294e-6
+	[6]	0.0000000000000000e+0	-2.1231393516063690e-1	2.1231393516063690e-1	1.0000000000000000e+0	1.1511867343774294e-6
 	...and 1271 more errors.
-	Max AbsError of 2.4073597267270088e+0 at index of 896.
-	[896]	3.3078543841838837e-2	2.4404382705688477e+0	2.4073597267270088e+0	9.8644565435612164e-1	1.1511867343774294e-6
-	Max RelError of 9.8644565493963665e-1 at index of 565.
-	[565]	-4.0895724669098854e-3	-3.0171671509742737e-1	2.9762714263051748e-1	9.8644565493963665e-1	1.1511867343774294e-6
+	Max AbsError of 2.4404382705688477e+0 at index of 896.
+	[896]	0.0000000000000000e+0	2.4404382705688477e+0	2.4404382705688477e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 5.1: Channel 1 does not equal [0,0,0,2.407027244567871,1.851643443107605,1.2457610368728638,0.5805020928382874,0.3625302314758301,0.1648862212896347,-0.7450207471847534,-1.5345407724380493,-1.904326319694519,-0.7297847867012024,0.01058983150869608,0.7125816941261292,1.75357985496521...] with an element-wise tolerance of {"absoluteThreshold":0.0000011511867343774294,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	3.2625678926706314e-2	2.4070272445678711e+0	2.3744015656411648e+0	9.8644565448923138e-1	1.1511867343774294e-6
-	[4]	2.5097815319895744e-2	1.8516434431076050e+0	1.8265456277877092e+0	9.8644565431140774e-1	1.1511867343774294e-6
-	[5]	1.6885476186871529e-2	1.2457610368728638e+0	1.2288755606859922e+0	9.8644565395201489e-1	1.1511867343774294e-6
-	[6]	7.8683262690901756e-3	5.8050209283828735e-1	5.7263376656919718e-1	9.8644565391552841e-1	1.1511867343774294e-6
-	[7]	4.9138600006699562e-3	3.6253023147583008e-1	3.5761637147516012e-1	9.8644565453020006e-1	1.1511867343774294e-6
+	[3]	0.0000000000000000e+0	2.4070272445678711e+0	2.4070272445678711e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	[4]	0.0000000000000000e+0	1.8516434431076050e+0	1.8516434431076050e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	[5]	0.0000000000000000e+0	1.2457610368728638e+0	1.2457610368728638e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	[6]	0.0000000000000000e+0	5.8050209283828735e-1	5.8050209283828735e-1	1.0000000000000000e+0	1.1511867343774294e-6
+	[7]	0.0000000000000000e+0	3.6253023147583008e-1	3.6253023147583008e-1	1.0000000000000000e+0	1.1511867343774294e-6
 	...and 1271 more errors.
-	Max AbsError of 2.4268193319439888e+0 at index of 187.
-	[187]	-3.3345930278301239e-2	-2.4601652622222900e+0	2.4268193319439888e+0	9.8644565436706488e-1	1.1511867343774294e-6
-	Max RelError of 9.8644565494113301e-1 at index of 629.
-	[629]	-2.0575642120093107e-3	-1.5180107951164246e-1	1.4974351529963315e-1	9.8644565494113301e-1	1.1511867343774294e-6
+	Max AbsError of 2.4601652622222900e+0 at index of 187.
+	[187]	0.0000000000000000e+0	-2.4601652622222900e+0	2.4601652622222900e+0	1.0000000000000000e+0	1.1511867343774294e-6
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [5.1-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [2-channel input, explicit mode] produces 2-channel output 
 FAIL X 2-in explicit mode: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[3]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[4]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[5]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[6]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
+	[2]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.2335621118545532e-1	8.2335621118545532e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.6454612016677856e-1	8.6454612016677856e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	8.4542512893676758e-1	8.4542512893676758e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1271 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 235.
-	[235]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 196.
-	[196]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
+	Max AbsError of 9.9012923240661621e-1 at index of 235.
+	[235]	0.0000000000000000e+0	-9.9012923240661621e-1	9.9012923240661621e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 2-in explicit mode: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[4]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[5]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[6]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[7]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.2335621118545532e-1	8.2335621118545532e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	8.6454612016677856e-1	8.6454612016677856e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[7]	0.0000000000000000e+0	8.4542512893676758e-1	8.4542512893676758e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1270 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 236.
-	[236]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 197.
-	[197]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
+	Max AbsError of 9.9012923240661621e-1 at index of 236.
+	[236]	0.0000000000000000e+0	-9.9012923240661621e-1	9.9012923240661621e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [2-channel input, explicit mode] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [3-channel input explicit mode] 3->1 downmix producing 2-channel output 
 FAIL X 3-in explicit: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248,-0.8348914980888367...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[3]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[4]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[5]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[6]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
+	[2]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.2335621118545532e-1	8.2335621118545532e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.6454612016677856e-1	8.6454612016677856e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	8.4542512893676758e-1	8.4542512893676758e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1271 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 235.
-	[235]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 196.
-	[196]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
+	Max AbsError of 9.9012923240661621e-1 at index of 235.
+	[235]	0.0000000000000000e+0	-9.9012923240661621e-1	9.9012923240661621e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 3-in explicit: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,0.8233562111854553,0.8645461201667786,0.8454251289367676,0.858031690120697,0.7955960035324097,0.9893835186958313,0.39837583899497986,-0.7808233499526978,-0.9249736070632935,-0.7918891906738281,-0.875220775604248...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.2856653891503811e-2	9.4852632284164429e-1	9.3566966895014048e-1	9.8644565408265406e-1	4.7683715820312500e-7
-	[4]	1.1483675800263882e-2	8.4723204374313354e-1	8.3574836794286966e-1	9.8644565454638833e-1	4.7683715820312500e-7
-	[5]	1.1160055175423622e-2	8.2335621118545532e-1	8.1219615601003170e-1	9.8644565374765858e-1	4.7683715820312500e-7
-	[6]	1.1718356981873512e-2	8.6454612016677856e-1	8.5282776318490505e-1	9.8644565430515962e-1	4.7683715820312500e-7
-	[7]	1.1459184810519218e-2	8.4542512893676758e-1	8.3396594412624836e-1	9.8644565388666572e-1	4.7683715820312500e-7
+	[3]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[4]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[5]	0.0000000000000000e+0	8.2335621118545532e-1	8.2335621118545532e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[6]	0.0000000000000000e+0	8.6454612016677856e-1	8.6454612016677856e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	[7]	0.0000000000000000e+0	8.4542512893676758e-1	8.4542512893676758e-1	1.0000000000000000e+0	4.7683715820312500e-7
 	...and 1270 more errors.
-	Max AbsError of 9.7670867852866650e-1 at index of 236.
-	[236]	-1.3420553877949715e-2	-9.9012923240661621e-1	9.7670867852866650e-1	9.8644565432602205e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493170255e-1 at index of 197.
-	[197]	8.1549119204282761e-3	6.0164558887481689e-1	5.9349067695438862e-1	9.8644565493170255e-1	4.7683715820312500e-7
+	Max AbsError of 9.9012923240661621e-1 at index of 236.
+	[236]	0.0000000000000000e+0	-9.9012923240661621e-1	9.9012923240661621e-1	1.0000000000000000e+0	4.7683715820312500e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [3-channel input explicit mode] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [4-channel input explicit mode] 4->1 downmix producing 2-channel output 
-FAIL X 4-in explicit: Channel 0 does not equal [0,0,0.9727029204368591,0.8067376017570496,0.8723558783531189,0.5091661214828491,0.10489296913146973,-0.17744621634483337,-0.37056368589401245,-0.022573083639144897,-0.013172224164009094,0.05105873942375183,-0.17817726731300354,-0.3809179663658142,0.01799122989177704,-0.23770247399806976...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	1.3184351846575737e-2	9.7270292043685913e-1	9.5951856859028339e-1	9.8644565409482432e-1	4.7683715820312500e-7
-	[3]	1.0934800840914249e-2	8.0673760175704956e-1	7.9580280091613531e-1	9.8644565368330595e-1	4.7683715820312500e-7
-	[4]	1.1824212968349457e-2	8.7235587835311890e-1	8.6053166538476944e-1	9.8644565450665400e-1	4.7683715820312500e-7
-	[5]	6.9014136679470539e-3	5.0916612148284912e-1	5.0226470781490207e-1	9.8644565422411057e-1	4.7683715820312500e-7
-	[6]	1.4217555290088058e-3	1.0489296913146973e-1	1.0347121360246092e-1	9.8644565464414669e-1	4.7683715820312500e-7
-	...and 1272 more errors.
-	Max AbsError of 9.7197636403143406e-1 at index of 968.
-	[968]	-1.3355528935790062e-2	-9.8533189296722412e-1	9.7197636403143406e-1	9.8644565447326460e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493995662e-1 at index of 1150.
-	[1150]	-5.1431218162178993e-4	-3.7944450974464417e-2	3.7430138792842627e-2	9.8644565493995662e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL X 4-in explicit: Channel 1 does not equal [0,0,0,0.9727029204368591,0.8067376017570496,0.8723558783531189,0.5091661214828491,0.10489296913146973,-0.17744621634483337,-0.37056368589401245,-0.022573083639144897,-0.013172224164009094,0.05105873942375183,-0.17817726731300354,-0.3809179663658142,0.01799122989177704...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	1.3184351846575737e-2	9.7270292043685913e-1	9.5951856859028339e-1	9.8644565409482432e-1	4.7683715820312500e-7
-	[4]	1.0934800840914249e-2	8.0673760175704956e-1	7.9580280091613531e-1	9.8644565368330595e-1	4.7683715820312500e-7
-	[5]	1.1824212968349457e-2	8.7235587835311890e-1	8.6053166538476944e-1	9.8644565450665400e-1	4.7683715820312500e-7
-	[6]	6.9014136679470539e-3	5.0916612148284912e-1	5.0226470781490207e-1	9.8644565422411057e-1	4.7683715820312500e-7
-	[7]	1.4217555290088058e-3	1.0489296913146973e-1	1.0347121360246092e-1	9.8644565464414669e-1	4.7683715820312500e-7
-	...and 1271 more errors.
-	Max AbsError of 9.7197636403143406e-1 at index of 969.
-	[969]	-1.3355528935790062e-2	-9.8533189296722412e-1	9.7197636403143406e-1	9.8644565447326460e-1	4.7683715820312500e-7
-	Max RelError of 9.8644565493995662e-1 at index of 1151.
-	[1151]	-5.1431218162178993e-4	-3.7944450974464417e-2	3.7430138792842627e-2	9.8644565493995662e-1	4.7683715820312500e-7
- assert_true: expected true got false
-FAIL < [4-channel input explicit mode] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   4-in explicit: Channel 0 equals [0,0,0.9727029204368591,0.8067376017570496,0.8723558783531189,0.5091661214828491,0.10489296913146973,-0.17744621634483337,-0.37056368589401245,-0.022573083639144897,-0.013172224164009094,0.05105873942375183,-0.17817726731300354,-0.3809179663658142,0.01799122989177704,-0.23770247399806976...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS   4-in explicit: Channel 1 equals [0,0,0,0.9727029204368591,0.8067376017570496,0.8723558783531189,0.5091661214828491,0.10489296913146973,-0.17744621634483337,-0.37056368589401245,-0.022573083639144897,-0.013172224164009094,0.05105873942375183,-0.17817726731300354,-0.3809179663658142,0.01799122989177704...] with an element-wise tolerance of {"absoluteThreshold":4.76837158203125e-7,"relativeThreshold":0}. 
+PASS < [4-channel input explicit mode] All assertions passed. (total 2 assertions) 
 PASS > [5.1-channel input explicit mode] 5.1->1 downmix producing 2-channel output 
-FAIL X 5.1-in explicit: Channel 0 does not equal [0,0,3.3298611640930176,2.778614044189453,1.967293381690979,1.0015825033187866,0.10621887445449829,0.11284977197647095,0.06448096036911011,-0.36394545435905457,-1.115910291671753,-0.9956934452056885,-0.740376889705658,0.1155286431312561,1.4179210662841797,0.11217048764228821...] with an element-wise tolerance of {"absoluteThreshold":0.0000016280238925805544,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	4.5134089887142181e-2	3.3298611640930176e+0	3.2847270742058754e+0	9.8644565413902607e-1	1.6280238925805544e-6
-	[3]	3.7662297487258911e-2	2.7786140441894531e+0	2.7409517467021942e+0	9.8644565352067626e-1	1.6280238925805544e-6
-	[4]	2.6665374636650085e-2	1.9672933816909790e+0	1.9406280070543289e+0	9.8644565427565767e-1	1.6280238925805544e-6
-	[5]	1.3575796037912369e-2	1.0015825033187866e+0	9.8800670728087425e-1	9.8644565375999638e-1	1.6280238925805544e-6
-	[6]	1.4397273771464825e-3	1.0621887445449829e-1	1.0477914707735181e-1	9.8644565399002393e-1	1.6280238925805544e-6
-	...and 1272 more errors.
-	Max AbsError of 3.4086129888892174e+0 at index of 37.
-	[37]	-4.6836353838443756e-2	-3.4554493427276611e+0	3.4086129888892174e+0	9.8644565461883693e-1	1.6280238925805544e-6
-	Max RelError of 9.8644565497778591e-1 at index of 327.
-	[327]	1.5722304582595825e-2	1.1599457263946533e+0	1.1442234218120575e+0	9.8644565497778591e-1	1.6280238925805544e-6
- assert_true: expected true got false
-FAIL X 5.1-in explicit: Channel 1 does not equal [0,0,0,3.3298611640930176,2.778614044189453,1.967293381690979,1.0015825033187866,0.10621887445449829,0.11284977197647095,0.06448096036911011,-0.36394545435905457,-1.115910291671753,-0.9956934452056885,-0.740376889705658,0.1155286431312561,1.4179210662841797...] with an element-wise tolerance of {"absoluteThreshold":0.0000016280238925805544,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	4.5134089887142181e-2	3.3298611640930176e+0	3.2847270742058754e+0	9.8644565413902607e-1	1.6280238925805544e-6
-	[4]	3.7662297487258911e-2	2.7786140441894531e+0	2.7409517467021942e+0	9.8644565352067626e-1	1.6280238925805544e-6
-	[5]	2.6665374636650085e-2	1.9672933816909790e+0	1.9406280070543289e+0	9.8644565427565767e-1	1.6280238925805544e-6
-	[6]	1.3575796037912369e-2	1.0015825033187866e+0	9.8800670728087425e-1	9.8644565375999638e-1	1.6280238925805544e-6
-	[7]	1.4397273771464825e-3	1.0621887445449829e-1	1.0477914707735181e-1	9.8644565399002393e-1	1.6280238925805544e-6
-	...and 1271 more errors.
-	Max AbsError of 3.4086129888892174e+0 at index of 38.
-	[38]	-4.6836353838443756e-2	-3.4554493427276611e+0	3.4086129888892174e+0	9.8644565461883693e-1	1.6280238925805544e-6
-	Max RelError of 9.8644565497778591e-1 at index of 328.
-	[328]	1.5722304582595825e-2	1.1599457263946533e+0	1.1442234218120575e+0	9.8644565497778591e-1	1.6280238925805544e-6
- assert_true: expected true got false
-FAIL < [5.1-channel input explicit mode] 2 out of 2 assertions were failed. assert_true: expected true got false
-FAIL # AUDIT TASK RUNNER FINISHED: 9 out of 10 tasks were failed. assert_true: expected true got false
+PASS   5.1-in explicit: Channel 0 equals [0,0,3.3298611640930176,2.778614044189453,1.967293381690979,1.0015825033187866,0.10621887445449829,0.11284977197647095,0.06448096036911011,-0.36394545435905457,-1.115910291671753,-0.9956934452056885,-0.740376889705658,0.1155286431312561,1.4179210662841797,0.11217048764228821...] with an element-wise tolerance of {"absoluteThreshold":0.0000016280238925805544,"relativeThreshold":0}. 
+PASS   5.1-in explicit: Channel 1 equals [0,0,0,3.3298611640930176,2.778614044189453,1.967293381690979,1.0015825033187866,0.10621887445449829,0.11284977197647095,0.06448096036911011,-0.36394545435905457,-1.115910291671753,-0.9956934452056885,-0.740376889705658,0.1155286431312561,1.4179210662841797...] with an element-wise tolerance of {"absoluteThreshold":0.0000016280238925805544,"relativeThreshold":0}. 
+PASS < [5.1-channel input explicit mode] All assertions passed. (total 2 assertions) 
+FAIL # AUDIT TASK RUNNER FINISHED: 5 out of 10 tasks were failed. assert_true: expected true got false
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan-expected.txt (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan-expected.txt	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-response-4-chan-expected.txt	2020-09-03 03:22:28 UTC (rev 266501)
@@ -17,157 +17,127 @@
 PASS > [1-channel input] produces 2-channel output 
 FAIL X 1: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,1.7718825340270996,1.711778163909912,1.6687812805175781,1.7225778102874756,1.6410211324691772,1.8474152088165283,1.193971872329712,0.20856016874313354,-0.5265977382659912,-1.5727125406265259,-1.8001943826675415,-1.6267807483673096...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	9.0910261496901512e-3	9.4852632284164429e-1	9.3943529669195414e-1	9.9041563114194364e-1	7.1525573730468750e-7
-	[3]	8.1201847642660141e-3	8.4723204374313354e-1	8.3911185897886753e-1	9.9041563073040717e-1	7.1525573730468750e-7
-	[4]	1.6982376575469971e-2	1.7718825340270996e+0	1.7549001574516296e+0	9.9041563069258731e-1	7.1525573730468750e-7
-	[5]	1.6406312584877014e-2	1.7117781639099121e+0	1.6953718513250351e+0	9.9041563157494483e-1	7.1525573730468750e-7
-	[6]	1.5994217246770859e-2	1.6687812805175781e+0	1.6527870632708073e+0	9.9041562999687405e-1	7.1525573730468750e-7
+	[2]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[3]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[4]	0.0000000000000000e+0	1.7718825340270996e+0	1.7718825340270996e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[5]	0.0000000000000000e+0	1.7117781639099121e+0	1.7117781639099121e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[6]	0.0000000000000000e+0	1.6687812805175781e+0	1.6687812805175781e+0	1.0000000000000000e+0	7.1525573730468750e-7
 	...and 1271 more errors.
-	Max AbsError of 1.8309436403214931e+0 at index of 144.
-	[144]	-1.7718259245157242e-2	-1.8486618995666504e+0	1.8309436403214931e+0	9.9041563021918144e-1	7.1525573730468750e-7
-	Max RelError of 9.9041564970368201e-1 at index of 244.
-	[244]	-2.2633560001850128e-4	-2.3615121841430664e-2	2.3388786241412163e-2	9.9041564970368201e-1	7.1525573730468750e-7
+	Max AbsError of 1.8486618995666504e+0 at index of 144.
+	[144]	0.0000000000000000e+0	-1.8486618995666504e+0	1.8486618995666504e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 1: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,1.7718825340270996,1.711778163909912,1.6687812805175781,1.7225778102874756,1.6410211324691772,1.8474152088165283,1.193971872329712,0.20856016874313354,-0.5265977382659912,-1.5727125406265259,-1.8001943826675415...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	9.0910261496901512e-3	9.4852632284164429e-1	9.3943529669195414e-1	9.9041563114194364e-1	7.1525573730468750e-7
-	[4]	8.1201847642660141e-3	8.4723204374313354e-1	8.3911185897886753e-1	9.9041563073040717e-1	7.1525573730468750e-7
-	[5]	1.6982376575469971e-2	1.7718825340270996e+0	1.7549001574516296e+0	9.9041563069258731e-1	7.1525573730468750e-7
-	[6]	1.6406312584877014e-2	1.7117781639099121e+0	1.6953718513250351e+0	9.9041563157494483e-1	7.1525573730468750e-7
-	[7]	1.5994217246770859e-2	1.6687812805175781e+0	1.6527870632708073e+0	9.9041562999687405e-1	7.1525573730468750e-7
+	[3]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[4]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[5]	0.0000000000000000e+0	1.7718825340270996e+0	1.7718825340270996e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[6]	0.0000000000000000e+0	1.7117781639099121e+0	1.7117781639099121e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[7]	0.0000000000000000e+0	1.6687812805175781e+0	1.6687812805175781e+0	1.0000000000000000e+0	7.1525573730468750e-7
 	...and 1270 more errors.
-	Max AbsError of 1.8309436403214931e+0 at index of 145.
-	[145]	-1.7718259245157242e-2	-1.8486618995666504e+0	1.8309436403214931e+0	9.9041563021918144e-1	7.1525573730468750e-7
-	Max RelError of 9.9041564970368201e-1 at index of 245.
-	[245]	-2.2633560001850128e-4	-2.3615121841430664e-2	2.3388786241412163e-2	9.9041564970368201e-1	7.1525573730468750e-7
+	Max AbsError of 1.8486618995666504e+0 at index of 145.
+	[145]	0.0000000000000000e+0	-1.8486618995666504e+0	1.8486618995666504e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [1-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [2-channel input] produces 2-channel output 
-FAIL X 2: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,1.818056344985962,1.6351237297058105,1.7563552856445312,1.6286998987197876,1.7798327207565308,1.3096126317977905,-0.5365101099014282,-1.5863292217254639,-1.808717966079712,-1.5926569700241089,-1.8038825988769531,-1.4375803470611572...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	9.0910261496901512e-3	9.4852632284164429e-1	9.3943529669195414e-1	9.9041563114194364e-1	7.1525573730468750e-7
-	[3]	8.1201847642660141e-3	8.4723204374313354e-1	8.3911185897886753e-1	9.9041563073040717e-1	7.1525573730468750e-7
-	[4]	1.7424922436475754e-2	1.8180563449859619e+0	1.8006314225494862e+0	9.9041563124018017e-1	7.1525573730468750e-7
-	[5]	1.5671629458665848e-2	1.6351237297058105e+0	1.6194521002471447e+0	9.9041563083334039e-1	7.1525573730468750e-7
-	[6]	1.6833558678627014e-2	1.7563552856445313e+0	1.7395217269659042e+0	9.9041563013120681e-1	7.1525573730468750e-7
-	...and 1273 more errors.
-	Max AbsError of 1.9325089044868946e+0 at index of 542.
-	[542]	1.8701117485761642e-2	1.9512100219726563e+0	1.9325089044868946e+0	9.9041563067267613e-1	7.1525573730468750e-7
-	Max RelError of 9.9041640428211586e-1 at index of 689.
-	[689]	9.0710818767547607e-6	9.4652175903320313e-4	9.3745067715644836e-4	9.9041640428211586e-1	7.1525573730468750e-7
- assert_true: expected true got false
-FAIL X 2: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,1.818056344985962,1.6351237297058105,1.7563552856445312,1.6286998987197876,1.7798327207565308,1.3096126317977905,-0.5365101099014282,-1.5863292217254639,-1.808717966079712,-1.5926569700241089,-1.8038825988769531...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	9.0910261496901512e-3	9.4852632284164429e-1	9.3943529669195414e-1	9.9041563114194364e-1	7.1525573730468750e-7
-	[4]	8.1201847642660141e-3	8.4723204374313354e-1	8.3911185897886753e-1	9.9041563073040717e-1	7.1525573730468750e-7
-	[5]	1.7424922436475754e-2	1.8180563449859619e+0	1.8006314225494862e+0	9.9041563124018017e-1	7.1525573730468750e-7
-	[6]	1.5671629458665848e-2	1.6351237297058105e+0	1.6194521002471447e+0	9.9041563083334039e-1	7.1525573730468750e-7
-	[7]	1.6833558678627014e-2	1.7563552856445313e+0	1.7395217269659042e+0	9.9041563013120681e-1	7.1525573730468750e-7
-	...and 1272 more errors.
-	Max AbsError of 1.9325089044868946e+0 at index of 543.
-	[543]	1.8701117485761642e-2	1.9512100219726563e+0	1.9325089044868946e+0	9.9041563067267613e-1	7.1525573730468750e-7
-	Max RelError of 9.9041640428211586e-1 at index of 690.
-	[690]	9.0710818767547607e-6	9.4652175903320313e-4	9.3745067715644836e-4	9.9041640428211586e-1	7.1525573730468750e-7
- assert_true: expected true got false
-FAIL < [2-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   2: Channel 0 equals [0,0,0.9485263228416443,0.8472320437431335,1.818056344985962,1.6351237297058105,1.7563552856445312,1.6286998987197876,1.7798327207565308,1.3096126317977905,-0.5365101099014282,-1.5863292217254639,-1.808717966079712,-1.5926569700241089,-1.8038825988769531,-1.4375803470611572...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}. 
+PASS   2: Channel 1 equals [0,0,0,0.9485263228416443,0.8472320437431335,1.818056344985962,1.6351237297058105,1.7563552856445312,1.6286998987197876,1.7798327207565308,1.3096126317977905,-0.5365101099014282,-1.5863292217254639,-1.808717966079712,-1.5926569700241089,-1.8038825988769531...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}. 
+PASS < [2-channel input] All assertions passed. (total 2 assertions) 
 PASS > [3-channel input] 3->2 downmix producing 2-channel output 
 FAIL X 3: Channel 0 does not equal [0,0,0.9485263228416443,0.8472320437431335,1.818056344985962,1.6351237297058105,1.7563552856445312,1.6286998987197876,1.7798327207565308,1.3096126317977905,-0.5365101099014282,-1.5863292217254639,-1.808717966079712,-1.5926569700241089,-1.8038825988769531,-1.4375803470611572...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	9.0910261496901512e-3	9.4852632284164429e-1	9.3943529669195414e-1	9.9041563114194364e-1	7.1525573730468750e-7
-	[3]	8.1201847642660141e-3	8.4723204374313354e-1	8.3911185897886753e-1	9.9041563073040717e-1	7.1525573730468750e-7
-	[4]	1.7424922436475754e-2	1.8180563449859619e+0	1.8006314225494862e+0	9.9041563124018017e-1	7.1525573730468750e-7
-	[5]	1.5671629458665848e-2	1.6351237297058105e+0	1.6194521002471447e+0	9.9041563083334039e-1	7.1525573730468750e-7
-	[6]	1.6833558678627014e-2	1.7563552856445313e+0	1.7395217269659042e+0	9.9041563013120681e-1	7.1525573730468750e-7
+	[2]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[3]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[4]	0.0000000000000000e+0	1.8180563449859619e+0	1.8180563449859619e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[5]	0.0000000000000000e+0	1.6351237297058105e+0	1.6351237297058105e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[6]	0.0000000000000000e+0	1.7563552856445313e+0	1.7563552856445313e+0	1.0000000000000000e+0	7.1525573730468750e-7
 	...and 1273 more errors.
-	Max AbsError of 1.9325089044868946e+0 at index of 542.
-	[542]	1.8701117485761642e-2	1.9512100219726563e+0	1.9325089044868946e+0	9.9041563067267613e-1	7.1525573730468750e-7
-	Max RelError of 9.9041640428211586e-1 at index of 689.
-	[689]	9.0710818767547607e-6	9.4652175903320313e-4	9.3745067715644836e-4	9.9041640428211586e-1	7.1525573730468750e-7
+	Max AbsError of 1.9512100219726563e+0 at index of 542.
+	[542]	0.0000000000000000e+0	1.9512100219726563e+0	1.9512100219726563e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 3: Channel 1 does not equal [0,0,0,0.9485263228416443,0.8472320437431335,1.818056344985962,1.6351237297058105,1.7563552856445312,1.6286998987197876,1.7798327207565308,1.3096126317977905,-0.5365101099014282,-1.5863292217254639,-1.808717966079712,-1.5926569700241089,-1.8038825988769531...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	9.0910261496901512e-3	9.4852632284164429e-1	9.3943529669195414e-1	9.9041563114194364e-1	7.1525573730468750e-7
-	[4]	8.1201847642660141e-3	8.4723204374313354e-1	8.3911185897886753e-1	9.9041563073040717e-1	7.1525573730468750e-7
-	[5]	1.7424922436475754e-2	1.8180563449859619e+0	1.8006314225494862e+0	9.9041563124018017e-1	7.1525573730468750e-7
-	[6]	1.5671629458665848e-2	1.6351237297058105e+0	1.6194521002471447e+0	9.9041563083334039e-1	7.1525573730468750e-7
-	[7]	1.6833558678627014e-2	1.7563552856445313e+0	1.7395217269659042e+0	9.9041563013120681e-1	7.1525573730468750e-7
+	[3]	0.0000000000000000e+0	9.4852632284164429e-1	9.4852632284164429e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[4]	0.0000000000000000e+0	8.4723204374313354e-1	8.4723204374313354e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[5]	0.0000000000000000e+0	1.8180563449859619e+0	1.8180563449859619e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[6]	0.0000000000000000e+0	1.6351237297058105e+0	1.6351237297058105e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[7]	0.0000000000000000e+0	1.7563552856445313e+0	1.7563552856445313e+0	1.0000000000000000e+0	7.1525573730468750e-7
 	...and 1272 more errors.
-	Max AbsError of 1.9325089044868946e+0 at index of 543.
-	[543]	1.8701117485761642e-2	1.9512100219726563e+0	1.9325089044868946e+0	9.9041563067267613e-1	7.1525573730468750e-7
-	Max RelError of 9.9041640428211586e-1 at index of 690.
-	[690]	9.0710818767547607e-6	9.4652175903320313e-4	9.3745067715644836e-4	9.9041640428211586e-1	7.1525573730468750e-7
+	Max AbsError of 1.9512100219726563e+0 at index of 543.
+	[543]	0.0000000000000000e+0	1.9512100219726563e+0	1.9512100219726563e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [3-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [4-channel input] 4->2 downmix producing 2-channel output 
 FAIL X 4: Channel 0 does not equal [0,0,0.9734256267547607,0.8085750341415405,1.831641674041748,1.6426398754119873,1.0671128034591675,0.11098088324069977,0.06545668840408325,-0.29284289479255676,-0.7969464659690857,-0.007874995470046997,-0.029948651790618896,0.06689149141311646,-0.2781907618045807,-1.2002575397491455...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	9.3296701088547707e-3	9.7342562675476074e-1	9.6409595664590597e-1	9.9041563129999122e-1	7.1525573730468750e-7
-	[3]	7.7496818266808987e-3	8.0857503414154053e-1	8.0082535231485963e-1	9.9041563058534365e-1	7.1525573730468750e-7
-	[4]	1.7555128782987595e-2	1.8316416740417480e+0	1.8140865452587605e+0	9.9041563148961886e-1	7.1525573730468750e-7
-	[5]	1.5743665397167206e-2	1.6426398754119873e+0	1.6268962100148201e+0	9.9041563179317160e-1	7.1525573730468750e-7
-	[6]	1.0227602906525135e-2	1.0671128034591675e+0	1.0568852005526423e+0	9.9041563096856189e-1	7.1525573730468750e-7
+	[2]	0.0000000000000000e+0	9.7342562675476074e-1	9.7342562675476074e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[3]	0.0000000000000000e+0	8.0857503414154053e-1	8.0857503414154053e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[4]	0.0000000000000000e+0	1.8316416740417480e+0	1.8316416740417480e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[5]	0.0000000000000000e+0	1.6426398754119873e+0	1.6426398754119873e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[6]	0.0000000000000000e+0	1.0671128034591675e+0	1.0671128034591675e+0	1.0000000000000000e+0	7.1525573730468750e-7
 	...and 1273 more errors.
-	Max AbsError of 1.9324576631188393e+0 at index of 1175.
-	[1175]	1.8700622022151947e-2	1.9511582851409912e+0	1.9324576631188393e+0	9.9041563046700709e-1	7.1525573730468750e-7
-	Max RelError of 9.9041567469489644e-1 at index of 664.
-	[664]	3.4756085369735956e-6	3.6263465881347656e-4	3.5915905027650297e-4	9.9041567469489644e-1	7.1525573730468750e-7
+	Max AbsError of 1.9511582851409912e+0 at index of 1175.
+	[1175]	0.0000000000000000e+0	1.9511582851409912e+0	1.9511582851409912e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	Max RelError of 1.0000000000000000e+0 at index of 2.
  assert_true: expected true got false
 FAIL X 4: Channel 1 does not equal [0,0,0,0.9734256267547607,0.8085750341415405,1.831641674041748,1.6426398754119873,1.0671128034591675,0.11098088324069977,0.06545668840408325,-0.29284289479255676,-0.7969464659690857,-0.007874995470046997,-0.029948651790618896,0.06689149141311646,-0.2781907618045807...] with an element-wise tolerance of {"absoluteThreshold":7.152557373046875e-7,"relativeThreshold":0}.
 	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	9.3296701088547707e-3	9.7342562675476074e-1	9.6409595664590597e-1	9.9041563129999122e-1	7.1525573730468750e-7
-	[4]	7.7496818266808987e-3	8.0857503414154053e-1	8.0082535231485963e-1	9.9041563058534365e-1	7.1525573730468750e-7
-	[5]	1.7555128782987595e-2	1.8316416740417480e+0	1.8140865452587605e+0	9.9041563148961886e-1	7.1525573730468750e-7
-	[6]	1.5743665397167206e-2	1.6426398754119873e+0	1.6268962100148201e+0	9.9041563179317160e-1	7.1525573730468750e-7
-	[7]	1.0227602906525135e-2	1.0671128034591675e+0	1.0568852005526423e+0	9.9041563096856189e-1	7.1525573730468750e-7
+	[3]	0.0000000000000000e+0	9.7342562675476074e-1	9.7342562675476074e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[4]	0.0000000000000000e+0	8.0857503414154053e-1	8.0857503414154053e-1	1.0000000000000000e+0	7.1525573730468750e-7
+	[5]	0.0000000000000000e+0	1.8316416740417480e+0	1.8316416740417480e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[6]	0.0000000000000000e+0	1.6426398754119873e+0	1.6426398754119873e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	[7]	0.0000000000000000e+0	1.0671128034591675e+0	1.0671128034591675e+0	1.0000000000000000e+0	7.1525573730468750e-7
 	...and 1272 more errors.
-	Max AbsError of 1.9324576631188393e+0 at index of 1176.
-	[1176]	1.8700622022151947e-2	1.9511582851409912e+0	1.9324576631188393e+0	9.9041563046700709e-1	7.1525573730468750e-7
-	Max RelError of 9.9041567469489644e-1 at index of 665.
-	[665]	3.4756085369735956e-6	3.6263465881347656e-4	3.5915905027650297e-4	9.9041567469489644e-1	7.1525573730468750e-7
+	Max AbsError of 1.9511582851409912e+0 at index of 1176.
+	[1176]	0.0000000000000000e+0	1.9511582851409912e+0	1.9511582851409912e+0	1.0000000000000000e+0	7.1525573730468750e-7
+	Max RelError of 1.0000000000000000e+0 at index of 3.
  assert_true: expected true got false
 FAIL < [4-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [5.1-channel input] 5.1->2 downmix producing 2-channel output 
-FAIL X 5.1: Channel 0 does not equal [0,0,2.302107334136963,2.0779101848602295,3.943439245223999,2.6875929832458496,1.0334471464157104,0.5752094984054565,1.1987407207489014,1.1847302913665771,-0.41883009672164917,-2.212879180908203,-2.9619672298431396,-1.2789843082427979,0.2622532546520233,0.6033463478088379...] with an element-wise tolerance of {"absoluteThreshold":0.0000017267801015661442,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[2]	2.2064246237277985e-2	2.3021073341369629e+0	2.2800430878996849e+0	9.9041563096989582e-1	1.7267801015661442e-6
-	[3]	1.9915457814931870e-2	2.0779101848602295e+0	2.0579947270452976e+0	9.9041563107008324e-1	1.7267801015661442e-6
-	[4]	3.7795379757881165e-2	3.9434392452239990e+0	3.9056438654661179e+0	9.9041563026394885e-1	1.7267801015661442e-6
-	[5]	2.5758884847164154e-2	2.6875929832458496e+0	2.6618340983986855e+0	9.9041563026554169e-1	1.7267801015661442e-6
-	[6]	9.9049387499690056e-3	1.0334471464157104e+0	1.0235422076657414e+0	9.9041563104187558e-1	1.7267801015661442e-6
-	...and 1273 more errors.
-	Max AbsError of 3.9134636670351028e+0 at index of 153.
-	[153]	3.7871047854423523e-2	3.9513347148895264e+0	3.9134636670351028e+0	9.9041563153034928e-1	1.7267801015661442e-6
-	Max RelError of 9.9041565882256477e-1 at index of 694.
-	[694]	-4.5286957174539566e-5	-4.7250986099243164e-3	4.6798116527497768e-3	9.9041565882256477e-1	1.7267801015661442e-6
- assert_true: expected true got false
-FAIL X 5.1: Channel 1 does not equal [0,0,0,2.302107334136963,2.0779101848602295,3.943439245223999,2.6875929832458496,1.0334471464157104,0.5752094984054565,1.1987407207489014,1.1847302913665771,-0.41883009672164917,-2.212879180908203,-2.9619672298431396,-1.2789843082427979,0.2622532546520233...] with an element-wise tolerance of {"absoluteThreshold":0.0000017267801015661442,"relativeThreshold":0}.
-	Index	Actual			Expected		AbsError		RelError		Test threshold
-	[3]	2.2064246237277985e-2	2.3021073341369629e+0	2.2800430878996849e+0	9.9041563096989582e-1	1.7267801015661442e-6
-	[4]	1.9915457814931870e-2	2.0779101848602295e+0	2.0579947270452976e+0	9.9041563107008324e-1	1.7267801015661442e-6
-	[5]	3.7795379757881165e-2	3.9434392452239990e+0	3.9056438654661179e+0	9.9041563026394885e-1	1.7267801015661442e-6
-	[6]	2.5758884847164154e-2	2.6875929832458496e+0	2.6618340983986855e+0	9.9041563026554169e-1	1.7267801015661442e-6
-	[7]	9.9049387499690056e-3	1.0334471464157104e+0	1.0235422076657414e+0	9.9041563104187558e-1	1.7267801015661442e-6
-	...and 1272 more errors.
-	Max AbsError of 3.9134636670351028e+0 at index of 154.
-	[154]	3.7871047854423523e-2	3.9513347148895264e+0	3.9134636670351028e+0	9.9041563153034928e-1	1.7267801015661442e-6
-	Max RelError of 9.9041565882256477e-1 at index of 695.
-	[695]	-4.5286957174539566e-5	-4.7250986099243164e-3	4.6798116527497768e-3	9.9041565882256477e-1	1.7267801015661442e-6
- assert_true: expected true got false
-FAIL < [5.1-channel input] 2 out of 2 assertions were failed. assert_true: expected true got false
+PASS   5.1: Channel 0 equals [0,0,2.302107334136963,2.0779101848602295,3.943439245223999,2.6875929832458496,1.0334471464157104,0.5752094984054565,1.1987407207489014,1.1847302913665771,-0.41883009672164917,-2.212879180908203,-2.9619672298431396,-1.2789843082427979,0.2622532546520233,0.6033463478088379...] with an element-wise tolerance of {"absoluteThreshold":0.0000017267801015661442,"relativeThreshold":0}. 
+PASS   5.1: Channel 1 equals [0,0,0,2.302107334136963,2.0779101848602295,3.943439245223999,2.6875929832458496,1.0334471464157104,0.5752094984054565,1.1987407207489014,1.1847302913665771,-0.41883009672164917,-2.212879180908203,-2.9619672298431396,-1.2789843082427979,0.2622532546520233...] with an element-wise tolerance of {"absoluteThreshold":0.0000017267801015661442,"relativeThreshold":0}. 
+PASS < [5.1-channel input] All assertions passed. (total 2 assertions) 
 PASS > [delayed buffer set] Delayed set of 4-channel response 
 PASS   Output with delayed setting of convolver buffer is not constantly 0 (contains 768 different values). 
 PASS < [delayed buffer set] All assertions passed. (total 1 assertions) 
 PASS > [count 1, 2-channel in] 2->1 downmix because channel count is 1 
-PASS   Convolver count 1, stereo in: output 0 is identical to the array [0,0,0.009091026149690151,0.008120184764266014,0.01698237657546997,0.016406312584877014,0.01599421724677086,0.016509821638464928,0.01572815328836441,0.017706308513879776,0.011443466879427433,0.0019989171996712685,-0.0050471071153879166,-0.015073457732796669,-0.017253726720809937,-0.015591667033731937...]. 
-PASS   Convolver count 1, stereo in: output 1 is identical to the array [0,0,0,0.009091026149690151,0.008120184764266014,0.01698237657546997,0.016406312584877014,0.01599421724677086,0.016509821638464928,0.01572815328836441,0.017706308513879776,0.011443466879427433,0.0019989171996712685,-0.0050471071153879166,-0.015073457732796669,-0.017253726720809937...]. 
+PASS   Convolver count 1, stereo in: output 0 is identical to the array [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...]. 
+PASS   Convolver count 1, stereo in: output 1 is identical to the array [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...]. 
 PASS < [count 1, 2-channel in] All assertions passed. (total 2 assertions) 
 PASS > [count 1, 4-channel in] 4->1 downmix because channel count is 1 
-PASS   Convolver count 1, 4-channel in: output 0 is identical to the array [0,0,0.009322743862867355,0.007732070982456207,0.0176837258040905,0.012612107209861279,0.009366313926875591,0.0031793261878192425,-0.0025462862104177475,-0.0019170588348060846,-0.003677866654470563,0.00027301706722937524,-0.0018339641392230988,-0.0031614925246685743,-0.001535282121039927,-0.005929086357355118...]. 
-PASS   Convolver count 1, 4-channel in: output 1 is identical to the array [0,0,0,0.009322743862867355,0.007732070982456207,0.0176837258040905,0.012612107209861279,0.009366313926875591,0.0031793261878192425,-0.0025462862104177475,-0.0019170588348060846,-0.003677866654470563,0.00027301706722937524,-0.0018339641392230988,-0.0031614925246685743,-0.001535282121039927...]. 
-PASS < [count 1, 4-channel in] All assertions passed. (total 2 assertions) 
+FAIL X Convolver count 1, 4-channel in: output 0 expected to be equal to the array [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...] but differs in 1278 places:
+	Index	Actual			Expected
+	[2]	9.7270292043685913e-1	0.0000000000000000e+0
+	[3]	8.0673760175704956e-1	0.0000000000000000e+0
+	[4]	1.8450587987899780e+0	0.0000000000000000e+0
+	[5]	1.3159036636352539e+0	0.0000000000000000e+0
+	...and 1274 more errors. assert_true: expected true got false
+FAIL X Convolver count 1, 4-channel in: output 1 expected to be equal to the array [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0...] but differs in 1277 places:
+	Index	Actual			Expected
+	[3]	9.7270292043685913e-1	0.0000000000000000e+0
+	[4]	8.0673760175704956e-1	0.0000000000000000e+0
+	[5]	1.8450587987899780e+0	0.0000000000000000e+0
+	[6]	1.3159036636352539e+0	0.0000000000000000e+0
+	...and 1273 more errors. assert_true: expected true got false
+FAIL < [count 1, 4-channel in] 2 out of 2 assertions were failed. assert_true: expected true got false
 PASS > [count 1, 5.1-channel in] 5.1->1 downmix because channel count is 1 
-PASS   Convolver count 1, 5.1 channel in: output 0 is identical to the array [0,0,0.031914617866277695,0.02663126215338707,0.05076988413929939,0.036230798810720444,0.019873308017849922,0.010681130923330784,0.0016360501758754253,-0.0024065938778221607,-0.010077287442982197,-0.013031281530857086,-0.017791341990232468,-0.008435824885964394,0.006493833381682634,0.002182352589443326...]. 
-PASS   Convolver count 1, 5.1 channel in: output 1 is identical to the array [0,0,0,0.031914617866277695,0.02663126215338707,0.05076988413929939,0.036230798810720444,0.019873308017849922,0.010681130923330784,0.0016360501758754253,-0.0024065938778221607,-0.010077287442982197,-0.013031281530857086,-0.017791341990232468,-0.008435824885964394,0.006493833381682634...]. 
-PASS < [count 1, 5.1-channel in] All assertions passed. (total 2 assertions) 
+FAIL X Convolver count 1, 5.1 channel in: output 0 expected to be equal to the array [0,0,3.3298611640930176,2.778614044189453,5.297154426574707,3.7801966667175293,2.073512315750122,1.1144323348999023,0.1706998348236084,-0.2510956823825836,-1.051429271697998,-1.3596389293670654,-1.8562872409820557,-0.8801648020744324,0.6775441765785217,0.2276991307735443...] but differs in 1278 places:
+	Index	Actual			Expected
+	[2]	0.0000000000000000e+0	3.3298611640930176e+0
+	[3]	0.0000000000000000e+0	2.7786140441894531e+0
+	[4]	0.0000000000000000e+0	5.2971544265747070e+0
+	[5]	0.0000000000000000e+0	3.7801966667175293e+0
+	...and 1274 more errors. assert_true: expected true got false
+FAIL X Convolver count 1, 5.1 channel in: output 1 expected to be equal to the array [0,0,0,3.3298611640930176,2.778614044189453,5.297154426574707,3.7801966667175293,2.073512315750122,1.1144323348999023,0.1706998348236084,-0.2510956823825836,-1.051429271697998,-1.3596389293670654,-1.8562872409820557,-0.8801648020744324,0.6775441765785217...] but differs in 1277 places:
+	Index	Actual			Expected
+	[3]	0.0000000000000000e+0	3.3298611640930176e+0
+	[4]	0.0000000000000000e+0	2.7786140441894531e+0
+	[5]	0.0000000000000000e+0	5.2971544265747070e+0
+	[6]	0.0000000000000000e+0	3.7801966667175293e+0
+	...and 1273 more errors. assert_true: expected true got false
+FAIL < [count 1, 5.1-channel in] 2 out of 2 assertions were failed. assert_true: expected true got false
 FAIL # AUDIT TASK RUNNER FINISHED: 5 out of 10 tasks were failed. assert_true: expected true got false
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-upmixing-1-channel-response-expected.txt (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-upmixing-1-channel-response-expected.txt	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/convolver-upmixing-1-channel-response-expected.txt	2020-09-03 03:22:28 UTC (rev 266501)
@@ -1,5 +1,5 @@
 
-FAIL speakers, initially mono assert_approx_equals: output at 191 in channel 0 expected -0.019168466329574585 +/- 7.152557373046875e-7 but got 0
-FAIL discrete assert_approx_equals: output at 191 in channel 0 expected -0.019168466329574585 +/- 7.152557373046875e-7 but got 0
-FAIL speakers, initially stereo assert_approx_equals: output at 191 in channel 0 expected -0.019168466329574585 +/- 7.152557373046875e-7 but got 0
+FAIL speakers, initially mono assert_approx_equals: output at 191 in channel 0 expected -0.4999929368495941 +/- 7.152557373046875e-7 but got 0
+FAIL discrete assert_approx_equals: output at 191 in channel 0 expected -0.4999929368495941 +/- 7.152557373046875e-7 but got 0
+FAIL speakers, initially stereo assert_approx_equals: output at 191 in channel 0 expected -0.4999929368495941 +/- 7.152557373046875e-7 but got 0
 

Modified: trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv-expected.txt (266500 => 266501)


--- trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv-expected.txt	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/LayoutTests/imported/w3c/web-platform-tests/webaudio/the-audio-api/the-convolvernode-interface/realtime-conv-expected.txt	2020-09-03 03:22:28 UTC (rev 266501)
@@ -3,7 +3,7 @@
 PASS Executing "test" 
 PASS Audit report 
 PASS > [test] Test convolver with real-time context 
-FAIL X SNR is not greater than or equal to 88.457. Got -79.48810094446551. assert_true: expected true got false
+FAIL X SNR is not greater than or equal to 88.457. Got 77.00623887904952. assert_true: expected true got false
 FAIL < [test] 1 out of 1 assertions were failed. assert_true: expected true got false
 FAIL # AUDIT TASK RUNNER FINISHED: 1 out of 1 tasks were failed. assert_true: expected true got false
 

Modified: trunk/Source/WebCore/ChangeLog (266500 => 266501)


--- trunk/Source/WebCore/ChangeLog	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/Source/WebCore/ChangeLog	2020-09-03 03:22:28 UTC (rev 266501)
@@ -1,3 +1,35 @@
+2020-09-02  Chris Dumez  <cdu...@apple.com>
+
+        Choose adequate number of channels for ConvolverNode's output
+        https://bugs.webkit.org/show_bug.cgi?id=216099
+
+        Reviewed by Eric Carlson.
+
+        Choose adequate number of channels for ConvolverNode's output. We were using 2 channels for
+        the output no matter what but we're supposed to use a single channel if both the input
+        and the response buffer are mono.
+
+        This is based on the following Blink change by Raymond Toy:
+        - https://codereview.chromium.org/2732523003
+
+        No new tests, rebaselined existing tests.
+
+        * Modules/webaudio/ConvolverNode.cpp:
+        (WebCore::computeNumberOfOutputChannels):
+        (WebCore::ConvolverNode::create):
+        Set the shouldNormalize flag *before* we set the buffer since setBuffer() relies on
+        the flag. This gives us a few more test passes.
+
+        (WebCore::ConvolverNode::ConvolverNode):
+        (WebCore::ConvolverNode::setBuffer):
+        (WebCore::ConvolverNode::checkNumberOfChannelsForInput):
+        * Modules/webaudio/ConvolverNode.h:
+        * platform/audio/Reverb.cpp:
+        (WebCore::Reverb::Reverb):
+        (WebCore::Reverb::initialize):
+        (WebCore::Reverb::process):
+        * platform/audio/Reverb.h:
+
 2020-09-02  Darin Adler  <da...@apple.com>
 
         Simplify some editing code

Modified: trunk/Source/WebCore/Modules/webaudio/ConvolverNode.cpp (266500 => 266501)


--- trunk/Source/WebCore/Modules/webaudio/ConvolverNode.cpp	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/Source/WebCore/Modules/webaudio/ConvolverNode.cpp	2020-09-03 03:22:28 UTC (rev 266501)
@@ -47,6 +47,13 @@
 
 WTF_MAKE_ISO_ALLOCATED_IMPL(ConvolverNode);
 
+static unsigned computeNumberOfOutputChannels(unsigned inputChannels, unsigned responseChannels)
+{
+    // The number of output channels for a Convolver must be one or two. And can only be one if
+    // there's a mono source and a mono response buffer.
+    return (inputChannels == 1 && responseChannels == 1) ? 1u : 2u;
+}
+
 ExceptionOr<Ref<ConvolverNode>> ConvolverNode::create(BaseAudioContext& context, ConvolverOptions&& options)
 {
     if (context.isStopped())
@@ -60,12 +67,12 @@
     if (result.hasException())
         return result.releaseException();
 
+    node->setNormalize(!options.disableNormalization);
+
     result = node->setBuffer(WTFMove(options.buffer));
     if (result.hasException())
         return result.releaseException();
 
-    node->setNormalize(!options.disableNormalization);
-
     return node;
 }
 
@@ -75,7 +82,7 @@
     setNodeType(NodeTypeConvolver);
 
     addInput(makeUnique<AudioNodeInput>(this));
-    addOutput(makeUnique<AudioNodeOutput>(this, 2));
+    addOutput(makeUnique<AudioNodeOutput>(this, 1));
     
     initialize();
 }
@@ -163,13 +170,21 @@
 
     // Create the reverb with the given impulse response.
     bool useBackgroundThreads = !context().isOfflineContext();
-    auto reverb = makeUnique<Reverb>(bufferBus.get(), AudioNode::ProcessingSizeInFrames, MaxFFTSize, 2, useBackgroundThreads, m_normalize);
+    auto reverb = makeUnique<Reverb>(bufferBus.get(), AudioNode::ProcessingSizeInFrames, MaxFFTSize, useBackgroundThreads, m_normalize);
 
     {
+        // The context must be locked since changing the buffer can re-configure the number of channels that are output.
+        BaseAudioContext::AutoLocker contextLocker(context());
+
         // Synchronize with process().
         auto locker = holdLock(m_processMutex);
+
         m_reverb = WTFMove(reverb);
         m_buffer = WTFMove(buffer);
+        if (m_buffer) {
+            // This will propagate the channel count to any nodes connected further downstream in the graph.
+            output(0)->setNumberOfChannels(computeNumberOfOutputChannels(input(0)->numberOfChannels(), m_buffer->numberOfChannels()));
+        }
     }
 
     return { };
@@ -211,6 +226,30 @@
     return AudioNode::setChannelCountMode(mode);
 }
 
+void ConvolverNode::checkNumberOfChannelsForInput(AudioNodeInput* input)
+{
+    ASSERT(context().isAudioThread() && context().isGraphOwner());
+
+    if (m_buffer) {
+        unsigned numberOfOutputChannels = computeNumberOfOutputChannels(input->numberOfChannels(), m_buffer->numberOfChannels());
+
+        if (isInitialized() && numberOfOutputChannels != output(0)->numberOfChannels()) {
+            // We're already initialized but the channel count has changed.
+            uninitialize();
+        }
+
+        if (!isInitialized()) {
+            // This will propagate the channel count to any nodes connected further
+            // downstream in the graph.
+            output(0)->setNumberOfChannels(numberOfOutputChannels);
+            initialize();
+        }
+    }
+
+    // Update the input's internal bus if needed.
+    AudioNode::checkNumberOfChannelsForInput(input);
+}
+
 } // namespace WebCore
 
 #endif // ENABLE(WEB_AUDIO)

Modified: trunk/Source/WebCore/Modules/webaudio/ConvolverNode.h (266500 => 266501)


--- trunk/Source/WebCore/Modules/webaudio/ConvolverNode.h	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/Source/WebCore/Modules/webaudio/ConvolverNode.h	2020-09-03 03:22:28 UTC (rev 266501)
@@ -61,6 +61,7 @@
     void reset() final;
     void initialize() final;
     void uninitialize() final;
+    void checkNumberOfChannelsForInput(AudioNodeInput*) final;
 
     std::unique_ptr<Reverb> m_reverb;
     RefPtr<AudioBuffer> m_buffer;

Modified: trunk/Source/WebCore/platform/audio/Reverb.cpp (266500 => 266501)


--- trunk/Source/WebCore/platform/audio/Reverb.cpp	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/Source/WebCore/platform/audio/Reverb.cpp	2020-09-03 03:22:28 UTC (rev 266501)
@@ -85,7 +85,7 @@
     return scale;
 }
 
-Reverb::Reverb(AudioBus* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads, bool normalize)
+Reverb::Reverb(AudioBus* impulseResponse, size_t renderSliceSize, size_t maxFFTSize, bool useBackgroundThreads, bool normalize)
 {
     float scale = 1;
 
@@ -92,20 +92,21 @@
     if (normalize)
         scale = calculateNormalizationScale(impulseResponse);
 
-    initialize(impulseResponse, renderSliceSize, maxFFTSize, numberOfChannels, useBackgroundThreads, scale);
+    initialize(impulseResponse, renderSliceSize, maxFFTSize, useBackgroundThreads, scale);
 }
 
-void Reverb::initialize(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads, float scale)
+void Reverb::initialize(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, bool useBackgroundThreads, float scale)
 {
     m_impulseResponseLength = impulseResponseBuffer->length();
 
     // The reverb can handle a mono impulse response and still do stereo processing
-    size_t numResponseChannels = impulseResponseBuffer->numberOfChannels();
-    m_convolvers.reserveCapacity(numberOfChannels);
+    m_numberOfResponseChannels = impulseResponseBuffer->numberOfChannels();
+    unsigned convolverCount = std::max(m_numberOfResponseChannels, 2u);
+    m_convolvers.reserveCapacity(convolverCount);
 
     int convolverRenderPhase = 0;
-    for (size_t i = 0; i < numResponseChannels; ++i) {
-        AudioChannel* channel = impulseResponseBuffer->channel(i);
+    for (unsigned i = 0; i < convolverCount; ++i) {
+        auto* channel = impulseResponseBuffer->channel(std::min(i, m_numberOfResponseChannels - 1));
 
         m_convolvers.append(makeUnique<ReverbConvolver>(channel, renderSliceSize, maxFFTSize, convolverRenderPhase, useBackgroundThreads, scale));
 
@@ -114,7 +115,7 @@
 
     // For "True" stereo processing we allocate a temporary buffer to avoid repeatedly allocating it in the process() method.
     // It can be bad to allocate memory in a real-time thread.
-    if (numResponseChannels == 4)
+    if (m_numberOfResponseChannels == 4)
         m_tempBuffer = AudioBus::create(2, MaxFrameSize);
 }
 
@@ -121,13 +122,15 @@
 void Reverb::process(const AudioBus* sourceBus, AudioBus* destinationBus, size_t framesToProcess)
 {
     // Do a fairly comprehensive sanity check.
-    // If these conditions are satisfied, all of the source and destination pointers will be valid for the various matrixing cases.
-    bool isSafeToProcess = sourceBus && destinationBus && sourceBus->numberOfChannels() > 0 && destinationBus->numberOfChannels() > 0
-        && framesToProcess <= MaxFrameSize && framesToProcess <= sourceBus->length() && framesToProcess <= destinationBus->length(); 
-    
-    ASSERT(isSafeToProcess);
-    if (!isSafeToProcess)
-        return;
+    // If these conditions are satisfied, all of the source and destination
+    // pointers will be valid for the various matrixing cases.
+    ASSERT(sourceBus);
+    ASSERT(destinationBus);
+    ASSERT(sourceBus->numberOfChannels() > 0u);
+    ASSERT(destinationBus->numberOfChannels() > 0u);
+    ASSERT(framesToProcess <= MaxFrameSize);
+    ASSERT(framesToProcess <= sourceBus->length());
+    ASSERT(framesToProcess <= destinationBus->length());
 
     // For now only handle mono or stereo output
     if (destinationBus->numberOfChannels() > 2) {
@@ -141,36 +144,55 @@
     // Handle input -> output matrixing...
     size_t numInputChannels = sourceBus->numberOfChannels();
     size_t numOutputChannels = destinationBus->numberOfChannels();
-    size_t numReverbChannels = m_convolvers.size();
+    size_t numberOfResponseChannels = m_numberOfResponseChannels;
 
-    if (numInputChannels == 2 && numReverbChannels == 2 && numOutputChannels == 2) {
-        // 2 -> 2 -> 2
+    ASSERT(numInputChannels <= 2ul);
+    ASSERT(numOutputChannels <= 2ul);
+    ASSERT(numberOfResponseChannels == 1 || numberOfResponseChannels == 2 || numberOfResponseChannels == 4);
+
+    // These are the possible combinations of number inputs, response
+    // channels and outputs channels that need to be supported:
+    //
+    //   numInputChannels:         1 or 2
+    //   numberOfResponseChannels: 1, 2, or 4
+    //   numOutputChannels:        1 or 2
+    //
+    // Not all possible combinations are valid. numOutputChannels is
+    // one only if both numInputChannels and numberOfResponseChannels are 1.
+    // Otherwise numOutputChannels MUST be 2.
+    //
+    // The valid combinations are
+    //
+    //   Case     in -> resp -> out
+    //   1        1 -> 1 -> 1
+    //   2        1 -> 2 -> 2
+    //   3        1 -> 4 -> 2
+    //   4        2 -> 1 -> 2
+    //   5        2 -> 2 -> 2
+    //   6        2 -> 4 -> 2
+
+    if (numInputChannels == 2 && (numberOfResponseChannels == 1 || numberOfResponseChannels == 2) && numOutputChannels == 2) {
+        // Case 4 and 5: 2 -> 2 -> 2 or 2 -> 1 -> 2.
+        //
+        // These can be handled in the same way because in the latter
+        // case, two connvolvers are still created with the second being a
+        // copy of the first.
         const AudioChannel* sourceChannelR = sourceBus->channel(1);
         AudioChannel* destinationChannelR = destinationBus->channel(1);
         m_convolvers[0]->process(sourceChannelL, destinationChannelL, framesToProcess);
         m_convolvers[1]->process(sourceChannelR, destinationChannelR, framesToProcess);
-    } else  if (numInputChannels == 1 && numOutputChannels == 2 && numReverbChannels == 2) {
-        // 1 -> 2 -> 2
+    } else  if (numInputChannels == 1 && numOutputChannels == 2 && numberOfResponseChannels == 2) {
+        // Case 2: 1 -> 2 -> 2
         for (int i = 0; i < 2; ++i) {
             AudioChannel* destinationChannel = destinationBus->channel(i);
             m_convolvers[i]->process(sourceChannelL, destinationChannel, framesToProcess);
         }
-    } else if (numInputChannels == 1 && numReverbChannels == 1 && numOutputChannels == 2) {
-        // 1 -> 1 -> 2
+    } else if (numInputChannels == 1 && numberOfResponseChannels == 1) {
+        // Case 1: 1 -> 1 -> 1
+        ASSERT(numOutputChannels == 1ul);
         m_convolvers[0]->process(sourceChannelL, destinationChannelL, framesToProcess);
-
-        // simply copy L -> R
-        AudioChannel* destinationChannelR = destinationBus->channel(1);
-        bool isCopySafe = destinationChannelL->data() && destinationChannelR->data() && destinationChannelL->length() >= framesToProcess && destinationChannelR->length() >= framesToProcess;
-        ASSERT(isCopySafe);
-        if (!isCopySafe)
-            return;
-        memcpy(destinationChannelR->mutableData(), destinationChannelL->data(), sizeof(float) * framesToProcess);
-    } else if (numInputChannels == 1 && numReverbChannels == 1 && numOutputChannels == 1) {
-        // 1 -> 1 -> 1
-        m_convolvers[0]->process(sourceChannelL, destinationChannelL, framesToProcess);
-    } else if (numInputChannels == 2 && numReverbChannels == 4 && numOutputChannels == 2) {
-        // 2 -> 4 -> 2 ("True" stereo)
+    } else if (numInputChannels == 2 && numberOfResponseChannels == 4 && numOutputChannels == 2) {
+        // Case 6: 2 -> 4 -> 2 ("True" stereo)
         const AudioChannel* sourceChannelR = sourceBus->channel(1);
         AudioChannel* destinationChannelR = destinationBus->channel(1);
 
@@ -186,9 +208,10 @@
         m_convolvers[3]->process(sourceChannelR, tempChannelR, framesToProcess);
 
         destinationBus->sumFrom(*m_tempBuffer);
-    } else if (numInputChannels == 1 && numReverbChannels == 4 && numOutputChannels == 2) {
-        // 1 -> 4 -> 2 (Processing mono with "True" stereo impulse response)
-        // This is an inefficient use of a four-channel impulse response, but we should handle the case.
+    } else if (numInputChannels == 1 && numberOfResponseChannels == 4 && numOutputChannels == 2) {
+        // Case 3: 1 -> 4 -> 2 (Processing mono with "True" stereo impulse
+        // response) This is an inefficient use of a four-channel impulse
+        // response, but we should handle the case.
         AudioChannel* destinationChannelR = destinationBus->channel(1);
 
         AudioChannel* tempChannelL = m_tempBuffer->channel(0);
@@ -204,8 +227,7 @@
 
         destinationBus->sumFrom(*m_tempBuffer);
     } else {
-        // Handle gracefully any unexpected / unsupported matrixing
-        // FIXME: add code for 5.1 support...
+        ASSERT_NOT_REACHED();
         destinationBus->zero();
     }
 }

Modified: trunk/Source/WebCore/platform/audio/Reverb.h (266500 => 266501)


--- trunk/Source/WebCore/platform/audio/Reverb.h	2020-09-03 02:59:38 UTC (rev 266500)
+++ trunk/Source/WebCore/platform/audio/Reverb.h	2020-09-03 03:22:28 UTC (rev 266501)
@@ -44,7 +44,7 @@
     enum { MaxFrameSize = 256 };
 
     // renderSliceSize is a rendering hint, so the FFTs can be optimized to not all occur at the same time (very bad when rendering on a real-time thread).
-    Reverb(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads, bool normalize);
+    Reverb(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, bool useBackgroundThreads, bool normalize);
 
     void process(const AudioBus* sourceBus, AudioBus* destinationBus, size_t framesToProcess);
     void reset();
@@ -53,10 +53,13 @@
     size_t latencyFrames() const;
 
 private:
-    void initialize(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, size_t numberOfChannels, bool useBackgroundThreads, float scale);
+    void initialize(AudioBus* impulseResponseBuffer, size_t renderSliceSize, size_t maxFFTSize, bool useBackgroundThreads, float scale);
 
     size_t m_impulseResponseLength;
 
+    // The actual number of channels in the response. This can be less
+    // than the number of ReverbConvolver's in |m_convolvers|.
+    unsigned m_numberOfResponseChannels { 0 };
     Vector<std::unique_ptr<ReverbConvolver>> m_convolvers;
 
     // For "True" stereo processing
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to