allows under/over-flow warnings to be turned on and off

This commit is contained in:
Spencer Russell 2014-08-29 10:42:11 -04:00
parent f75de3299f
commit 9e02643482

View file

@ -47,14 +47,18 @@ portaudio_inited = false
type PortAudioStream <: AudioStream type PortAudioStream <: AudioStream
root::AudioMixer root::AudioMixer
info::DeviceInfo info::DeviceInfo
show_warnings::Bool
stream::PaStream stream::PaStream
function PortAudioStream(sample_rate::Integer=44100, buf_size::Integer=1024) function PortAudioStream(sample_rate::Integer=44100,
buf_size::Integer=1024,
show_warnings::Bool=false)
require_portaudio_init() require_portaudio_init()
stream = Pa_OpenDefaultStream(1, 1, paFloat32, sample_rate, buf_size) stream = Pa_OpenDefaultStream(1, 1, paFloat32, sample_rate, buf_size)
Pa_StartStream(stream) Pa_StartStream(stream)
root = AudioMixer() root = AudioMixer()
this = new(root, DeviceInfo(sample_rate, buf_size), stream) this = new(root, DeviceInfo(sample_rate, buf_size),
show_warnings, stream)
info("Scheduling PortAudio Render Task...") info("Scheduling PortAudio Render Task...")
# the task will actually start running the next time the current task yields # the task will actually start running the next time the current task yields
@schedule(portaudio_task(this)) @schedule(portaudio_task(this))
@ -88,7 +92,7 @@ function portaudio_task(stream::PortAudioStream)
while Pa_GetStreamReadAvailable(stream.stream) < n while Pa_GetStreamReadAvailable(stream.stream) < n
sleep(0.005) sleep(0.005)
end end
Pa_ReadStream(stream.stream, buffer, n) Pa_ReadStream(stream.stream, buffer, n, stream.show_warnings)
# assume the root is always active # assume the root is always active
rendered = render(stream.root.renderer, buffer, stream.info)::AudioBuf rendered = render(stream.root.renderer, buffer, stream.info)::AudioBuf
for i in 1:length(rendered) for i in 1:length(rendered)
@ -100,7 +104,7 @@ function portaudio_task(stream::PortAudioStream)
while Pa_GetStreamWriteAvailable(stream.stream) < n while Pa_GetStreamWriteAvailable(stream.stream) < n
sleep(0.005) sleep(0.005)
end end
Pa_WriteStream(stream.stream, buffer, n) Pa_WriteStream(stream.stream, buffer, n, stream.show_warnings)
end end
catch ex catch ex
warn("Audio Task died with exception: $ex") warn("Audio Task died with exception: $ex")
@ -206,21 +210,23 @@ function Pa_GetStreamWriteAvailable(stream::PaStream)
avail avail
end end
function Pa_ReadStream(stream::PaStream, buf::Array, frames::Integer=length(buf)) function Pa_ReadStream(stream::PaStream, buf::Array, frames::Integer=length(buf),
show_warnings::Bool=true)
frames <= length(buf) || error("Need a buffer at least $frames long") frames <= length(buf) || error("Need a buffer at least $frames long")
err = ccall((:Pa_ReadStream, libportaudio), PaError, err = ccall((:Pa_ReadStream, libportaudio), PaError,
(PaStream, Ptr{Void}, Culong), (PaStream, Ptr{Void}, Culong),
stream, buf, frames) stream, buf, frames)
handle_status(err) handle_status(err, show_warnings)
buf buf
end end
function Pa_WriteStream(stream::PaStream, buf::Array, frames::Integer=length(buf)) function Pa_WriteStream(stream::PaStream, buf::Array, frames::Integer=length(buf),
show_warnings::Bool=true)
frames <= length(buf) || error("Need a buffer at least $frames long") frames <= length(buf) || error("Need a buffer at least $frames long")
err = ccall((:Pa_WriteStream, libportaudio), PaError, err = ccall((:Pa_WriteStream, libportaudio), PaError,
(PaStream, Ptr{Void}, Culong), (PaStream, Ptr{Void}, Culong),
stream, buf, frames) stream, buf, frames)
handle_status(err) handle_status(err, show_warnings)
nothing nothing
end end
@ -241,11 +247,13 @@ function Pa_OpenDefaultStream(inChannels::Integer, outChannels::Integer,
streamPtr[1] streamPtr[1]
end end
function handle_status(err::PaError) function handle_status(err::PaError, show_warnings::Bool=true)
if err == PA_OUTPUT_UNDERFLOWED || err == PA_INPUT_OVERFLOWED if err == PA_OUTPUT_UNDERFLOWED || err == PA_INPUT_OVERFLOWED
if show_warnings
msg = ccall((:Pa_GetErrorText, libportaudio), msg = ccall((:Pa_GetErrorText, libportaudio),
Ptr{Cchar}, (PaError,), err) Ptr{Cchar}, (PaError,), err)
warn("libportaudio: " * bytestring(msg)) warn("libportaudio: " * bytestring(msg))
end
elseif err != PA_NO_ERROR elseif err != PA_NO_ERROR
msg = ccall((:Pa_GetErrorText, libportaudio), msg = ccall((:Pa_GetErrorText, libportaudio),
Ptr{Cchar}, (PaError,), err) Ptr{Cchar}, (PaError,), err)