refactor so render functions return an active flag
This commit is contained in:
parent
292005e1cd
commit
72fef9e4e1
4 changed files with 24 additions and 16 deletions
11
src/nodes.jl
11
src/nodes.jl
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue