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