JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger « Adobe Flash Player has 'critical' security issue, won't be addressed until next week » — digitaltrends.com
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger « Flash has […] one of the worst security records in 2009. It is the number one reason Macs crash. » — Steve Jobs
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger « A port of libmad to JavaScript that allows MP3 playback in browsers without any external plug-ins. »
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger « jsmad uses foating-point arithmetic, and has not been tested for ISO/IEC compliance » — @nddrylliog + @jensnockert
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger « We have patents on the psycho-acoustic models underlying MPEG-1 Layer III audio encoding. » — Fraunhofer & Thomson
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger « You have to pay us money if you use MP3 encoders or decoders in for-proft software. » — Fraunhofer & Thomson
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger What HTML5 does for you ● Data input ● Buffering ● Demuxing ● Decoding ● Audio playback ● User interface
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger jsmad — decoding all frames var file = fileChooser.files[0]; new Mad.FileStream(file, function(input) { var mp3 = new Mad.MP3File(input); var mpeg = mp3.getMpegStream(); var frame = new Mad.Frame(); while (mpeg.error != Mad.Error.BUFLEN) { frame = Mad.Frame.decode(frame); } });
JSConf EU 2011 github.com/audiocogs/jsmad Amos Wenger sink.js + jsmad var frame = /* … */; var synth = new Mad.Synth(); function refill(buffer) { // if current frame all used up, decode new one frame = Mad.Frame.decode(frame); // synthesize new one if needed synth.frame(frame); // copy samples from synth to buffer // (TypedArray.set or for loop) } var dev = Sink(refill, channels, bufsize, rate);