| 102 | if (done) return; |
| 103 | err(`warning: browser could not fully decode audio ${name}, trying slower base64 approach`); |
| 104 | function encode64(data) { |
| 105 | var BASE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; |
| 106 | var PAD = '='; |
| 107 | var ret = ''; |
| 108 | var leftchar = 0; |
| 109 | var leftbits = 0; |
| 110 | for (var i = 0; i < data.length; i++) { |
| 111 | leftchar = (leftchar << 8) | data[i]; |
| 112 | leftbits += 8; |
| 113 | while (leftbits >= 6) { |
| 114 | var curr = (leftchar >> (leftbits-6)) & 0x3f; |
| 115 | leftbits -= 6; |
| 116 | ret += BASE[curr]; |
| 117 | } |
| 118 | } |
| 119 | if (leftbits == 2) { |
| 120 | ret += BASE[(leftchar&3) << 4]; |
| 121 | ret += PAD + PAD; |
| 122 | } else if (leftbits == 4) { |
| 123 | ret += BASE[(leftchar&0xf) << 2]; |
| 124 | ret += PAD; |
| 125 | } |
| 126 | return ret; |
| 127 | } |
| 128 | audio.src = 'data:audio/x-' + name.slice(-3) + ';base64,' + encode64(byteArray); |
| 129 | finish(audio); // we don't wait for confirmation this worked - but it's worth trying |
| 130 | }; |