Tone.js/test/helper/Offline.js

58 lines
1.3 KiB
JavaScript
Raw Normal View History

2015-08-21 21:03:14 +00:00
define(["Tone/core/Tone"], function (Tone) {
2015-08-16 18:23:40 +00:00
//hold onto the current context
var onlineContext = Tone.context;
/**
* OFFLINE TESTING
*/
2015-08-21 21:03:14 +00:00
var Offline = function(duration, channels, rms){
2015-08-16 18:23:40 +00:00
duration = duration || 1;
var sampleRate = 44100;
//dummy functions
this._before = Tone.noOp;
this._after = Tone.noOp;
this._test = Tone.noOp;
2015-08-21 21:03:14 +00:00
channels = channels || 1;
2015-08-16 18:23:40 +00:00
//offline rendering context
this.context = new OfflineAudioContext(channels, sampleRate * duration, sampleRate);
this.context.oncomplete = function(e){
2015-08-24 15:13:56 +00:00
for (var i = 0; i < sampleRate * duration; i++){
var ret = [];
for (var channel = 0; channel < channels; channel++){
var buffer = e.renderedBuffer.getChannelData(channel);
ret[channel] = buffer[i];
2015-08-16 18:23:40 +00:00
}
2015-08-24 15:13:56 +00:00
if (channels === 1) {
ret = ret[0];
2015-08-16 18:23:40 +00:00
}
2015-08-24 15:13:56 +00:00
this._test(ret, i / sampleRate);
2015-08-16 18:23:40 +00:00
}
this._after();
//reset the old context
Tone.setContext(onlineContext);
}.bind(this);
};
Offline.prototype.run = function(){
Tone.setContext(this.context);
this._before(this.context.destination);
this.context.startRendering();
};
Offline.prototype.before = function(cb){
this._before = cb;
};
Offline.prototype.after = function(cb){
this._after = cb;
};
Offline.prototype.test = function(cb){
this._test = cb;
};
return Offline;
});