refactor so render functions return an active flag

This commit is contained in:
Spencer Russell 2014-01-03 13:02:25 -08:00
parent 292005e1cd
commit 72fef9e4e1
4 changed files with 24 additions and 16 deletions

View file

@ -17,7 +17,7 @@ function render(node::SinOsc, device_input::AudioBuf, info::DeviceInfo)
phase = AudioSample[1:info.buf_size] * 2pi * node.freq / info.sample_rate phase = AudioSample[1:info.buf_size] * 2pi * node.freq / info.sample_rate
phase += node.phase phase += node.phase
node.phase = phase[end] node.phase = phase[end]
return sin(phase) return sin(phase), true
end end
#### AudioMixer #### #### AudioMixer ####
@ -41,9 +41,10 @@ function render(node::AudioMixer, device_input::AudioBuf, info::DeviceInfo)
# calls # calls
mix_buffer = zeros(AudioSample, info.buf_size) mix_buffer = zeros(AudioSample, info.buf_size)
for in_node in node.mix_inputs for in_node in node.mix_inputs
mix_buffer += render(in_node, device_input, info) in_buffer, active = render(in_node, device_input, info)
mix_buffer += in_buffer
end end
return mix_buffer return mix_buffer, true
end end
#### Array Player #### #### Array Player ####
@ -69,7 +70,7 @@ function render(node::ArrayPlayer, device_input::AudioBuf, info::DeviceInfo)
output = vcat(output, zeros(AudioSample, info.buf_size - length(output))) output = vcat(output, zeros(AudioSample, info.buf_size - length(output)))
end end
node.arr_index = range_end + 1 node.arr_index = range_end + 1
return output return output, true
end end
#### AudioInput #### #### AudioInput ####
@ -82,5 +83,5 @@ end
function render(node::AudioInput, device_input::AudioBuf, info::DeviceInfo) function render(node::AudioInput, device_input::AudioBuf, info::DeviceInfo)
@assert size(device_input, 1) == info.buf_size @assert size(device_input, 1) == info.buf_size
return device_input[:, node.channel] return device_input[:, node.channel], true
end end

View file

@ -88,7 +88,8 @@ function portaudio_task(jl_filedesc::Integer, stream::PortAudioStream)
jl_stream = fdio(jl_filedesc) jl_stream = fdio(jl_filedesc)
jl_rawfd = RawFD(jl_filedesc) jl_rawfd = RawFD(jl_filedesc)
while true while true
out_array = render(stream.mixer, in_array, stream.info)::AudioBuf # assume the root mixer is always active
out_array, _ = render(stream.mixer, in_array, stream.info)::AudioBuf
# wake the C code so it knows we've given it some more data # wake the C code so it knows we've given it some more data
wake_callback_thread(out_array) wake_callback_thread(out_array)
# wait for new data to be available from the sound card (and for it to # wait for new data to be available from the sound card (and for it to

View file

@ -18,7 +18,8 @@ end
# to simulate the audio callback that's normally called by the device. # to simulate the audio callback that's normally called by the device.
function process(stream::TestAudioStream) function process(stream::TestAudioStream)
in_array = zeros(AudioIO.AudioSample, stream.info.buf_size) in_array = zeros(AudioIO.AudioSample, stream.info.buf_size)
return AudioIO.render(stream.mixer, in_array, stream.info) out_array, _ = AudioIO.render(stream.mixer, in_array, stream.info)
return out_array
end end

View file

@ -11,7 +11,7 @@ end
function AudioIO.render(node::TestNode, function AudioIO.render(node::TestNode,
device_input::AudioIO.AudioBuf, device_input::AudioIO.AudioBuf,
info::AudioIO.DeviceInfo) info::AudioIO.DeviceInfo)
return AudioIO.AudioSample[1:info.buf_size] return AudioIO.AudioSample[1:info.buf_size], true
end end
#### AudioMixer Tests #### #### AudioMixer Tests ####
@ -21,18 +21,22 @@ end
info("Testing AudioMixer...") info("Testing AudioMixer...")
mix = AudioMixer() mix = AudioMixer()
render_output, active = AudioIO.render(mix, dev_input, test_info)
@test mix.mix_inputs == AudioIO.AudioNode[] @test mix.mix_inputs == AudioIO.AudioNode[]
@test AudioIO.render(mix, dev_input, test_info) == zeros(AudioIO.AudioSample, test_info.buf_size) @test render_output == zeros(AudioIO.AudioSample, test_info.buf_size)
@test active
testnode = TestNode() testnode = TestNode()
mix = AudioMixer([testnode]) mix = AudioMixer([testnode])
render_output, active = AudioIO.render(mix, dev_input, test_info)
@test mix.mix_inputs == AudioIO.AudioNode[testnode] @test mix.mix_inputs == AudioIO.AudioNode[testnode]
@test AudioIO.render(mix, dev_input, test_info) == AudioIO.AudioSample[1:test_info.buf_size] @test render_output == AudioIO.AudioSample[1:test_info.buf_size]
@test active
test1 = TestNode() mix = AudioMixer([TestNode(), TestNode()])
test2 = TestNode() render_output, active = AudioIO.render(mix, dev_input, test_info)
mix = AudioMixer([test1, test2]) @test render_output == 2 * AudioIO.AudioSample[1:test_info.buf_size]
@test AudioIO.render(mix, dev_input, test_info) == 2 * AudioIO.AudioSample[1:test_info.buf_size] @test active
info("Testing SinOSC...") info("Testing SinOSC...")
freq = 440 freq = 440
@ -41,5 +45,6 @@ t = linspace(1 / test_info.sample_rate,
test_info.buf_size) test_info.buf_size)
test_vect = convert(AudioIO.AudioBuf, sin(2pi * t * freq)) test_vect = convert(AudioIO.AudioBuf, sin(2pi * t * freq))
osc = SinOsc(freq) osc = SinOsc(freq)
rendered = AudioIO.render(osc, dev_input, test_info) render_output, active = AudioIO.render(osc, dev_input, test_info)
@test_approx_eq(rendered, test_vect) @test_approx_eq(render_output, test_vect)
@test active