CamillaDSP - Cross-platform IIR and FIR engine for crossovers, room correction etc.

The solution I have in mind for dither is to implement it as a filter (one that only makes sense to have as the last step of the pipeline). It would accept a bunch of parameters, like target bit depth and filter choice. I'll probably start simple with only one filter.


For running on a mac I need some help. I don't have any macs around and I have no idea of how sound works on that platform. I guess Alsa and PulseAudio aren't available, but what is?
 
Well, some people seen to think otherwise. I myself cannot comment on that as I never heard it in action. Would be nice to try it though and try to hear the difference. As Henrik might implement the dither algorithm it would probably be easy to add a parameter with the number of bits to dither to.

My gut feeling tells me the same btw - that dither at 24 bits is probably down in the noise.
 
Hi here :)

Lately i had been reading a lot about DRC stuff, finding it very interesting and for me a must try also i guess. I'am new into digital filtering and software optimising room correction stuff, so please bare with me if you think some quistions are to light.
My stereo in a midsize livingroom (all diy except speakers) is used as follows : i have all my old cd's on a NAS, where the Logitech media server (LMS) also resides for now. On the LMS i have "plugins" for Tidal / Qobus and Paradise radio etc... I mostly stream. The stream is feed into via Picoreplayer (Squeezelite) on a RPI 3B+ into an USB Amanero DAC, then preamp and last my poweramp, so pretty normal for 2020 i guess.
Also i would like to tell that i ordered the UMIK-1 usb mic. the other day, waiting for it to arrive within the next few day's.
I plan to if possible to run the DRC filters on an Raspberry Pi 4 (4Gb), and have digital filters/room correction applied in realtime for if possible all rates (44.1Khz... 192Khz...)

So, after i read a lot for day's as i wrote i tried to install the LMS on my RPI4 along with BrutefirDRC (plugin for lms which should do realtime DRC) for having some more computerpower than my old NAS have.
The BrutefirDrc plugin was not the easiest part to get running, but without any special filters i got it up and running partially.

I hope it is possible to have Camilladsp within this chain somehow, but not sure how; this is ofcause depending on if i can make it run on the RPI.

So, finding it hard to find information on the net about the hole process, i hope someone can help clear out if this is the right way to handle such Room correction setup ?
(Not specific.)

1. Setup a mic. on software which measure impulses etc... from the room (e.g. REW / roomeqwizard).
2. Take measurements on left spk., right spk.. and export the data into another program which can generate FIR & IIR filters (one for each samplerate i guess?)
3. Load the filters on the convolver (Camilladsp in this case) and stream / play my music through the hole chain in realtime.

Rgds; Jesper.
 
Compiling on the PI

Hi Henrik.

Donno if you tried to compile your'e Camilla on the PI yet ? (Raspberry Pi)

I got those two errors ::

Compiling alsa-sys v0.2.0
Compiling quote v1.0.2
warning: redundant linker flag specified for library `pulse`

Compiling signal-hook-registry v1.2.0
Compiling libpulse-binding v2.15.0
warning: redundant linker flag specified for library `pulse-simple`

Compiling signal-hook v0.1.13
Compiling rustfft v3.0.1
Compiling libpulse-simple-binding v2.15.0
Compiling alsa v0.4.1
Compiling serde_derive v1.0.104
Compiling serde_yaml v0.8.11
Compiling camilladsp v0.0.5 (/home/pi/camilladsp)
error[E0308]: mismatched types
--> src/alsadevice.rs:112:29
|
112 | hwp.set_buffer_size(bufsize)?;
| ^^^^^^^ expected i32, found i64

error[E0308]: mismatched types
--> src/alsadevice.rs:113:29
|
113 | hwp.set_period_size(bufsize / 8, alsa::ValueOr::Nearest)?;
| ^^^^^^^^^^^ expected i32, found i64

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0308`.
error: Could not compile `camilladsp`.

Maybe you know howto handle it ?

Rgds; Jesper.
 
Hi here :)

Lately i had been reading a lot about DRC stuff, finding it very interesting and for me a must try also i guess. I'am new into digital filtering and software optimising room correction stuff, so please bare with me if you think some quistions are to light.
My stereo in a midsize livingroom (all diy except speakers) is used as follows : i have all my old cd's on a NAS, where the Logitech media server (LMS) also resides for now. On the LMS i have "plugins" for Tidal / Qobus and Paradise radio etc... I mostly stream. The stream is feed into via Picoreplayer (Squeezelite) on a RPI 3B+ into an USB Amanero DAC, then preamp and last my poweramp, so pretty normal for 2020 i guess.
Also i would like to tell that i ordered the UMIK-1 usb mic. the other day, waiting for it to arrive within the next few day's.
I plan to if possible to run the DRC filters on an Raspberry Pi 4 (4Gb), and have digital filters/room correction applied in realtime for if possible all rates (44.1Khz... 192Khz...)

So, after i read a lot for day's as i wrote i tried to install the LMS on my RPI4 along with BrutefirDRC (plugin for lms which should do realtime DRC) for having some more computerpower than my old NAS have.
The BrutefirDrc plugin was not the easiest part to get running, but without any special filters i got it up and running partially.

I hope it is possible to have Camilladsp within this chain somehow, but not sure how; this is ofcause depending on if i can make it run on the RPI.

So, finding it hard to find information on the net about the hole process, i hope someone can help clear out if this is the right way to handle such Room correction setup ?
(Not specific.)

1. Setup a mic. on software which measure impulses etc... from the room (e.g. REW / roomeqwizard).
2. Take measurements on left spk., right spk.. and export the data into another program which can generate FIR & IIR filters (one for each samplerate i guess?)
3. Load the filters on the convolver (Camilladsp in this case) and stream / play my music through the hole chain in realtime.

Rgds; Jesper.
I think a RPi 4 should handle this fine, but I haven't actually tried that. Where in your chain do you want to place the new Pi? Instead of the 3+?
You can use RePhase for making the impulse response. It seems quite popular. It's a windows program, but I think you can run it under wine. REW is very nice for doing measurements, but not sure if it can help with making impulse responses. I just make my filters with a messy old Matlab script. Some day I will rewrite it in Python and make it nice.



I actually do my room corrrection with a few IIR filters, since I didn't really like the sound with a "perfect" correction with a long FIR filter. I just use peaking filters to tame the worst resonances. I use FIR only for the crossover.



Switching sample rate in CamillaDSP (or BruteFIR) needs a full restart of the service. You need separate impulse responses, and separate config files for each sample rate. I simply run 44.1kHz all the time, since that matches all the material I care about. I'm fine with getting TV-series and movies resampled.
 
Henrik i tried another compile after getting the "pi" branch, but it triggers a new error now, sure we/you can fix it :p

Compiling yaml-rust v0.4.3
warning: redundant linker flag specified for library `pulse`

Compiling signal-hook-registry v1.2.0
Compiling quote v1.0.3
Compiling libpulse-binding v2.15.0
warning: redundant linker flag specified for library `pulse-simple`

Compiling rustfft v3.0.1
Compiling signal-hook v0.1.13
Compiling libpulse-simple-binding v2.15.0
Compiling alsa v0.4.1
Compiling serde_derive v1.0.104
Compiling serde_yaml v0.8.11
Compiling camilladsp v0.0.5 (/home/pi/camilladsp)
error[E0502]: cannot borrow `**filter` as immutable because it is also borrowed as mutable
--> src/filters.rs:83:57
|
83 | filter.update_parameters(filterconfigs[&filter.name()].clone());
| ------ ^^^^^^ - mutable borrow ends here
| | |
| mutable borrow occurs here immutable borrow occurs here

error[E0502]: cannot borrow `mix.name` as immutable because `*mix` is also borrowed as mutable
--> src/filters.rs:144:60
|
144 | mix.update_parameters(conf.mixers[&mix.name].clone());
| --- ^^^^^^^^ - mutable borrow ends here
| | |
| mutable borrow occurs here immutable borrow occurs here

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0502`.
error: Could not compile `camilladsp`.

Jesper.

Btw: The other quistions, i will retake when we have the Pi up and running :)