changeset 1384:7cd2a8dcdc51

Safari does not support Views having the forEach function. Implemented work around.
author Nicholas Jillings <nickjillings@users.noreply.github.com>
date Mon, 15 Feb 2016 13:48:24 +0000
parents 1c5fa95cf158
children bc75c4180b4d
files WAVE.js
diffstat 1 files changed, 31 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/WAVE.js	Mon Feb 15 12:52:55 2016 +0000
+++ b/WAVE.js	Mon Feb 15 13:48:24 2016 +0000
@@ -19,6 +19,23 @@
     return -1;
 };
 
+function convertToInteger(arr) {
+    var value = 0;
+    for (var i=0; i<arr.length; i++)
+    {
+        value += arr[i]<<(i*8);
+    }
+    return value;
+}
+function convertToString(arr) {
+    var str = "";
+    for (var i=0; i<arr.length; i++)
+    {
+        str = str.concat(String.fromCharCode(arr[i]));
+    }
+    return str;
+}
+
 function WAVE()
 {
     // The WAVE file object
@@ -44,43 +61,28 @@
     this.open = function(IOArrayBuffer)
     {
         var IOView8 = new Uint8Array(IOArrayBuffer);
-        IOView8.subarray(0,4).forEach(function(i){
-            var char = String.fromCharCode(i);
-            this.RIFF = this.RIFF.concat(char);
-        },this);
+        this.RIFF = convertToString(IOView8.subarray(0,4));
         if (this.RIFF != 'RIFF')
         {
             console.log('WAVE ERR - Not a RIFF file');
             return 1;
         }
-        this.size = 0;
-        IOView8.subarray(4,8).forEach(function(i,a){this.size += Number(i)<<(8*a);},this);
-        this.FT_Header = String();
-        IOView8.subarray(8,12).forEach(function(i){this.FT_Header = this.FT_Header.concat(String.fromCharCode(i));},this);
-        this.fmt_marker = String();
-        IOView8.subarray(12,16).forEach(function(i){this.fmt_marker = this.fmt_marker.concat(String.fromCharCode(i));},this);
-        this.formatDataLength = 0;
-        IOView8.subarray(16,20).forEach(function(i,a){this.formatDataLength += Number(i)<<(8*a);},this);
-        this.type = 0;
-        IOView8.subarray(20,22).forEach(function(i,a){this.type += Number(i)<<(8*a);},this);
-        this.num_channels = 0;
-        IOView8.subarray(22,24).forEach(function(i,a){this.num_channels += Number(i)<<(8*a);},this);
-        this.sample_rate = 0;
-        IOView8.subarray(24,28).forEach(function(i,a){this.sample_rate += Number(i)<<(8*a);},this);
-        this.byte_rate = 0;
-        IOView8.subarray(28,32).forEach(function(i,a){this.byte_rate += Number(i)<<(8*a);},this);
-        this.block_align = 0;
-        IOView8.subarray(32,34).forEach(function(i,a){this.block_align += Number(i)<<(8*a);},this);
-        this.bits_per_sample = 0;
-        IOView8.subarray(34,36).forEach(function(i,a){this.bits_per_sample += Number(i)<<(8*a);},this);
+        this.size = convertToInteger(IOView8.subarray(4,8));
+        this.FT_Header = convertToString(IOView8.subarray(8,12));
+        this.fmt_marker = convertToString(IOView8.subarray(12,16));
+        this.formatDataLength = convertToInteger(IOView8.subarray(16,20));
+        this.type = convertToInteger(IOView8.subarray(20,22));
+        this.num_channels = convertToInteger(IOView8.subarray(22,24));
+        this.sample_rate = convertToInteger(IOView8.subarray(24,28));
+        this.byte_rate = convertToInteger(IOView8.subarray(28,32));
+        this.block_align = convertToInteger(IOView8.subarray(32,34));
+        this.bits_per_sample = convertToInteger(IOView8.subarray(34,36));
         
         // Find the data header first
         var data_start = find_subarray(IOView8,[100, 97, 116, 97]);
         
-        this.data_header = String();
-        IOView8.subarray(data_start,data_start+4).forEach(function(i){this.data_header = this.data_header.concat(String.fromCharCode(i));},this);
-        this.data_size = 0;
-        IOView8.subarray(data_start+4,data_start+8).forEach(function(i,a){this.data_size += Number(i)<<(8*a);},this);
+        this.data_header = convertToString(IOView8.subarray(data_start,data_start+4));
+        this.data_size = convertToInteger(IOView8.subarray(data_start+4,data_start+8));
         
         this.num_samples = this.data_size / this.block_align;
         
@@ -145,9 +147,8 @@
     }
     for (var n=0; n<number; n++)
     {
-        var intData;
         var srcIndex = n*srcBytes;
-        srcView.subarray(srcIndex,srcIndex+srcBytes).forEach(function(i,a){intData += Number(i)<<(8*a);},this);
+        var intData = convertToInteger(srcView.subarray(srcIndex,srcIndex+srcBytes));
         intData = (intData << (endShift));
         dstView[n] = intData / 2147483648;
     }