2013-12-23 00:06:02 +01:00
|
|
|
using Base.Test
|
2014-01-03 16:41:00 +01:00
|
|
|
using AudioIO
|
2013-12-23 00:06:02 +01:00
|
|
|
|
2014-01-03 16:41:00 +01:00
|
|
|
test_info = AudioIO.DeviceInfo(44100, 512)
|
|
|
|
dev_input = zeros(AudioIO.AudioSample, test_info.buf_size)
|
2013-12-23 00:06:02 +01:00
|
|
|
|
|
|
|
# A TestNode just renders out 1:buf_size each frame
|
2014-01-03 16:41:00 +01:00
|
|
|
type TestNode <: AudioIO.AudioNode
|
2014-01-06 04:50:56 +01:00
|
|
|
active::Bool
|
2014-01-22 16:46:54 +01:00
|
|
|
deactivate_cond::Condition
|
2014-01-06 04:50:56 +01:00
|
|
|
|
|
|
|
function TestNode()
|
2014-01-22 16:46:54 +01:00
|
|
|
return new(false, Condition())
|
2014-01-06 04:50:56 +01:00
|
|
|
end
|
2013-12-23 00:06:02 +01:00
|
|
|
end
|
|
|
|
|
2014-01-03 16:41:00 +01:00
|
|
|
function AudioIO.render(node::TestNode,
|
|
|
|
device_input::AudioIO.AudioBuf,
|
|
|
|
info::AudioIO.DeviceInfo)
|
2014-01-06 04:50:56 +01:00
|
|
|
return AudioIO.AudioSample[1:info.buf_size], node.active
|
2013-12-23 00:06:02 +01:00
|
|
|
end
|
|
|
|
|
|
|
|
#### AudioMixer Tests ####
|
|
|
|
|
|
|
|
# TODO: there should be a setup/teardown mechanism and some way to isolate
|
|
|
|
# tests
|
|
|
|
|
2013-12-30 10:31:54 +01:00
|
|
|
info("Testing AudioMixer...")
|
2013-12-23 00:06:02 +01:00
|
|
|
mix = AudioMixer()
|
2014-01-03 22:02:25 +01:00
|
|
|
render_output, active = AudioIO.render(mix, dev_input, test_info)
|
|
|
|
@test render_output == zeros(AudioIO.AudioSample, test_info.buf_size)
|
2013-12-23 00:06:02 +01:00
|
|
|
|
|
|
|
testnode = TestNode()
|
|
|
|
mix = AudioMixer([testnode])
|
2014-01-03 22:02:25 +01:00
|
|
|
render_output, active = AudioIO.render(mix, dev_input, test_info)
|
|
|
|
@test render_output == AudioIO.AudioSample[1:test_info.buf_size]
|
2013-12-23 00:06:02 +01:00
|
|
|
|
2014-01-06 04:50:56 +01:00
|
|
|
test1 = TestNode()
|
|
|
|
test2 = TestNode()
|
|
|
|
mix = AudioMixer([test1, test2])
|
2014-01-03 22:02:25 +01:00
|
|
|
render_output, active = AudioIO.render(mix, dev_input, test_info)
|
2014-01-06 04:50:56 +01:00
|
|
|
# make sure the two inputs are being added together
|
2014-01-03 22:02:25 +01:00
|
|
|
@test render_output == 2 * AudioIO.AudioSample[1:test_info.buf_size]
|
2014-01-06 04:50:56 +01:00
|
|
|
|
|
|
|
# now we'll stop one of the inputs and make sure it gets removed
|
|
|
|
# TODO: this test should depend on the render output, not on the internals of
|
|
|
|
# the mixer
|
|
|
|
stop(test1)
|
|
|
|
AudioIO.render(mix, dev_input, test_info)
|
|
|
|
@test !in(test1, mix.mix_inputs)
|
2013-12-23 00:06:02 +01:00
|
|
|
|
2014-01-03 22:32:30 +01:00
|
|
|
stop(mix)
|
|
|
|
render_output, active = AudioIO.render(mix, dev_input, test_info)
|
|
|
|
@test !active
|
|
|
|
|
2013-12-30 12:29:43 +01:00
|
|
|
info("Testing SinOSC...")
|
|
|
|
freq = 440
|
|
|
|
t = linspace(1 / test_info.sample_rate,
|
|
|
|
test_info.buf_size / test_info.sample_rate,
|
|
|
|
test_info.buf_size)
|
2014-01-03 16:41:00 +01:00
|
|
|
test_vect = convert(AudioIO.AudioBuf, sin(2pi * t * freq))
|
2013-12-30 12:29:43 +01:00
|
|
|
osc = SinOsc(freq)
|
2014-01-03 22:02:25 +01:00
|
|
|
render_output, active = AudioIO.render(osc, dev_input, test_info)
|
|
|
|
@test_approx_eq(render_output, test_vect)
|
2014-01-03 22:32:30 +01:00
|
|
|
stop(osc)
|
|
|
|
render_output, active = AudioIO.render(osc, dev_input, test_info)
|
|
|
|
@test !active
|
|
|
|
|
|
|
|
info("Testing ArrayPlayer...")
|
|
|
|
v = rand(AudioIO.AudioSample, 44100)
|
|
|
|
player = ArrayPlayer(v)
|
2014-01-06 04:50:56 +01:00
|
|
|
player.active = true
|
2014-01-03 22:32:30 +01:00
|
|
|
render_output, active = AudioIO.render(player, dev_input, test_info)
|
|
|
|
@test render_output == v[1:test_info.buf_size]
|
|
|
|
@test active
|
|
|
|
render_output, active = AudioIO.render(player, dev_input, test_info)
|
|
|
|
@test render_output == v[(test_info.buf_size + 1) : (2*test_info.buf_size)]
|
|
|
|
@test active
|
|
|
|
stop(player)
|
|
|
|
render_output, active = AudioIO.render(player, dev_input, test_info)
|
|
|
|
@test !active
|
|
|
|
|
|
|
|
# give a vector just a bit larger than 1 buffer size
|
|
|
|
v = rand(AudioIO.AudioSample, test_info.buf_size + 1)
|
|
|
|
player = ArrayPlayer(v)
|
2014-01-06 04:50:56 +01:00
|
|
|
player.active = true
|
2014-01-03 22:32:30 +01:00
|
|
|
_, active = AudioIO.render(player, dev_input, test_info)
|
|
|
|
@test active
|
|
|
|
_, active = AudioIO.render(player, dev_input, test_info)
|
|
|
|
@test !active
|