UNPKG

audiobuffer

Version:

An implementation of Web Audio API's AudioBuffer for node.js and the browser.

277 lines (239 loc) 9.36 kB
var assert = require('assert') , _ = require('underscore') , AudioBuffer = require('../lib/AudioBuffer') describe('AudioBuffer', function() { it('should be created with the right attributes', function() { var ab = new AudioBuffer(3, 100, 44100) , data1 = ab.getChannelData(0) , data2 = ab.getChannelData(1) , data3 = ab.getChannelData(2) assert.equal(ab.sampleRate, 44100) assert.equal(ab.length, 100) assert.equal(ab.numberOfChannels, 3) _.toArray(data1).forEach(function(val) { assert.equal(val, 0) }) _.toArray(data2).forEach(function(val) { assert.equal(val, 0) }) _.toArray(data3).forEach(function(val) { assert.equal(val, 0) }) assert.equal(data1.length, 100) assert.equal(data2.length, 100) assert.equal(data3.length, 100) }) it('should throw an error with invalid creation arguments', function() { assert.throws(function() { new AudioBuffer('a', 100, 44100) }) assert.throws(function() { new AudioBuffer(3, -1, 44100) }) assert.throws(function() { new AudioBuffer(3, 100, 'rr') }) }) describe('getChannelData', function() { it('should return valid channels', function() { var ab = new AudioBuffer(2, 3, 44100) assert.equal(ab.getChannelData(0), ab._data[0]) assert.equal(ab.getChannelData(1), ab._data[1]) }) it('should throw an error if the channel is not valid', function() { var ab = new AudioBuffer(2, 3, 44100) assert.throws(function() { ab.getChannelData(2) }) }) }) describe('filledWithVal', function() { it('should return a buffer with the value given', function() { var ab = AudioBuffer.filledWithVal(111, 4, 200, 44100) , data1 = ab.getChannelData(0) , data2 = ab.getChannelData(1) , data3 = ab.getChannelData(2) assert.equal(ab.sampleRate, 44100) assert.equal(ab.length, 200) assert.equal(ab.numberOfChannels, 4) _.toArray(data1).forEach(function(val) { assert.equal(val, 111) }) _.toArray(data2).forEach(function(val) { assert.equal(val, 111) }) _.toArray(data3).forEach(function(val) { assert.equal(val, 111) }) assert.equal(data1.length, 200) assert.equal(data2.length, 200) assert.equal(data3.length, 200) }) }) describe('fromArray', function() { it('should create an AudioBuffer from an array of arrays', function() { var array = [ [1, 2, 3, 4], [11, 22, 33, 44], [111, 222, 333, 444] ] var ab = AudioBuffer.fromArray(array, 44100) assert.equal(ab.numberOfChannels, 3) assert.equal(ab.sampleRate, 44100) assert.equal(ab.length, 4) for (var i = 0; i < 3; i++) assert.ok(ab.getChannelData(i) instanceof Float32Array) assert.deepEqual(_.toArray(ab.getChannelData(0)), [1, 2, 3, 4]) assert.deepEqual(_.toArray(ab.getChannelData(1)), [11, 22, 33, 44]) assert.deepEqual(_.toArray(ab.getChannelData(2)), [111, 222, 333, 444]) }) it('should create an AudioBuffer from an array of Float32Array', function() { var array = [ new Float32Array([1, 2, 3, 4]), new Float32Array([11, 22, 33, 44]), new Float32Array([111, 222, 333, 444]) ] var ab = AudioBuffer.fromArray(array, 44100) assert.equal(ab.numberOfChannels, 3) assert.equal(ab.sampleRate, 44100) assert.equal(ab.length, 4) for (var i = 0; i < 3; i++) assert.ok(ab.getChannelData(i) instanceof Float32Array) assert.deepEqual(_.toArray(ab.getChannelData(0)), [1, 2, 3, 4]) assert.deepEqual(_.toArray(ab.getChannelData(1)), [11, 22, 33, 44]) assert.deepEqual(_.toArray(ab.getChannelData(2)), [111, 222, 333, 444]) }) }) describe('slice', function() { it('should slice properly all channels', function() { var sliced , ab = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], [111, 222, 333, 444, 555] ], 22050) slice = ab.slice(0) assert.equal(slice.length, 5) assert.equal(slice.numberOfChannels, 3) assert.equal(slice.sampleRate, 22050) assert.deepEqual(_.toArray(slice.getChannelData(0)), [1, 2, 3, 4, 5]) assert.deepEqual(_.toArray(slice.getChannelData(1)), [11, 22, 33, 44, 55]) assert.deepEqual(_.toArray(slice.getChannelData(2)), [111, 222, 333, 444, 555]) slice = ab.slice(3) assert.equal(slice.length, 2) assert.equal(slice.numberOfChannels, 3) assert.equal(slice.sampleRate, 22050) assert.deepEqual(_.toArray(slice.getChannelData(0)), [4, 5]) assert.deepEqual(_.toArray(slice.getChannelData(1)), [44, 55]) assert.deepEqual(_.toArray(slice.getChannelData(2)), [444, 555]) slice = ab.slice(1, 3) assert.equal(slice.length, 2) assert.equal(slice.numberOfChannels, 3) assert.equal(slice.sampleRate, 22050) assert.deepEqual(_.toArray(slice.getChannelData(0)), [2, 3]) assert.deepEqual(_.toArray(slice.getChannelData(1)), [22, 33]) assert.deepEqual(_.toArray(slice.getChannelData(2)), [222, 333]) }) it('should return the whole slice even of the slice end is to big', function() { var sliced , ab = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], [111, 222, 333, 444, 555] ], 22050) slice = ab.slice(3, 10) assert.equal(slice.length, 2) assert.equal(slice.numberOfChannels, 3) assert.equal(slice.sampleRate, 22050) assert.deepEqual(_.toArray(slice.getChannelData(0)), [4, 5]) assert.deepEqual(_.toArray(slice.getChannelData(1)), [44, 55]) assert.deepEqual(_.toArray(slice.getChannelData(2)), [444, 555]) }) }) describe('concat', function() { it('should concatenate 2 AudioBuffers with same sampleRate and numberOfChannels', function() { var ab1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], [111, 222, 333, 444, 555] ], 22050) , ab2 = AudioBuffer.fromArray([ [6, 7], [66, 77], [666, 777] ], 22050) , newAb newAb = ab1.concat(ab2) assert.equal(newAb.length, 7) assert.equal(newAb.numberOfChannels, 3) assert.equal(newAb.sampleRate, 22050) assert.deepEqual(_.toArray(newAb.getChannelData(0)), [1, 2, 3, 4, 5, 6, 7]) assert.deepEqual(_.toArray(newAb.getChannelData(1)), [11, 22, 33, 44, 55, 66, 77]) assert.deepEqual(_.toArray(newAb.getChannelData(2)), [111, 222, 333, 444, 555, 666, 777]) }) it('should throw an error if the AudioBuffers to concatenate are incompatible', function() { var ab1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], [111, 222, 333, 444, 555] ], 22050) , ab2 = AudioBuffer.fromArray([ [6, 7], [66, 77], [666, 777] ], 44100) assert.throws(function() { ab1.concat(ab2) }) ab1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], ], 22050) ab2 = AudioBuffer.fromArray([ [6, 7], [66, 77], [666, 777] ], 22050) assert.throws(function() { ab1.concat(ab2) }) }) }) describe('set', function() { it('should set audio buffer data, channel by channel', function() { var audioBuffer1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], ], 22050) , audioBuffer2 = AudioBuffer.fromArray([ [6, 7], [66, 77], ], 22050) audioBuffer1.set(audioBuffer2) assert.deepEqual(_.toArray(audioBuffer1.getChannelData(0)), [6, 7, 3, 4, 5]) assert.deepEqual(_.toArray(audioBuffer1.getChannelData(1)), [66, 77, 33, 44, 55]) }) it('should set audio buffer data, taking offset into account', function() { var audioBuffer1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], ], 22050) , audioBuffer2 = AudioBuffer.fromArray([ [6, 7], [66, 77], ], 22050) audioBuffer1.set(audioBuffer2, 2) assert.deepEqual(_.toArray(audioBuffer1.getChannelData(0)), [1, 2, 6, 7, 5]) assert.deepEqual(_.toArray(audioBuffer1.getChannelData(1)), [11, 22, 66, 77, 55]) }) it('should throw an error if the AudioBuffers to set are incompatible', function() { var ab1, ab2 ab1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], [111, 222, 333, 444, 555] ], 22050) ab2 = AudioBuffer.fromArray([ [6, 7], [66, 77], [666, 777] ], 44100) assert.throws(function() { ab1.set(ab2) }) ab1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], ], 22050) ab2 = AudioBuffer.fromArray([ [6, 7], [66, 77], [666, 777] ], 22050) assert.throws(function() { ab1.set(ab2) }) ab1 = AudioBuffer.fromArray([ [1, 2, 3, 4, 5], [11, 22, 33, 44, 55], ], 22050) ab2 = AudioBuffer.fromArray([ [6, 7, 8, 9, 10, 11], [66, 77, 88, 99, 1010, 1111] ], 22050) assert.throws(function() { ab1.set(ab2) }) }) }) })