|
- // -----------------------------------------------------------------------
- //
- // Copyright (C) 2010 Fons Adriaensen <fons@linuxaudio.org>
- // Modified by falkTX on Jan 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 <stdlib.h>
- #include <stdio.h>
- #include <string.h>
- #include "jclient.h"
- #include "global.h"
-
- namespace AT1 {
-
-
- Jclient::Jclient (const char *jname, jack_client_t *jclient) :
- A_thread ("jclient"),
- _jack_client (jclient),
- _active (false),
- _jname (0)
- {
- init_jack (jname);
- }
-
-
- Jclient::~Jclient (void)
- {
- if (_jack_client) close_jack ();
- }
-
-
- void Jclient::init_jack (const char *jname)
- {
- jack_on_shutdown (_jack_client, jack_static_shutdown, (void *) this);
- jack_set_process_callback (_jack_client, jack_static_process, (void *) this);
- if (jack_activate (_jack_client))
- {
- fprintf(stderr, "Can't activate JACK.\n");
- exit (1);
- }
-
- _jname = jack_get_client_name (_jack_client);
- _fsamp = jack_get_sample_rate (_jack_client);
- _fsize = jack_get_buffer_size (_jack_client);
-
- _ainp_port = jack_port_register (_jack_client, "in", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0);
- _aout_port = jack_port_register (_jack_client, "out", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0);
- _midi_port = jack_port_register (_jack_client, "pitch", JACK_DEFAULT_MIDI_TYPE, JackPortIsInput, 0);
-
- _retuner = new Retuner (_fsamp);
- _notemask = 0xFFF;
- _midichan = -1;
- clr_midimask ();
-
- _active = true;
- }
-
-
- void Jclient::close_jack ()
- {
- jack_deactivate (_jack_client);
- jack_client_close (_jack_client);
- delete _retuner;
- }
-
-
- 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);
- }
-
-
- void Jclient::clr_midimask (void)
- {
- int i;
-
- for (i = 0; i < 12; i++) _notes [i] = 0;
- _midimask = 0;
- }
-
-
- void Jclient::midi_process (int nframes)
- {
- int i, b, n, t, v;
- void *p;
- jack_midi_event_t E;
-
- p = jack_port_get_buffer (_midi_port, nframes);
- i = 0;
- while (jack_midi_event_get (&E, p, i) == 0)
- {
- t = E.buffer [0];
- n = E.buffer [1];
- v = E.buffer [2];
- if ((_midichan < 0) || ((t & 0x0F) == _midichan))
- {
- switch (t & 0xF0)
- {
- case 0x80:
- case 0x90:
- if (v && (t & 0x10))_notes [n % 12] += 1;
- else _notes [n % 12] -= 1;
- break;
- }
- }
- i++;
- }
-
- _midimask = 0;
- for (i = 0, b = 1; i < 12; i++, b <<= 1)
- {
- if (_notes [i]) _midimask |= b;
- }
- }
-
-
- int Jclient::jack_process (int nframes)
- {
- float *inpp;
- float *outp;
-
- if (!_active) return 0;
-
- inpp = (float *) jack_port_get_buffer (_ainp_port, nframes);
- outp = (float *) jack_port_get_buffer (_aout_port, nframes);
- midi_process (nframes);
- _retuner->set_notemask (_midimask ? _midimask : _notemask);
- _retuner->process (nframes, inpp, outp);
-
- return 0;
- }
-
-
- }
|