On Tue, Mar 26, 2019 at 11:03 PM Robin Gareus <robin(a)gareus.org> wrote:
On 3/26/19 11:33 PM, John Rigg wrote:
On Tue, Mar 26, 2019 at 10:12:32PM +0100, Kjetil
Matheussen wrote:
On Tue, Mar 26, 2019 at 10:01 PM Fons Adriaensen
<fons(a)linuxaudio.org> wrote:
The VERY LAST thing I'd want in such a system is a gain control
on each Jack connection. One very big advantage of digital
connections, be they MADI, ADAT, Jack, or Dante, is that signal
levels at all inputs and outputs are exactly defined and can't
change. Setting up a a similar system using analog connections
with variable gains would be a real nightmare.
Sure, I'm just saying that extending jack with a volume control for
each connection would be a good thing, for those who need it, which I
guess would be the most of us. You are of course free not to use it if
you don't need it.
If anyone does this please make turning it off a compile option.
I can see it causing big problems in a complex setup.
and disable it by default and add excessive warnings to not enabled it :)
When this is implemented there are no zero-copy shared buffers anymore.
Port buffers have to pass through a gain-stage first.
Also, direct client-to-client wakeup will not be possible anymore. A
client first has to call some gain-stage or return execution to jackd to
apply the gain. This adds an extra context switch.
I don't think this is correct. First of all, you don't have to do
anything differently than now unless gain volume has been set.
Secondly, you would only need to apply volume to the sound block
returned by jack_port_get_buffer in the client. If that sound block is
used for other things as well, just make a temporary copy before
applying the volume.
Last but not least, gain-changes should be gradual,
free of zipper
noise, so there's more complexity.
Yes, true, but not a big thing to implement.
One of JACK's main concepts was that it provides a mechanism (not
policy). That's also why ports don't include delaylines to compensate
for latency. JACK is supposed to just pass data around and make
information available, not process data.
Doesn't matter what it's supposed to do. Do what makes sense. Do what
gives the biggest benefit for the least amount of work.
That being said, you can probably achieve what you want using an
internal-client that implements a gain-stage. Then insert that in
strategic places. Perhaps use the meta-data API to configure it, that
would also get around the issue with port-ownership to control it.
Yes, as I wrote. But that's a hack.