Loopp/src/jacksendreturn.cxx

82 lines
2.5 KiB
C++
Raw Normal View History

#include "jacksendreturn.hxx"
#include "jack.hxx"
#include <math.h>
#include <assert.h>
extern Jack* jack;
JackSendReturn::JackSendReturn(int trackid, AudioProcessor *prev, jack_client_t *client)
:m_trackid(trackid), m_previousProcessor(prev), m_sendvol(1.0f)
{
char name[50];
int trackid_human = trackid + 1;
sprintf(name, "Send_track_%d_l\n",trackid_human);
2017-03-19 15:58:28 +01:00
m_sendport_l=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsOutput,0);
sprintf(name, "Send_track_%d_r\n",trackid_human);
2017-03-19 15:58:28 +01:00
m_sendport_r=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsOutput,0);
sprintf(name, "Return_track_%d_l\n",trackid_human);
2017-03-19 15:58:28 +01:00
m_returnport_l=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsInput,0);
sprintf(name, "Return_track_%d_r\n",trackid_human);
2017-03-19 15:58:28 +01:00
m_returnport_r=jack_port_register(client,name,JACK_DEFAULT_AUDIO_TYPE,JackPortIsInput,0);
m_active=false;
m_counter=0;
}
void JackSendReturn::process(unsigned int nframes, Buffers *buffers)
{
2018-04-13 15:34:17 +02:00
int trackoffset = m_trackid * 2;
//Reset send buffer
int offset=m_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]);
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]);
2017-03-19 15:58:28 +01:00
memset(sendtrackL,0,nframes*sizeof(float));
memset(sendtrackR,0,nframes*sizeof(float));
//Process previous AudioProcessor
m_previousProcessor->process(nframes,buffers);
float* sendL=(float*)jack_port_get_buffer(m_sendport_l, (jack_nframes_t)(buffers->nframes));
float* sendR=(float*)jack_port_get_buffer(m_sendport_r, (jack_nframes_t)(buffers->nframes));
float* retL =(float*)jack_port_get_buffer(m_returnport_l,(jack_nframes_t)(buffers->nframes));
float* retR =(float*)jack_port_get_buffer(m_returnport_r,(jack_nframes_t)(buffers->nframes));
if(offset) {
2017-03-19 15:58:28 +01:00
sendL+=offset;
sendR+=offset;
retL+=offset;
retR+=offset;
}
2017-03-19 15:58:28 +01:00
for(int i=0; i<nframes; i++) {
sendL[i]=m_sendvol*sendtrackL[i];
sendR[i]=m_sendvol*sendtrackR[i];
}
if(offset)
assert(offset+nframes==buffers->nframes);
2017-03-19 15:58:28 +01:00
if(m_active) {
memcpy(rettrackL,retL,nframes*sizeof(float));
memcpy(rettrackR,retR,nframes*sizeof(float));
}
2017-03-19 15:58:28 +01:00
else {
memcpy(rettrackL, sendtrackL,nframes*sizeof(float));
memcpy(rettrackR, sendtrackR,nframes*sizeof(float));
}
m_counter+=nframes;
}
void JackSendReturn::activate(bool act)
{
m_active=act;
}
void JackSendReturn::sendVolume(float vol)
{
m_sendvol=vol;
}