Please review the site Rules, Terms of Service, and Privacy Policy at your convenience. Rules, TOS, Privacy
Get familiar with the reaction system: Introducing the Reaction System

DSP Crossover software using the GSASysCon app

I thought I would cross post here about the release of my DSP software. The main thread is at DIYaudio where I plan do most of the follow up, but you are welcome to contact me here as well. In case anyone is interested in getting into software DSP for DIY crossover work, this is what I have been using for many years. It's relatively easy to set up and get going with, but is limited to Linux OSes. The hardware required is a small/cheap computer (R-Pi works great, or an old PC, etc) and an audio interface or multichannel DAC. It's the DAC that is primarily responsible for sound quality, and you can start with something cheap and then upgrade later when ever you wish.

Link to thread and download info at DIYaudio: https://www.diyaudio.com/community/threads/software-dsp-processing-using-gstreamer-pipelines-and-the-gsasyscon-app.424146/

INTRO:
During the past 10 years I have been using Gstreamer pipelines plus my LADSPA plugins to implement software based IIR DSP processing. I find this approach much easier to configure and use than CamillaDSP so I would like to share this with the rest of the DIY community.

Gstreamer is a powerful multi-media platform that is continually undergoing development and improvement. Because Gstreamer pipelines are difficult to write from scratch, I wrote an application that generates them based on the contents of a user input file that describes the DSP processing. The application consists of a couple of input files and a large bash script (currently about 3000 lines long). The app will also launch and kill the pipelines when directed by you, and basic in-app volume control of local devices is available. Together these can be used to turn your computer into a “preamp” with input switching and volume control plus everything you need to do DSP processing. I use this to run all my own systems.

The app has the name “Gstreamer Streaming Audio System Controller”, or GSASysCon. GSASysCon is completely open source and you are welcome to modify or develop it.

Here is a quick overview of the behavior and features:

• Control of and Interaction with the program is 100% text based via simple input files and a text-based user-interface.
• Substitution and channel duplication capabilities make it easy to describe the DSP processing for complicated, multichannel setups.
• Filtering and routing is easy to configure via an intuitive configuration file structure
• The control interface can turn systems on and off and control playback volume. These features can be controlled remotely over your LAN via SSH.
• Gstreamer provides several source and sink TIME (not rate) based synchronization mechanisms. This makes it possible for synchronized playback of multiple, disparate sinks and adaptive rate playback.
• Can be run under Debian/Ubuntu based OSes (including Rasberry Pi OS) or Windows 11 WSL2 in which the bash shell is available.
• GSASysCon has no external dependencies except Gstreamer, and bash built-in commands.
• Input audio is typically via Pipewire/PulseAudio monitor or ALSA Loopback (use VB-Audio Virtual Cable under Windows)
• The Gstreamer command string for any pipeline can captured and run outside of the app, if desired.

Some differences between GSASysCon and CamillaDSP are:

• GSASysCon can create playback systems made up of multiple remote clients. Audio is sent using RTP over the local network (hardcable or WiFi) to one or more playback endpoints (computer+audio device/DAC). Tight playback synchronization between endpoints can be achieved when their clocks are synchronized using chrony (NTP).
• GSASysCon has no fancy level meters, no GUI, and no flow or filter diagrams except what can be generated manually using Gstreamer
• In GSASysCon, DSP is exclusively IIR filtering via LADSPA as filter-chains. FIR filtering is not currently available.
• GSASysCon was designed for music playback without any particular concerns for latency. Buffer size is fixed at 1024 samples.
• Gstreamer pipelines created with GSASysCon run at a fixed audio rate and bit depth that is chosen by the user. There is a high quality resampler built into Gstreamer that handles SR conversions.

The combination of Gstreamer and LADSPA is a robust and reliable DSP platform for DIY audio processing under Linux, or WSL2 under Windows. I've been using this to implement IIR DSP crossovers for almost 10 years in tandem with my ACDf LADSPA plugin. ACDf implements all the first and second order filter types – it’s all you need for loudspeaker crossovers and PEQ duty.

Steve_Leekenrhodesjr@mactrawSilver1omougly_woofer4thtryrjj45ImpiousColonel7and 3 others.

Comments

  • edited March 2

    I have an old PC that I installed Linux Ubuntu on several years ago. Not sure if it still boots. If I get time in the next month or so, I'll see if I can get it running again and install your suggested system. The only downside is that this old PC is a tower system with a fairly loud cooling fan, so I would probably need to place the PC in another room during playback.

    PS: Thanks for sharing all this great info!

  • Sure, an old PC can work. Can't help you with the noisy fan!

    If you aren't attached to anything on the machine, my advice would be to do a clean install the recent LTS version of Ubuntu. That is I think 24.04. This gets you the most recent version possible of Gstreamer. There is a new one that comes out once or twice a year and they seem to make some decent improvements. It's not critical, but since the OS is free if you have a spare 45min (mostly just to let it do its thing) it is worth your time.

    Once you (or anyone) gets GSASysCon installed, if you have any questions about how to set up a crossover I am more than happy to help you out. In the meantime you can always download the tar file, unpack it, and just read over the docs to learn more about how it works and what it can do.

  • Install a new fan, and make sure your thermal paste is in good condition. Pretty easy to build a PC with 40-45db noise levels. That should be your threshold in a typical listening space anyways. Houses are noisy for the most part.

    I have a signature.
  • edited March 3

    Hey Charlie, would the Hifiberry 8ch DAC for rPi work. Camilla DSP is usually suggested for it, but I suppose it should work.

    https://www.hifiberry.com/shop/boards/hifiberry-dac8x/

    Edit - I have neither the Rpi 5 or the Dac8x, but planning to get both.

  • Basically, any DAC that appears as an ALSA card will work. The HiFiBerry DAC will work just fine, but keep in mind that it is only compatible with the Pi5 and Raspberry OS (pretty sure about the OS limitation but not 100%). It's definitely a great bundle but has no audio input.

    My go-to starter multichannel DAC is the Behringer UMC1820. It has 10 analog output channels, SPDIF, and I think 8 inputs. If you can find a used one on Ebay, they are sometimes pretty cheap.

    Re-configuring the input and output device requires only a minor change to one line in the configuration file, so you can start off with whatever DAC or audio interface you can get your hands on and then "trade up" to whatever quality and functionality that you want or need.

  • I still have your Presonus interface! the Rpi5 and Dac8x is a much smaller package, but yes haven't looked into all the limitations

  • The Presonus 1818vsl would work GREAT but yes definitely larger than Pi+HAT. You could still use a Pi (not just the Pi 5) with the Presonus... I usually keep all that stuff near the amplifiers, which are usually the largest thing/component anyway.

  • For anyone who has given GSASysCon a try, I would really appreciate your feedback.

    • Were you able to complete the Setup?
    • Were the instructions clear or was anything unclear?
    • Did you get stuck trying to write your own system configuration file?
    • Any typos or errors in the docs you would like to have corrected?

    I am working on some changes to the bash script to implement the new feature that I described above. I would like to be able to fix any other small errors or improve the documentation and then roll all of it out at the same time.

    Feel free to PM me or post, here or over at DIYaudio. Thanks!

  • @charlielaub said:
    For anyone who has given GSASysCon a try, I would really appreciate your feedback.

    • Were you able to complete the Setup?
    • Were the instructions clear or was anything unclear?
    • Did you get stuck trying to write your own system configuration file?
    • Any typos or errors in the docs you would like to have corrected? I am working on some changes to the bash script to implement the new feature that I described above. I would like to be able to fix any other small errors or improve the documentation and then roll all of it out at the same time.

    Feel free to PM me or post, here or over at DIYaudio. Thanks!

    Just installed it and running the first test it does not toggle ON/OFF it remains OFF.
    This is a raspberry 4 running ubuntu 11.24.

  • in the log I see:
    Mar-10-2025 22:25:37 : Initializing with user specified configuration file: /home/alexis/system_control/config/minimal_config.txt
    Mar-10-2025 22:25:42 : A request to LAUNCH first test was received.
    Mar-10-2025 22:25:42 : A request to LAUNCH first test was received.WARNING: removing an empty element from >> audiointerleave name=output0 latency=100000000 ! fakesink sync=false
    input.src_0 ! audioconvert ! 'audio/x-raw,format=S16LE,channel-mask=(bitmask)0x1' ! output0.sink_0 input.src_1 ! ! audioconvert ! 'audio/x-raw,format=S16LE,channel-mask
    =(bitmask)0x2' ! output0.sink_1 <<.

  • I ran into this problem with someone else who is using a Pi 5 with a recent Raspberry OS installation. For some reason Gstreamer is not actually installed on the system.

    Here are the apt commands to install it:
    sudo apt update
    sudo apt -y install gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-pulseaudio

    I have edited the Setup Guide to include a check for the necessary Gstreamer components and that will be part of the next release.

    Please let me know if this does not fix the problem, e.g. when you press 1 for first test the STATUS field should change to 0sec and then every 10 sec show a new elapsed run time.

    Silver1omo
  • That was it, I should have checked for that...

  • The Using the ALSAINFO app doc is great.

    ALSAINFO.sh : written by Charlie Laub, 2016-2025, version 3.0

    testing ALSA device: hw:3,0
    Using a sample rate of 96000 Hz
    probing the device with an audio format of S32LE

    ALSA info about hw:3,0 :
    card 3: VSL [AudioBox 1818 VSL], device 0: USB Audio [USB Audio]


    ACCESS: MMAP_INTERLEAVED RW_INTERLEAVED
    FORMAT: S32_LE
    SUBFORMAT: STD
    SAMPLE_BITS: 32
    FRAME_BITS: [448 576]
    CHANNELS: [14 18]
    RATE: [44100 96000]
    PERIOD_TIME: [125 1000000]
    PERIOD_SIZE: [6 96000]
    PERIOD_BYTES: [336 6912000]
    PERIODS: [2 1024]
    BUFFER_TIME: [125 2000000]
    BUFFER_SIZE: [12 192000]
    BUFFER_BYTES: [672 13824000]
    TICK_TIME: ALL


    Now testing hw:3,0 for comptibilty with channel counts ranging from 2 to 29:

    This device will accept an audio stream consisting of 18 channels of audio in the S32LE format
    The bitmask for this mode is: 0x0000000000000000
    This device does not use channel assignments.
    All output channels should have their bitmask set to -3 (NONE)

    Now I need to get time to actually play with this and more amp channels.

  • edited March 11

    One of the reasons I wrote the ALSAINFO app is because I just could not (without it) figure out how to set up the output channels to a pro audio interface like your AudioBox 1818vsl. Unlike many DACs, even multichannel DACs, from the consumer market many pro audio interfaces (especially when they are capable of more than 8 channels) do not assign channel numbers to the outputs. It seems counter-intuitive but all the channels have the same channel number assignment, which is called by ALSA "SNDRV_CHMAP_UNKNOWN" and is the first channel listed in ALSA's channel mapping array. See for more info:
    https://docs.kernel.org/sound/designs/channel-mapping-api.html
    Anyway, Gstreamer decided to call the normal stereo left channel channel zero (0) and this happens to be the fourth entry in the ALSA channel map. ALSA's array is zero offset, so the Gstreamer channel numbers are the order the channel appears in the ALSA array minus 3. Thus SNDRV_CHMAP_UNKNOWN becomes channel number -3 in Gstreamer.

    Anyway, all the channels for your interface must have -3 as their output channel in GSASysCon's ROUTE statements. So for example, here is a setup for a Behringer UMC1820 in 12-channel mode (with ROUTE elements removed and replaced by "..."):

    #muted audio for non-used channels
    ROUTE=0,MUTED_INPUT
    volume volume=0

    #global filters - implement equal-loudness based voicing EQ:
    ROUTE=0,LEFT_INPUT; 1,RIGHT_INPUT
    ...

    #subwoofer output on channels 0 and 1 to allow front panel volume control
    ROUTE=LEFT_INPUT,0,-3; RIGHT_INPUT,0,-3
    ...

    #woofer output to channels 2 and 3
    ROUTE=LEFT_INPUT,0,-3; RIGHT_INPUT,0,-3
    ...

    #midrange output to channels 4 and 5
    ROUTE=LEFT_INPUT,0,-3; RIGHT_INPUT,0,-3
    ...

    #tweeter output to channels 6 and 7
    ROUTE=LEFT_INPUT,0,-3; RIGHT_INPUT,0,-3
    ...

    ROUTE=MUTED_INPUT,0,-3 #muted audio to channel 8
    ROUTE=MUTED_INPUT,0,-3 #muted audio to channel 9
    ROUTE=MUTED_INPUT,0,-3 #muted audio to channel 10
    ROUTE=MUTED_INPUT,0,-3 #muted audio to channel 11

    It goes to "11" (Spinal Tap reference) but yeah 12 channels with a 0-offset numbering ends at 11. On the back of the unit are 10 analog and 2 SPDIF outputs, numbered 1-10 and then L,R of the SPDIF. You ABSOLUTELY MUST always send all 12 channels to the interface or it will not function. And the ORDER that you provide the ROUTEs is what determines which physical output channel on the device where it will appear. So for instance, because the subwoofer ROUTEs are listed first they will appear on the physical TRS jacks labeled channels 0 and 1 on the back of the interface. You just have to keep track of what each route is doing (notes like I use above are great for this) and use the appropriate filters, and of course connect the interconnect between the desired output jack and the right amplifier channel that is connected to the intended driver. Otherwise, easy peasey. :)

    P.S. the muted audio and global filter lines are called "named tees". See the GSASysCon docs for more info.

    Silver1omo
  • FYI I pushed out a new release today with some cool new features and updated documentation.

    Download link here:
    https://www.diyaudio.com/community/threads/software-dsp-processing-using-gstreamer-pipelines-and-the-gsasyscon-app.424146

    jr@macsilverDSteve_Leekenrhodes4thtry
  • I just released what is probably the last update for awhile. There are lots of improvements to the documentation that should make it much easier to set up and use. You can use the link above to view the DIYaudio thread where you can download the package.

    Silver1omo4thtryjr@mac
Sign In or Register to comment.