Pulseaudio Crossover Rack - multi-way crossover design & implementation with linux

Hi Jürgen
I have just installed Ubuntu server and the lubuntu desktop on a Pi 2B
When I try to start PAXR it asks and then downloads the pulsectl no problems but then when it tries to add zodb I get this error...
Code:
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-6wlywkmc/BTrees/

any suggestions ?
 
Good morning everybody...

I was pretty busy in the last few weeks, so here are some things to catch up und the latest conversations:

1. PaXoverRack does not do DSP itself, so it will not show any load while DSP stuff is running. The CPU load will be shown by the pulseaudio process. in terms of actual load it will be very similar to jackd, if one of them is stuttering that has to do with priority settings being too low. At the end of the day both mostly will use LADSPA plugins to do the DSP work and hence the load will be practically the same.

2. On sample rates: As pulseaudio will mix different streams it has to run at one sample rate and resample streams of different sample rates coming in to match the main sample rate pulseaudio is running at. So here's my recommendation: run pulseaudio at 96 or 192kHz and let it resample all streams. The procedure is described here: Pulseaudio Crossover Rack - Online Help
"avoid-resampling = false" will inhibit pulseaudio to choose a lower sample rate when, the first input stream has a lower sample rate than indicated in the config, so it should read "always-resample = true" 🙂
Using at least 96kHz as backend sample rate is a) beneficial to filters near the nyquist frequency, i.e. when you use a subsample delay, a boost or cut around 10k, so you're definitely better off with 96k.
I don't believe that high quality resamplers sound bad and neither do i believe that "integer resampling" (44.1k->88.1k) is better than say 44.1k->96k. At the end of the day you will be inputing a mix of both 44.1k for music and 48k for video anyways. At least in my case.
Also using float32le as sample format will turn out to be beneficial on CPU load and sound, as all LADSPA plugins use that format internally.

Inidivdual questions in later posts...
 
Hi Jürgen
I have just installed Ubuntu server and the lubuntu desktop on a Pi 2B
When I try to start PAXR it asks and then downloads the pulsectl no problems but then when it tries to add zodb I get this error...
Code:
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-6wlywkmc/BTrees/

any suggestions ?

please post a full traceback (use a pastebin preferrably) of the console when you issue a "pip3 install pulsectl". As the command talks about BTrees i suspect it is coming from the ZODB module, so also try "pip3 install ZODB".
 
I guess buffer size and sample rate.
How much is the total delay in this case?

Or in other words, what kind of latency is to be expected?

There will be no more latency than running without DSP. All buffers are processed in real time and it doesn't matter how many filters are inserted. If your CPU isn't able to do it in real time it will stutter, a higher latency would not help and thus doesn't make any sense.
 
I have been following this loosely for a while.
I think it's a very interesting project.
However, I was wondering if 2nd order shelving is also possible?
The main reason is to form some Linkwtiz-Transform filters.

Second would be a compressor/limiter

3rd, have people been trying to use this on a RaspPi?

I don't know what you mean by second order shelfing? There is a low and high shelf filter available in the parametric eq, both are mathematically second order filters.

For what aou're trying to do you need a real linkwitz transform filter. I already have the DSP coefficient formulae here, there will be a release soon.

I do not intend to write a compressor or linmiter though, this is not the scope of this software. If you need a limiter your gain structure is off anyways.
 
so I managed to get this set up and kind of working on my raspi3 using the cheap but good Logilink USB 7.1 sound box. OS is the mentioned ubuntu server 18.04 with lubuntu desktop. I made no further tweaks to the system or Pulseaudio, just update, upgrade, install lubuntu desktop and PAXOR via repository. Some setbacks due to my complete lack of experience with linux were overcome in that process...


however, whenever I try to route audio through PAXOR to more than two output channels, I get constant artifacts in the audiostream. Sounds to me like buffer underruns. They are very frequent (up to several time per second) and have no specific pattern that I could recognize.



Routing audio to all 8 channels is no problem as long as PAXOR is deactivated. Processor load is around 10-15% when these problems occur.



Any ideas for troubleshooting this?

I have a similar problem with ASUS Xonar U5/U7 cards. I managed to get it working by disabling timer based scheduling. See previous posts for that. I filed a bug against pulseaudio but debugging this proved to be nearly impossible :/
 
I don't know what you mean by second order shelfing? There is a low and high shelf filter available in the parametric eq, both are mathematically second order filters.

For what aou're trying to do you need a real linkwitz transform filter. I already have the DSP coefficient formulae here, there will be a release soon.

I do not intend to write a compressor or linmiter though, this is not the scope of this software. If you need a limiter your gain structure is off anyways.

There are 1 st order shelving filters as well as second order shelving filters (and technically you could go even higher).
Depending on the issue it depends which one people have to use.

About the compressor/limiter, wouldn't it be possible to implement (or collaborate) parts from PulseEffects?
Or is it possible to run PulseEffects together with Crossover Rack?
I think the compressor and Bass Enhancer are both very interesting features to implement.

Another idea is to take the approach Equalizer APO (for Windows) is using and that is to implement a feature to use LV2 plugins.
 
There are 1 st order shelving filters as well as second order shelving filters (and technically you could go even higher).
Depending on the issue it depends which one people have to use.

About the compressor/limiter, wouldn't it be possible to implement (or collaborate) parts from PulseEffects?
Or is it possible to run PulseEffects together with Crossover Rack?
I think the compressor and Bass Enhancer are both very interesting features to implement.

Another idea is to take the approach Equalizer APO (for Windows) is using and that is to implement a feature to use LV2 plugins.

I don't know how pulseeffects builds the chain. With a little bit of mucking around you might get them to work together, just try it and let us know what you find out...

Do you know if filters in pulseeffect are real time configurable? Actually for me that was the whole point of rewriting my own plugins because afaik ladspa plugin parameters cannot be changed on the fly once inserted into pulseaudio which is why i implemented a shared memory API in my own set of plugins.
 
@b-force and Tfive, there are of course loads of ladspa-plugins already available. Perhaps feature-requests are more successful when there is a ladspa-plugin available for it?

I simply typed ladspa in synaptic package manager and there was a large search results. Some overlap, many clearly forked/cloned from a small number of original plugins, but a good range nonetheless. I see various compressors, even an impulse convolver, Of course there is more outside of the Ubuntu repositories.
 
2. On sample rates: As pulseaudio will mix different streams it has to run at one sample rate and resample streams of different sample rates coming in to match the main sample rate pulseaudio is running at. So here's my recommendation: run pulseaudio at 96 or 192kHz and let it resample all streams. The procedure is described here: Pulseaudio Crossover Rack - Online Help
"avoid-resampling = false" will inhibit pulseaudio to choose a lower sample rate when, the first input stream has a lower sample rate than indicated in the config, so it should read "always-resample = true" 🙂
Using at least 96kHz as backend sample rate is a) beneficial to filters near the nyquist frequency, i.e. when you use a subsample delay, a boost or cut around 10k, so you're definitely better off with 96k.
I don't believe that high quality resamplers sound bad and neither do i believe that "integer resampling" (44.1k->88.1k) is better than say 44.1k->96k. At the end of the day you will be inputing a mix of both 44.1k for music and 48k for video anyways. At least in my case.
Also using float32le as sample format will turn out to be beneficial on CPU load and sound, as all LADSPA plugins use that format internally.

Thank you for this elaborate information!
 
@b-force and Tfive, there are of course loads of ladspa-plugins already available. Perhaps feature-requests are more successful when there is a ladspa-plugin available for it?

I simply typed ladspa in synaptic package manager and there was a large search results. Some overlap, many clearly forked/cloned from a small number of original plugins, but a good range nonetheless. I see various compressors, even an impulse convolver, Of course there is more outside of the Ubuntu repositories.

As I said previously, these are not useable within PaXoverRack without modification as they would then lack real time parameter updates.
 
I don't know how pulseeffects builds the chain. With a little bit of mucking around you might get them to work together, just try it and let us know what you find out...

Do you know if filters in pulseeffect are real time configurable? Actually for me that was the whole point of rewriting my own plugins because afaik ladspa plugin parameters cannot be changed on the fly once inserted into pulseaudio which is why i implemented a shared memory API in my own set of plugins.

Real-time configurable? As in, they work on the fly, when changing parameters?
In that case, yes they are.
 
please post a full traceback (use a pastebin preferrably) of the console when you issue a "pip3 install pulsectl". As the command talks about BTrees i suspect it is coming from the ZODB module, so also try "pip3 install ZODB".

Here it is... yes, definately Btrees....
Code:
ubuntu@ubuntu:~$ pip3 install pulsectl
Collecting pulsectl
  Using cached [url]https://files.pythonhosted.org/packages/ae/f1/b673f77b153e5d03a715f1641a82c0bfddfae940ae75b7efefbcaf38d32c/pulsectl-18.12.5-py2.py3-none-any.whl[/url]
Collecting setuptools (from pulsectl)
  Using cached [url]https://files.pythonhosted.org/packages/ec/51/f45cea425fd5cb0b0380f5b0f048ebc1da5b417e48d304838c02d6288a1e/setuptools-41.0.1-py2.py3-none-any.whl[/url]
Installing collected packages: setuptools, pulsectl
Successfully installed pulsectl-18.12.5 setuptools-41.0.1
ubuntu@ubuntu:~$ pip3 install ZODB
Collecting ZODB
  Using cached [url]https://files.pythonhosted.org/packages/78/27/346776a8c1d9bcdfa1559688ae8461ccb2e5e876f275732d71aaf8529c9b/ZODB-5.5.1-py2.py3-none-any.whl[/url]
Collecting six (from ZODB)
  Using cached [url]https://files.pythonhosted.org/packages/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl[/url]
Collecting BTrees>=4.2.0 (from ZODB)
  Using cached [url]https://files.pythonhosted.org/packages/e9/b4/4c6209fbcc8d278a1a13e7284bbea14ffb15d83c6ab3eae24c66108d239c/BTrees-4.5.1.tar.gz[/url]
    Complete output from command python setup.py egg_info:
    c/_cffi_backend.c:15:10: fatal error: ffi.h: No such file or directory
     #include <ffi.h>
              ^~~~~~~
    compilation terminated.
    Traceback (most recent call last):
      File "/usr/lib/python3.6/distutils/unixccompiler.py", line 118, in _compile
        extra_postargs)
      File "/usr/lib/python3.6/distutils/ccompiler.py", line 909, in spawn
        spawn(cmd, dry_run=self.dry_run)
      File "/usr/lib/python3.6/distutils/spawn.py", line 36, in spawn
        _spawn_posix(cmd, search_path, dry_run=dry_run)
      File "/usr/lib/python3.6/distutils/spawn.py", line 159, in _spawn_posix
        % (cmd, exit_status))
    distutils.errors.DistutilsExecError: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/usr/lib/python3.6/distutils/core.py", line 148, in setup
        dist.run_commands()
      File "/usr/lib/python3.6/distutils/dist.py", line 955, in run_commands
        self.run_command(cmd)
      File "/usr/lib/python3.6/distutils/dist.py", line 974, in run_command
        cmd_obj.run()
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/bdist_egg.py", line 172, in run
        cmd = self.call_command('install_lib', warn_dir=0)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/bdist_egg.py", line 158, in call_command
        self.run_command(cmdname)
      File "/usr/lib/python3.6/distutils/cmd.py", line 313, in run_command
        self.distribution.run_command(command)
      File "/usr/lib/python3.6/distutils/dist.py", line 974, in run_command
        cmd_obj.run()
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/install_lib.py", line 11, in run
        self.build()
      File "/usr/lib/python3.6/distutils/command/install_lib.py", line 109, in build
        self.run_command('build_ext')
      File "/usr/lib/python3.6/distutils/cmd.py", line 313, in run_command
        self.distribution.run_command(command)
      File "/usr/lib/python3.6/distutils/dist.py", line 974, in run_command
        cmd_obj.run()
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/build_ext.py", line 78, in run
        _build_ext.run(self)
      File "/usr/lib/python3.6/distutils/command/build_ext.py", line 339, in run
        self.build_extensions()
      File "/usr/lib/python3.6/distutils/command/build_ext.py", line 448, in build_extensions
        self._build_extensions_serial()
      File "/usr/lib/python3.6/distutils/command/build_ext.py", line 473, in _build_extensions_serial
        self.build_extension(ext)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/build_ext.py", line 199, in build_extension
        _build_ext.build_extension(self, ext)
      File "/usr/lib/python3.6/distutils/command/build_ext.py", line 533, in build_extension
        depends=ext.depends)
      File "/usr/lib/python3.6/distutils/ccompiler.py", line 574, in compile
        self._compile(obj, src, ext, cc_args, extra_postargs, pp_opts)
      File "/usr/lib/python3.6/distutils/unixccompiler.py", line 120, in _compile
        raise CompileError(msg)
    distutils.errors.CompileError: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 154, in save_modules
        yield saved
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 195, in setup_context
        yield
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 250, in run_setup
        _execfile(setup_script, ns)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 45, in _execfile
        exec(code, globals, locals)
      File "/tmp/easy_install-g1_jle6b/persistent-4.5.0/temp/easy_install-p6dxdwe6/cffi-1.12.3/setup.py", line 248, in <module>
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 145, in setup
        return distutils.core.setup(**attrs)
      File "/usr/lib/python3.6/distutils/core.py", line 163, in setup
        raise SystemExit("error: " + str(msg))
    SystemExit: error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1144, in run_setup
        run_setup(setup_script, args)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 253, in run_setup
        raise
      File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
        self.gen.throw(type, value, traceback)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 195, in setup_context
        yield
      File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
        self.gen.throw(type, value, traceback)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 166, in save_modules
        saved_exc.resume()
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 141, in resume
        six.reraise(type, exc, self._tb)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/_vendor/six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 154, in save_modules
        yield saved
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 195, in setup_context
        yield
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 250, in run_setup
        _execfile(setup_script, ns)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 45, in _execfile
        exec(code, globals, locals)
      File "/tmp/easy_install-g1_jle6b/persistent-4.5.0/temp/easy_install-p6dxdwe6/cffi-1.12.3/setup.py", line 248, in <module>
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 145, in setup
        return distutils.core.setup(**attrs)
      File "/usr/lib/python3.6/distutils/core.py", line 163, in setup
        raise SystemExit("error: " + str(msg))
    SystemExit: error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 154, in save_modules
        yield saved
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 195, in setup_context
        yield
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 250, in run_setup
        _execfile(setup_script, ns)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 45, in _execfile
        exec(code, globals, locals)
      File "/tmp/easy_install-g1_jle6b/persistent-4.5.0/setup.py", line 137, in <module>
        'zope.interface',
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 144, in setup
        _install_setup_requires(attrs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 139, in _install_setup_requires
        dist.fetch_build_eggs(dist.setup_requires)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/dist.py", line 717, in fetch_build_eggs
        replace_conflicting=True,
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 782, in resolve
        replace_conflicting=replace_conflicting
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 1065, in best_match
        return self.obtain(req, installer)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 1077, in obtain
        return installer(requirement)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/dist.py", line 784, in fetch_build_egg
        return cmd.easy_install(req)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 679, in easy_install
        return self.install_item(spec, dist.location, tmpdir, deps)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 705, in install_item
        dists = self.install_eggs(spec, download, tmpdir)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 890, in install_eggs
        return self.build_and_install(setup_script, setup_base)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1158, in build_and_install
        self.run_setup(setup_script, setup_base, args)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1146, in run_setup
        raise DistutilsError("Setup script exited with %s" % (v.args[0],))
    distutils.errors.DistutilsError: Setup script exited with error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "/tmp/pip-build-mns8ko94/BTrees/setup.py", line 195, in <module>
        """
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 144, in setup
        _install_setup_requires(attrs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 139, in _install_setup_requires
        dist.fetch_build_eggs(dist.setup_requires)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/dist.py", line 717, in fetch_build_eggs
        replace_conflicting=True,
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 782, in resolve
        replace_conflicting=replace_conflicting
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 1065, in best_match
        return self.obtain(req, installer)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 1077, in obtain
        return installer(requirement)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/dist.py", line 784, in fetch_build_egg
        return cmd.easy_install(req)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 679, in easy_install
        return self.install_item(spec, dist.location, tmpdir, deps)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 705, in install_item
        dists = self.install_eggs(spec, download, tmpdir)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 890, in install_eggs
        return self.build_and_install(setup_script, setup_base)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1158, in build_and_install
        self.run_setup(setup_script, setup_base, args)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1144, in run_setup
        run_setup(setup_script, args)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 253, in run_setup
        raise
      File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
        self.gen.throw(type, value, traceback)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 195, in setup_context
        yield
      File "/usr/lib/python3.6/contextlib.py", line 99, in __exit__
        self.gen.throw(type, value, traceback)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 166, in save_modules
        saved_exc.resume()
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 141, in resume
        six.reraise(type, exc, self._tb)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/_vendor/six.py", line 685, in reraise
        raise value.with_traceback(tb)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 154, in save_modules
        yield saved
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 195, in setup_context
        yield
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 250, in run_setup
        _execfile(setup_script, ns)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/sandbox.py", line 45, in _execfile
        exec(code, globals, locals)
      File "/tmp/easy_install-g1_jle6b/persistent-4.5.0/setup.py", line 137, in <module>
        'zope.interface',
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 144, in setup
        _install_setup_requires(attrs)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/__init__.py", line 139, in _install_setup_requires
        dist.fetch_build_eggs(dist.setup_requires)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/dist.py", line 717, in fetch_build_eggs
        replace_conflicting=True,
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 782, in resolve
        replace_conflicting=replace_conflicting
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 1065, in best_match
        return self.obtain(req, installer)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/pkg_resources/__init__.py", line 1077, in obtain
        return installer(requirement)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/dist.py", line 784, in fetch_build_egg
        return cmd.easy_install(req)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 679, in easy_install
        return self.install_item(spec, dist.location, tmpdir, deps)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 705, in install_item
        dists = self.install_eggs(spec, download, tmpdir)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 890, in install_eggs
        return self.build_and_install(setup_script, setup_base)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1158, in build_and_install
        self.run_setup(setup_script, setup_base, args)
      File "/home/ubuntu/.local/lib/python3.6/site-packages/setuptools/command/easy_install.py", line 1146, in run_setup
        raise DistutilsError("Setup script exited with %s" % (v.args[0],))
    distutils.errors.DistutilsError: Setup script exited with error: command 'arm-linux-gnueabihf-gcc' failed with exit status 1
    
    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-mns8ko94/BTrees/
 
Last edited:
Jurgen,
In this thread, https://www.diyaudio.com/forums/pc-based/336812-single-pc-solution-2-usb-sound-cards-crossovers-using-pax-rack-3.html#post5798661, I set about trying to get two USB sound cards to act as one virtual card and use each of them in separate speaker boxes as the active crossover, as I originally asked in this thread.

With much help and perseverance from phofman, the two cards are recognised and output when tested. My question is now, how do I get PAX Rack to work with them?