var Sound = OZ.Class();

Sound.prototype.init = function(audio, levels, callback) {
	this._ts = 0;
	this._time = 0;
	this._levels = levels;
	this._values = [];
	this._deltas = [];
	this._callback = callback;
	
	OZ.Event.add(audio, "play", this._start.bind(this));
	OZ.Event.add(audio, "audiowritten", this._frame.bind(this));
}

Sound.prototype._start = function(e) {
	this._time = 0;
	this._ts = new Date().getTime();
}

Sound.prototype._frame = function(e) {
	var time = e.target.currentTime * 1000;
	var ts = new Date().getTime();

	var delay = ts - this._ts - time;
	if (delay > 0) { /* skip frame */
		if (window.console && window.console.warn) { window.console.warn("framedrop"); }
		return; 
	} 
	
	var spectrum = e.mozSpectrum;
	var len = spectrum.length;
	var val = [];
	for (var i=0;i<this._levels;i++) { val.push(0); }
	for (var i=0;i<len;i++) {
		val[Math.floor(this._levels*i/len)] += spectrum.item(i);
	}
	
	var diff = time - this._time;
	if (diff && this._values.length) {
		this._deltas = [];
		for (var i=0;i<this._levels;i++) {
			this._deltas.push(1000 * (val[i] - this._values[i]) / diff);
		}
		this._callback(this._values, this._deltas, -delay);
	}
	
	this._values = val;
	this._time = time;
	
}
