diff --git a/src/nodes.jl b/src/nodes.jl index 7706dd7..d6bedbd 100644 --- a/src/nodes.jl +++ b/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 += node.phase node.phase = phase[end] - return sin(phase) + return sin(phase), true end #### AudioMixer #### @@ -41,9 +41,10 @@ function render(node::AudioMixer, device_input::AudioBuf, info::DeviceInfo) # calls mix_buffer = zeros(AudioSample, info.buf_size) 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 - return mix_buffer + return mix_buffer, true end #### 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))) end node.arr_index = range_end + 1 - return output + return output, true end #### AudioInput #### @@ -82,5 +83,5 @@ end function render(node::AudioInput, device_input::AudioBuf, info::DeviceInfo) @assert size(device_input, 1) == info.buf_size - return device_input[:, node.channel] + return device_input[:, node.channel], true end diff --git a/src/portaudio.jl b/src/portaudio.jl index 1aae5f4..22f0c8d 100644 --- a/src/portaudio.jl +++ b/src/portaudio.jl @@ -88,7 +88,8 @@ function portaudio_task(jl_filedesc::Integer, stream::PortAudioStream) jl_stream = fdio(jl_filedesc) jl_rawfd = RawFD(jl_filedesc) 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_callback_thread(out_array) # wait for new data to be available from the sound card (and for it to diff --git a/test/test_AudioIO.jl b/test/test_AudioIO.jl index 0819508..894f232 100644 --- a/test/test_AudioIO.jl +++ b/test/test_AudioIO.jl @@ -18,7 +18,8 @@ end # to simulate the audio callback that's normally called by the device. function process(stream::TestAudioStream) 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 diff --git a/test/test_nodes.jl b/test/test_nodes.jl index 4b0e295..d7f705f 100644 --- a/test/test_nodes.jl +++ b/test/test_nodes.jl @@ -11,7 +11,7 @@ end function AudioIO.render(node::TestNode, device_input::AudioIO.AudioBuf, info::AudioIO.DeviceInfo) - return AudioIO.AudioSample[1:info.buf_size] + return AudioIO.AudioSample[1:info.buf_size], true end #### AudioMixer Tests #### @@ -21,18 +21,22 @@ end info("Testing AudioMixer...") mix = AudioMixer() +render_output, active = AudioIO.render(mix, dev_input, test_info) @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() mix = AudioMixer([testnode]) +render_output, active = AudioIO.render(mix, dev_input, test_info) @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() -test2 = TestNode() -mix = AudioMixer([test1, test2]) -@test AudioIO.render(mix, dev_input, test_info) == 2 * AudioIO.AudioSample[1:test_info.buf_size] +mix = AudioMixer([TestNode(), TestNode()]) +render_output, active = AudioIO.render(mix, dev_input, test_info) +@test render_output == 2 * AudioIO.AudioSample[1:test_info.buf_size] +@test active info("Testing SinOSC...") freq = 440 @@ -41,5 +45,6 @@ t = linspace(1 / test_info.sample_rate, test_info.buf_size) test_vect = convert(AudioIO.AudioBuf, sin(2pi * t * freq)) osc = SinOsc(freq) -rendered = AudioIO.render(osc, dev_input, test_info) -@test_approx_eq(rendered, test_vect) +render_output, active = AudioIO.render(osc, dev_input, test_info) +@test_approx_eq(render_output, test_vect) +@test active