Update portaudio.jl

Add methods to use audio streams other than the default output stream
This commit is contained in:
Bill 2015-11-01 22:55:55 -10:00
parent 9c23d02066
commit 3f90e3c907

View file

@ -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