Update portaudio.jl
Add methods to use audio streams other than the default output stream
This commit is contained in:
parent
9c23d02066
commit
3f90e3c907
1 changed files with 22 additions and 18 deletions
|
@ -105,7 +105,7 @@ function Pa_OpenStream(device::PaDeviceIndex,
|
||||||
Ptr{Void}(0))
|
Ptr{Void}(0))
|
||||||
if input
|
if input
|
||||||
err = ccall((:Pa_OpenStream, libportaudio), PaError,
|
err = ccall((:Pa_OpenStream, libportaudio), PaError,
|
||||||
(Ptr{PaStream}, Ref{Pa_StreamParameters}, Ptr{Void},
|
(PaStream, Ref{Pa_StreamParameters}, Ptr{Void},
|
||||||
Cdouble, Culong, Culong,
|
Cdouble, Culong, Culong,
|
||||||
Ptr{PaStreamCallback}, Ptr{Void}),
|
Ptr{PaStreamCallback}, Ptr{Void}),
|
||||||
streamPtr, ioParameters, Ptr{Void}(0),
|
streamPtr, ioParameters, Ptr{Void}(0),
|
||||||
|
@ -113,7 +113,7 @@ function Pa_OpenStream(device::PaDeviceIndex,
|
||||||
Ptr{PaStreamCallback}(0), Ptr{Void}(0))
|
Ptr{PaStreamCallback}(0), Ptr{Void}(0))
|
||||||
else
|
else
|
||||||
err = ccall((:Pa_OpenStream, libportaudio), PaError,
|
err = ccall((:Pa_OpenStream, libportaudio), PaError,
|
||||||
(Ptr{PaStream}, Ptr{Void}, Ref{Pa_StreamParameters},
|
(PaStream, Ptr{Void}, Ref{Pa_StreamParameters},
|
||||||
Cdouble, Culong, Culong,
|
Cdouble, Culong, Culong,
|
||||||
Ptr{PaStreamCallback}, Ptr{Void}),
|
Ptr{PaStreamCallback}, Ptr{Void}),
|
||||||
streamPtr, Ptr{Void}(0), ioParameters,
|
streamPtr, Ptr{Void}(0), ioParameters,
|
||||||
|
@ -130,11 +130,8 @@ type Pa_AudioStream <: AudioStream
|
||||||
show_warnings::Bool
|
show_warnings::Bool
|
||||||
stream::PaStream
|
stream::PaStream
|
||||||
sformat::PaSampleFormat
|
sformat::PaSampleFormat
|
||||||
# NOTE: SharedArray is broken under Windows in the initial v0.40
|
sbuffer::Array{Real}
|
||||||
# but later development versions may have corrected this
|
parent_may_use_buffer::Bool
|
||||||
# this is only used by the input stream subprocess currently
|
|
||||||
sbuffer::SharedArray
|
|
||||||
parent_working::Bool
|
|
||||||
|
|
||||||
function Pa_AudioStream(device_index, channels=2, input=false,
|
function Pa_AudioStream(device_index, channels=2, input=false,
|
||||||
sample_rate::Integer=44100,
|
sample_rate::Integer=44100,
|
||||||
|
@ -151,11 +148,10 @@ type Pa_AudioStream <: AudioStream
|
||||||
Pa_StartStream(stream)
|
Pa_StartStream(stream)
|
||||||
root = AudioMixer()
|
root = AudioMixer()
|
||||||
datatype = PaSampleFormat_to_T(sample_format)
|
datatype = PaSampleFormat_to_T(sample_format)
|
||||||
sbuf = SharedArray(datatype, framesPerBuffer)
|
sbuf = ones(datatype, framesPerBuffer)
|
||||||
this = new(root, DeviceInfo(sample_rate, framesPerBuffer),
|
this = new(root, DeviceInfo(sample_rate, framesPerBuffer),
|
||||||
show_warnings, stream, sample_format, sbuf, false)
|
show_warnings, stream, sample_format, sbuf, false)
|
||||||
info("Scheduling PortAudio Render Task...")
|
info("Scheduling PortAudio Render Task...")
|
||||||
# the task will actually start running the next time the current task yields
|
|
||||||
if input
|
if input
|
||||||
@schedule(pa_input_task(this))
|
@schedule(pa_input_task(this))
|
||||||
else
|
else
|
||||||
|
@ -216,26 +212,34 @@ function PaSampleFormat_to_T(fmt::PaSampleFormat)
|
||||||
elseif fmt == 32
|
elseif fmt == 32
|
||||||
retval = UInt8(0x20)
|
retval = UInt8(0x20)
|
||||||
else
|
else
|
||||||
info("Flawed input to PaSampleFormat_to_primitive")
|
info("Flawed input to PaSampleFormat_to_T, primitive unknown")
|
||||||
end
|
end
|
||||||
typeof(retval)
|
typeof(retval)
|
||||||
end
|
end
|
||||||
|
|
||||||
function pa_input_task(stream::Pa_AudioStream)
|
function pa_input_task(strm::Pa_AudioStream)
|
||||||
#=
|
#=
|
||||||
Get input device data, pass as SharedArray, no rendering
|
Get input device data, pass as a producer, no rendering
|
||||||
=#
|
=#
|
||||||
info("PortAudio Input Task Running...")
|
info("PortAudio Input Task Running...")
|
||||||
n = bufsize(stream)
|
n = bufsize(strm)
|
||||||
|
datatype = PaSampleFormat_to_T(strm.sformat)
|
||||||
|
# bigger ccall buffer to avoid overflow related errorss
|
||||||
|
buffer = zeros(datatype, n * 8)
|
||||||
try
|
try
|
||||||
while true
|
while true
|
||||||
while ((Pa_GetStreamReadAvailable(stream.stream) < n ) |
|
while Pa_GetStreamReadAvailable(strm.stream) < n
|
||||||
stream.parent_working)
|
|
||||||
sleep(0.005)
|
sleep(0.005)
|
||||||
end
|
end
|
||||||
Pa_ReadStream(stream.stream, sdata(stream.sbuffer), n,
|
while strm.parent_may_use_buffer
|
||||||
stream.show_warnings)
|
sleep(0.005)
|
||||||
stream.parent_working = true
|
end
|
||||||
|
err = ccall((:Pa_ReadStream, libportaudio), PaError,
|
||||||
|
(Ptr{PaStream}, Ptr{Void}, Culong),
|
||||||
|
strm.stream, buffer, n)
|
||||||
|
handle_status(err, strm.show_warnings)
|
||||||
|
strm.sbuffer[1: n] = buffer[1: n]
|
||||||
|
strm.parent_may_use_buffer = true
|
||||||
sleep(0.005)
|
sleep(0.005)
|
||||||
end
|
end
|
||||||
catch ex
|
catch ex
|
||||||
|
|
Loading…
Reference in a new issue