adds ability to multiple AudioNodes. NEEDS TESTS

This commit is contained in:
Spencer Russell 2014-06-27 00:31:10 -05:00
parent 36c95f1a16
commit d5ae9237d6
2 changed files with 35 additions and 6 deletions

View file

@ -124,17 +124,45 @@ end
Base.push!(mixer::AudioMixer, node::AudioNode) = push!(mixer.renderer.inputs, node) Base.push!(mixer::AudioMixer, node::AudioNode) = push!(mixer.renderer.inputs, node)
#### Gain #### #### Gain ####
type GainRenderer <: AudioRenderer type GainRenderer{T<:Union(Float32, AudioNode)} <: AudioRenderer
in_node::AudioNode in1::AudioNode
gain::Float32 in2::T
buf::AudioBuf
GainRenderer(in1, in2) = new(in1, in2, AudioSample[])
end end
function render(node::GainRenderer, device_input::AudioBuf, info::DeviceInfo) function render(node::GainRenderer{Float32},
input = render(node.in_node, device_input, info)::AudioBuf device_input::AudioBuf,
return input .* node.gain info::DeviceInfo)
input = render(node.in1, device_input, info)::AudioBuf
if length(node.buf) != length(input)
resize!(node.buf, length(input))
end
for i in 1:length(input)
node.buf[i] = input[i] * node.in2
end
return node.buf
end
function render(node::GainRenderer{AudioNode},
device_input::AudioBuf,
info::DeviceInfo)
in1_data = render(node.in1, device_input, info)::AudioBuf
in2_data = render(node.in2, device_input, info)::AudioBuf
block_size = min(length(in1_data), length(in2_data))
if length(node.buf) != block_size
resize!(node.buf, block_size)
end
for i in 1:block_size
node.buf[i] = in1_data[i] * in2_data[i]
end
return node.buf
end end
typealias Gain AudioNode{GainRenderer} typealias Gain AudioNode{GainRenderer}
Gain(in1::AudioNode, in2::Real) = Gain(GainRenderer{Float32}(in1, in2))
Gain(in1::AudioNode, in2::AudioNode) = Gain(GainRenderer{AudioNode}(in1, in2))
export Gain export Gain
#### Offset #### #### Offset ####

View file

@ -1,5 +1,6 @@
*(node::AudioNode, coef::Real) = Gain(node, coef) *(node::AudioNode, coef::Real) = Gain(node, coef)
*(coef::Real, node::AudioNode) = Gain(node, coef) *(coef::Real, node::AudioNode) = Gain(node, coef)
*(node1::AudioNode, node2::AudioNode) = Gain(node1, node2)
# multiplying by silence gives silence # multiplying by silence gives silence
*(in1::NullNode, in2::NullNode) = in1 *(in1::NullNode, in2::NullNode) = in1
*(in1::AudioNode, in2::NullNode) = in2 *(in1::AudioNode, in2::NullNode) = in2