From fab2f8ea8de9e603c75b4cf8b07fedc5f0da405e Mon Sep 17 00:00:00 2001 From: Spencer Russell Date: Wed, 25 Jun 2014 22:51:25 -0400 Subject: [PATCH] render alloc on ArrayPlayer down to 192bytes. can probably do better --- src/nodes.jl | 16 +++++++++------- test/test_nodes.jl | 2 +- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/nodes.jl b/src/nodes.jl index f4f5002..e503884 100644 --- a/src/nodes.jl +++ b/src/nodes.jl @@ -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 diff --git a/test/test_nodes.jl b/test/test_nodes.jl index 9b6a1dc..3167be8 100644 --- a/test/test_nodes.jl +++ b/test/test_nodes.jl @@ -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[]