allows under/over-flow warnings to be turned on and off
This commit is contained in:
parent
f75de3299f
commit
9e02643482
1 changed files with 20 additions and 12 deletions
|
@ -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
|
||||||
msg = ccall((:Pa_GetErrorText, libportaudio),
|
if show_warnings
|
||||||
Ptr{Cchar}, (PaError,), err)
|
msg = ccall((:Pa_GetErrorText, libportaudio),
|
||||||
warn("libportaudio: " * bytestring(msg))
|
Ptr{Cchar}, (PaError,), err)
|
||||||
|
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)
|
||||||
|
|
Loading…
Reference in a new issue