2016-10-03 19:43:13 +02:00
|
|
|
#include "jacksendreturn.hxx"
|
|
|
|
#include "jack.hxx"
|
2016-11-17 20:15:47 +01:00
|
|
|
#include <math.h>
|
|
|
|
#include <assert.h>
|
2016-10-03 19:43:13 +02:00
|
|
|
extern Jack* jack;
|
|
|
|
JackSendReturn::JackSendReturn(int trackid, AudioProcessor *prev, jack_client_t *client)
|
2018-07-05 21:01:50 +02:00
|
|
|
:_trackId(trackid), _previousProcessor(prev), _sendVol(1.0f)
|
2016-10-03 19:43:13 +02:00
|
|
|
{
|
2016-12-27 13:47:19 +01:00
|
|
|
char name[50];
|
2017-03-27 22:05:03 +02:00
|
|
|
int trackid_human = trackid + 1;
|
|
|
|
sprintf(name, "Send_track_%d_l\n",trackid_human);
|
2018-07-05 21:01:50 +02:00
|
|
|
_sendPortL=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsOutput,0);
|
2017-03-27 22:05:03 +02:00
|
|
|
sprintf(name, "Send_track_%d_r\n",trackid_human);
|
2018-07-05 21:01:50 +02:00
|
|
|
_sendPortR=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsOutput,0);
|
2017-03-27 22:05:03 +02:00
|
|
|
sprintf(name, "Return_track_%d_l\n",trackid_human);
|
2018-07-05 21:01:50 +02:00
|
|
|
_returnPortL=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsInput,0);
|
2017-03-27 22:05:03 +02:00
|
|
|
sprintf(name, "Return_track_%d_r\n",trackid_human);
|
2018-07-05 21:01:50 +02:00
|
|
|
_returnPortR=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsInput,0);
|
|
|
|
_active=false;
|
2018-07-05 21:51:26 +02:00
|
|
|
_activeLag = 0;
|
2018-07-05 21:01:50 +02:00
|
|
|
_counter=0;
|
2016-10-03 19:43:13 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
void JackSendReturn::process(unsigned int nframes, Buffers *buffers)
|
|
|
|
{
|
2018-04-13 22:24:45 +02:00
|
|
|
// index = first-track + (track * channels)
|
2018-07-05 21:01:50 +02:00
|
|
|
int trackoffset = _trackId * NCHANNELS;
|
2016-12-27 13:47:19 +01:00
|
|
|
//Reset send buffer
|
2018-07-05 21:01:50 +02:00
|
|
|
int offset=_counter%(buffers->nframes);
|
2018-04-13 15:34:17 +02:00
|
|
|
float* sendtrackL=&(buffers->audio[Buffers::SEND_TRACK_0_L + trackoffset][0]);
|
|
|
|
float* sendtrackR=&(buffers->audio[Buffers::SEND_TRACK_0_R + trackoffset][0]);
|
2016-11-17 20:15:47 +01:00
|
|
|
|
|
|
|
|
2018-04-13 15:34:17 +02:00
|
|
|
float* rettrackL=&(buffers->audio[Buffers::RETURN_TRACK_0_L + trackoffset][0]);
|
|
|
|
float* rettrackR=&(buffers->audio[Buffers::RETURN_TRACK_0_R + trackoffset][0]);
|
2016-11-17 20:15:47 +01:00
|
|
|
|
2017-03-19 15:58:28 +01:00
|
|
|
memset(sendtrackL,0,nframes*sizeof(float));
|
|
|
|
memset(sendtrackR,0,nframes*sizeof(float));
|
2016-10-03 19:43:13 +02:00
|
|
|
|
2016-12-27 13:47:19 +01:00
|
|
|
//Process previous AudioProcessor
|
2018-07-05 21:01:50 +02:00
|
|
|
_previousProcessor->process(nframes,buffers);
|
2018-03-02 01:10:41 +01:00
|
|
|
|
2018-07-05 21:01:50 +02:00
|
|
|
float* sendL=(float*)jack_port_get_buffer(_sendPortL, (jack_nframes_t)(buffers->nframes));
|
|
|
|
float* sendR=(float*)jack_port_get_buffer(_sendPortR, (jack_nframes_t)(buffers->nframes));
|
|
|
|
float* retL =(float*)jack_port_get_buffer(_returnPortL,(jack_nframes_t)(buffers->nframes));
|
|
|
|
float* retR =(float*)jack_port_get_buffer(_returnPortR,(jack_nframes_t)(buffers->nframes));
|
2018-03-02 01:10:41 +01:00
|
|
|
|
2016-12-27 13:47:19 +01:00
|
|
|
if(offset) {
|
2017-03-19 15:58:28 +01:00
|
|
|
sendL+=offset;
|
|
|
|
sendR+=offset;
|
|
|
|
retL+=offset;
|
|
|
|
retR+=offset;
|
2016-12-27 13:47:19 +01:00
|
|
|
}
|
2016-10-03 19:43:13 +02:00
|
|
|
|
2017-03-19 15:58:28 +01:00
|
|
|
for(int i=0; i<nframes; i++) {
|
2018-07-09 14:38:52 +02:00
|
|
|
_sendVolLag += jack->smoothing_value * (_sendVol - _sendVolLag);
|
2018-07-05 21:18:54 +02:00
|
|
|
|
|
|
|
sendL[i] = _sendVolLag * sendtrackL[i];
|
|
|
|
sendR[i] = _sendVolLag * sendtrackR[i];
|
2018-07-05 21:51:26 +02:00
|
|
|
|
2018-07-09 14:38:52 +02:00
|
|
|
_activeLag += jack->smoothing_value * (float(_active) - _activeLag);
|
2018-07-05 21:51:26 +02:00
|
|
|
|
2018-07-14 13:25:02 +02:00
|
|
|
rettrackL[i] = retL[i] * _activeLag + sendtrackL[i] * fabs(_activeLag - 1);
|
|
|
|
rettrackR[i] = retR[i] * _activeLag + sendtrackR[i] * fabs(_activeLag - 1);
|
2018-03-02 01:10:41 +01:00
|
|
|
}
|
2016-11-15 18:11:28 +01:00
|
|
|
|
2016-12-27 13:47:19 +01:00
|
|
|
if(offset)
|
|
|
|
assert(offset+nframes==buffers->nframes);
|
2016-11-15 18:11:28 +01:00
|
|
|
|
2018-07-05 21:01:50 +02:00
|
|
|
_counter+=nframes;
|
2016-10-03 19:43:13 +02:00
|
|
|
|
|
|
|
}
|
2016-11-15 18:11:28 +01:00
|
|
|
|
|
|
|
void JackSendReturn::activate(bool act)
|
|
|
|
{
|
2018-07-05 21:01:50 +02:00
|
|
|
_active=act;
|
2016-11-15 18:11:28 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
void JackSendReturn::sendVolume(float vol)
|
|
|
|
{
|
2018-07-05 21:01:50 +02:00
|
|
|
_sendVol=vol;
|
2016-11-15 18:11:28 +01:00
|
|
|
}
|