render alloc on ArrayPlayer down to 192bytes. can probably do better

This commit is contained in:
Spencer Russell 2014-06-25 22:51:25 -04:00
parent 66654d3aaf
commit fab2f8ea8d
2 changed files with 10 additions and 8 deletions

View file

@ -138,8 +138,9 @@ export Gain
type ArrayRenderer <: AudioRenderer
arr::AudioBuf
arr_index::Int
buf::AudioBuf
ArrayRenderer(arr::AudioBuf) = new(arr, 1)
ArrayRenderer(arr::AudioBuf) = new(arr, 1, AudioSample[])
end
typealias ArrayPlayer AudioNode{ArrayRenderer}
@ -147,13 +148,14 @@ ArrayPlayer(arr::AudioBuf) = ArrayPlayer(ArrayRenderer(arr))
export ArrayPlayer
function render(node::ArrayRenderer, device_input::AudioBuf, info::DeviceInfo)
# TODO: this should remove itself from the render tree when playback is
# complete
i = node.arr_index
range_end = min(i + info.buf_size-1, length(node.arr))
output = node.arr[i:range_end]
range_end = min(node.arr_index + info.buf_size-1, length(node.arr))
block_size = range_end - node.arr_index + 1
if length(node.buf) != block_size
resize!(node.buf, block_size)
end
copy!(node.buf, 1, node.arr, node.arr_index, block_size)
node.arr_index = range_end + 1
return output
return node.buf
end
# Allow users to play a raw array by wrapping it in an ArrayPlayer

View file

@ -92,7 +92,6 @@ render_output = render(osc, dev_input, test_info)
@test mse(render_output,
expected[test_info.buf_size+1:2*test_info.buf_size]) < MSE_THRESH
# give a bigger budget here because we're rendering 2 nodes
println("alloc: ", @allocated render(osc, dev_input, test_info))
@test 500 > (@allocated render(osc, dev_input, test_info))
info("Testing ArrayPlayer...")
@ -102,6 +101,7 @@ render_output = render(player, dev_input, test_info)
@test render_output == v[1:test_info.buf_size]
render_output = render(player, dev_input, test_info)
@test render_output == v[(test_info.buf_size + 1) : (2*test_info.buf_size)]
@test 200 > (@allocated render(player, dev_input, test_info))
stop(player)
render_output = render(player, dev_input, test_info)
@test render_output == AudioSample[]