Hey there, Julians.

So AudioIO has been languishing for some time now, and I’ve been busily working 
away at the next generation. One of the issues with AudioIO is that it was a 
lot to swallow if you just wanted to play or record some audio. I’ve been 
focusing on getting the fundamental APIs right, so that the fancy stuff can be 
built on top.

There’s a new JuliaAudio <https://github.com/JuliaAudio> organization and 5 
shiny new packages. They’re still pretty young, but most of them have good test 
coverage. I’m planning on registering to METADATA soon, but I wanted to solicit 
some feedback first.

SampleTypes.jl <https://github.com/JuliaAudio/SampleTypes.jl> is the most 
important as it defines the architecture that glues together the rest of the 
packages. It defines a set of stream and buffer types that should make it easy 
to move sampled data around. It’s called SampleTypes instead of AudioTypes 
because it should be useful for any sort of regularly-sampled, multi-channel 
data (e.g. complex samples from an SDR, multi-channel EEG, etc.). The types are 
sample-rate aware, and the samplerate can be stored in real units using 
SIUnits.jl. That allows cool features like reading in data using seconds 
instead of samples. 

Part of the idea with SampleTypes is to make it really easy to plug in a 
streaming audio backend, for instance SampleTypes handles conversion between 
formats, channel counts, and sample rates (currently just linear 
interpolation), so the underlying device libraries don’t have to. SampleBuf 
(the buffer type) is an AbstractArray, and it should be pretty drop-in 
replaceable to normal Arrays, but with extra goodies. If there are cases where 
it doesn’t act like an Array please file an Issue.

LibSndFile.jl <https://github.com/JuliaAudio/LibSndFile.jl> and PortAudio.jl 
<https://github.com/JuliaAudio/PortAudio.jl> used to be part of AudioIO, but 
are now separate packages. They wrap well-established cross-platform C 
libraries for interacting with files and real-time audio devices, respectively.

LibSndFile has been designed to work with FileIO, so loading a file is as easy 
at `load(“myfile.wav”)` and it will figure out the format from the extension 
and magic bytes in the file header.

PortAudio.jl has been massively simplified from what was in AudioIO. Test 
coverage is at 95%, but because PortAudio doesn’t provide a way to simulate 
input the tests aren’t very strong. They also don’t run on Travis.

JACKAudio.jl <https://github.com/JuliaAudio/JACKAudio.jl> is a wrapper for 
libjack, a great audio routing tool designed for low-latency, pro audio 
applications. Unfortunately we’re not yet at the point where we can get super 
low latency from Julia, but it’s working pretty well now and I think there’s 
still room to tune it for better performance.

RingBuffers.jl <https://github.com/JuliaAudio/RingBuffers.jl> is a small 
utility package that provides the RingBuffer type. It’s a fixed-size 
multi-channel circular ringbuffer with configurable overflow/underflow 
behavior. It uses normal Arrays and is not specific to this architecture, 
except that is assumes each channel of data is a column of a 2D Array.

Here’s a screenshot from the PortAudio README that gives a good flavor for the 
sort of things these packages can do together:



Please kick the tires and let me know what doesn’t work or is confusing. Also, 
if you maintain an audio-related package and want to plug into this 
architecture, I’d be happy to start growing the JuliaAudio organization both in 
maintainers and packages.

-s

Reply via email to