I've been trying to make some more progress lately on the general-purpose sound processing and IO library I'm developing (yet unnamed). Here are a few of the things I've been working on:
- Filter Architecture: My engine is designed around audio processing objects called SoundFilters which act kind of like a VST or AU plugin. They provide a generic interface for processing input and output audio. I've recently reworked the class design to support multiple inputs and outputs per filter (which can themselves be any number of channels wide), and input and output names. Another addition has been an implementation of a generic parameter system. Filters subclass SoundFilter and override methods which provide an interface to generic-typed parameters. This allows filters to be used fully without knowing their actual type, similar to how generic parameters work on a VST or AU plugin. My system currently allows boolean, integer, float, and double-typed parameters.
- Threaded Recording: One thing I've noticed in Apple's Logic is its tendency to halt recording if the destination disk is too slow. I have added capabilities to my engine which allows it to transparently buffer data to a separate encoding thread which then writes the data to disk as it can. This keeps the disk or blocking I/O from blocking the audio rendering thread and allows more robust recording than Logic can provide. I was able to record 100 mono 24/44.1 wave files to disk in real time on my 7200rpm laptop drive.
- Digital Filter Design: I know very little about how to actually design IIR filters and implement them in DSP code, so I've been trying to learn all of the math that is necessary to understand filters. I'm working through a free online course at MIT: Signals and Systems. Hopefully I'll understand this stuff a lot more afterwards. I'm stuck on a few things in the library until I can get a good set of EQ filters done (HP, LP, HS, LS, Parametric).