render alloc on ArrayPlayer down to 192bytes. can probably do better
This commit is contained in:
parent
66654d3aaf
commit
fab2f8ea8d
2 changed files with 10 additions and 8 deletions
16
src/nodes.jl
16
src/nodes.jl
|
@ -138,8 +138,9 @@ export Gain
|
||||||
type ArrayRenderer <: AudioRenderer
|
type ArrayRenderer <: AudioRenderer
|
||||||
arr::AudioBuf
|
arr::AudioBuf
|
||||||
arr_index::Int
|
arr_index::Int
|
||||||
|
buf::AudioBuf
|
||||||
|
|
||||||
ArrayRenderer(arr::AudioBuf) = new(arr, 1)
|
ArrayRenderer(arr::AudioBuf) = new(arr, 1, AudioSample[])
|
||||||
end
|
end
|
||||||
|
|
||||||
typealias ArrayPlayer AudioNode{ArrayRenderer}
|
typealias ArrayPlayer AudioNode{ArrayRenderer}
|
||||||
|
@ -147,13 +148,14 @@ ArrayPlayer(arr::AudioBuf) = ArrayPlayer(ArrayRenderer(arr))
|
||||||
export ArrayPlayer
|
export ArrayPlayer
|
||||||
|
|
||||||
function render(node::ArrayRenderer, device_input::AudioBuf, info::DeviceInfo)
|
function render(node::ArrayRenderer, device_input::AudioBuf, info::DeviceInfo)
|
||||||
# TODO: this should remove itself from the render tree when playback is
|
range_end = min(node.arr_index + info.buf_size-1, length(node.arr))
|
||||||
# complete
|
block_size = range_end - node.arr_index + 1
|
||||||
i = node.arr_index
|
if length(node.buf) != block_size
|
||||||
range_end = min(i + info.buf_size-1, length(node.arr))
|
resize!(node.buf, block_size)
|
||||||
output = node.arr[i:range_end]
|
end
|
||||||
|
copy!(node.buf, 1, node.arr, node.arr_index, block_size)
|
||||||
node.arr_index = range_end + 1
|
node.arr_index = range_end + 1
|
||||||
return output
|
return node.buf
|
||||||
end
|
end
|
||||||
|
|
||||||
# Allow users to play a raw array by wrapping it in an ArrayPlayer
|
# Allow users to play a raw array by wrapping it in an ArrayPlayer
|
||||||
|
|
|
@ -92,7 +92,6 @@ render_output = render(osc, dev_input, test_info)
|
||||||
@test mse(render_output,
|
@test mse(render_output,
|
||||||
expected[test_info.buf_size+1:2*test_info.buf_size]) < MSE_THRESH
|
expected[test_info.buf_size+1:2*test_info.buf_size]) < MSE_THRESH
|
||||||
# give a bigger budget here because we're rendering 2 nodes
|
# 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))
|
@test 500 > (@allocated render(osc, dev_input, test_info))
|
||||||
|
|
||||||
info("Testing ArrayPlayer...")
|
info("Testing ArrayPlayer...")
|
||||||
|
@ -102,6 +101,7 @@ render_output = render(player, dev_input, test_info)
|
||||||
@test render_output == v[1:test_info.buf_size]
|
@test render_output == v[1:test_info.buf_size]
|
||||||
render_output = render(player, dev_input, test_info)
|
render_output = render(player, dev_input, test_info)
|
||||||
@test render_output == v[(test_info.buf_size + 1) : (2*test_info.buf_size)]
|
@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)
|
stop(player)
|
||||||
render_output = render(player, dev_input, test_info)
|
render_output = render(player, dev_input, test_info)
|
||||||
@test render_output == AudioSample[]
|
@test render_output == AudioSample[]
|
||||||
|
|
Loading…
Reference in a new issue