[I still have not verified the filter, sorry] 2013/3/19 Justin Chudgar <justin at justinzane.com>: > I've created a module to ensure that only low frequencies are sent to devices > at the end of an "lfe"/"subwoofer" channel. This module allows the user to > select the master channel, the low pass cutoff frequency (aka corner freq, -3dB > freq) and the number of filter poles. There is a problem with rewinds. You seem to completely reset the filter on any rewind. The expected idea is that PulseAudio tells your module this: "please forget that I just sent you X milliseconds of audio", with the intention to send different audio in order to account for a (failed e.g. due to a new event sound) speculative mix-ahead. X milliseconds ago, your filter had non-zeros in monopole_data and biquad_data, and you are completely zeroing that out. "Click!" I'm afraid that, with any IIR filter, you either have to say "rewinds are not supported at all", or store the full history of monopole_data and biquad_data for the duration of the maximum possible rewind. Also I don't think that bqdt initialization is correct. You are declaring the structure on-stack in pa__init() and then assigning the address of that on-stack structure to the fields of a long-living userdata object. -- Alexander E. Patrakov