| 
							- // ----------------------------------------------------------------------
 - //
 - //  Copyright (C) 2011 Fons Adriaensen <fons@linuxaudio.org>
 - //  Modified by falkTX on Jan-Apr 2015 for inclusion in Carla
 - //    
 - //  This program is free software; you can redistribute it and/or modify
 - //  it under the terms of the GNU General Public License as published by
 - //  the Free Software Foundation; either version 2 of the License, or
 - //  (at your option) any later version.
 - //
 - //  This program is distributed in the hope that it will be useful,
 - //  but WITHOUT ANY WARRANTY; without even the implied warranty of
 - //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 - //  GNU General Public License for more details.
 - //
 - //  You should have received a copy of the GNU General Public License
 - //  along with this program; if not, write to the Free Software
 - //  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 - //
 - // ----------------------------------------------------------------------
 - 
 - 
 - #include <string.h>
 - #include "jclient.h"
 - 
 - namespace BLS1 {
 - 
 - 
 - Jclient::Jclient (jack_client_t *jclient) :
 -     A_thread ("Jclient"),
 -     _jack_client (jclient),
 -     _active (false),
 -     _inpbal0 (0),	
 -     _inpbal1 (0),	
 -     _ga (1.0f),
 -     _gb (1.0f),
 -     _da (0.0f),
 -     _db (0.0f)
 - {
 -     init_jack ();
 - }
 - 
 - 
 - Jclient::~Jclient (void)
 - {
 -     if (_jack_client) close_jack ();
 - }
 - 
 - 
 - void Jclient::init_jack (void)
 - {
 -     jack_set_process_callback (_jack_client, jack_static_process, (void *) this);
 -     jack_on_shutdown (_jack_client, jack_static_shutdown, (void *) this);
 -     jack_activate (_jack_client);
 - 
 -     _fsamp = jack_get_sample_rate (_jack_client);
 -     _psize = jack_get_buffer_size (_jack_client);
 -     if (_psize > 4096)
 -     {
 - 	fprintf (stderr, "Period size can't be more than 4096.\n");
 - 	return;
 -     }
 -     if (_psize & (_psize - 1))
 -     {
 - 	fprintf (stderr, "Period size must be a power of 2.\n");
 - 	return;
 -     }
 - 
 -     _inpports [0] = jack_port_register (_jack_client, "inp.L", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
 -     _inpports [1] = jack_port_register (_jack_client, "inp.R", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
 -     _outports [0] = jack_port_register (_jack_client, "out.L", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
 -     _outports [1] = jack_port_register (_jack_client, "out.R", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
 - 
 -     _hpfilt.setfsamp (_fsamp);
 -     _lshelf.setfsamp (_fsamp);
 -     _lshelf.bypass (false);
 -     _shuffl.init (_fsamp, _psize);
 - 
 - 
 -     for (int k = _fsamp, _fragm = 1024; k > 56000; k >>= 1, _fragm <<= 1);
 -     _nsamp = 0;
 -     _active = true;
 - }
 - 
 - 
 - void Jclient::close_jack ()
 - {
 -     jack_deactivate (_jack_client);
 -     jack_client_close (_jack_client);
 - }
 - 
 - 
 - void Jclient::jack_static_shutdown (void *arg)
 - {
 -     ((Jclient *) arg)->jack_shutdown ();
 - }
 - 
 - 
 - int Jclient::jack_static_process (jack_nframes_t nframes, void *arg)
 - {
 -     return ((Jclient *) arg)->jack_process (nframes);
 - }
 - 
 - 
 - void Jclient::jack_shutdown (void)
 - {
 -     send_event (EV_EXIT, 1);
 - }
 - 
 - 
 - int Jclient::jack_process (int frames)
 - {
 -     int   i, k, n;
 -     float a, b, t;
 -     float *inp [2];
 -     float *tmp [2];
 -     float *out [2];
 - 
 -     if (!_active) return 0;
 -     
 -     inp [0] = (float *) jack_port_get_buffer (_inpports [0], frames);
 -     inp [1] = (float *) jack_port_get_buffer (_inpports [1], frames);
 -     out [0] = tmp [0] = (float *) jack_port_get_buffer (_outports [0], frames);
 -     out [1] = tmp [1] = (float *) jack_port_get_buffer (_outports [1], frames);
 - 
 -     a = _ga;
 -     b = _gb;
 -     n = frames;
 -     while (n)
 -     {
 - 	if (!_nsamp)
 - 	{
 - 	    if (fabsf (_inpbal0 -_inpbal1) > 0.01f)
 - 	    {
 - 		_inpbal1 = _inpbal0;
 - 		t = powf (10.0f, 0.05f * _inpbal0);
 - 		_db = (t - b) / _fragm;
 -  	        t = 1.0f / t;
 - 		_da = (t - a) / _fragm;
 - 	    }
 - 	    else
 - 	    {
 -                 _da = 0.0f;
 - 		_db = 0.0f;
 - 	    }
 - 	    _hpfilt.prepare (_fragm);
 - 	    _lshelf.prepare (_fragm);
 -             _nsamp = _fragm;
 - 	}
 - 
 -         k = (n < _nsamp) ? n: _nsamp;
 - 	for (i = 0; i < k; i++)
 - 	{
 - 	    a += _da;
 - 	    b += _db;
 - 	    tmp [0][i] = a * inp [0][i];
 - 	    tmp [1][i] = b * inp [1][i];
 - 	}
 -         _hpfilt.process (k, 2, tmp);
 -         _lshelf.process (k, 2, tmp);
 -         inp [0] += k;
 -         inp [1] += k;
 -         tmp [0] += k;
 -         tmp [1] += k;
 - 	_nsamp -= k;
 - 	n -= k;
 -     }
 -     _ga = a;
 -     _gb = b;
 - 
 -     _shuffl.process (frames, out, out);
 - 
 -     return 0;
 - }
 - 
 - 
 - }
 
 
  |