2013-07-27 23:36:58 +02:00
|
|
|
|
|
|
|
#ifndef LUPPP_TRACK_OUTPUT_H
|
|
|
|
#define LUPPP_TRACK_OUTPUT_H
|
|
|
|
|
2013-07-30 01:56:13 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
#include "config.hxx"
|
2013-07-28 14:14:25 +02:00
|
|
|
#include "audioprocessor.hxx"
|
|
|
|
|
2013-07-28 14:31:07 +02:00
|
|
|
#include "eventhandler.hxx"
|
|
|
|
#include "dsp/dsp_dbmeter.hxx"
|
|
|
|
|
2013-07-28 14:14:25 +02:00
|
|
|
class TrackOutput : public AudioProcessor
|
2013-07-27 23:36:58 +02:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
TrackOutput(int t, AudioProcessor* ap) :
|
2013-07-31 02:28:18 +02:00
|
|
|
AudioProcessor(),
|
2013-07-27 23:36:58 +02:00
|
|
|
track(t),
|
2013-08-06 22:55:57 +02:00
|
|
|
_trackBuffer( MAX_BUFFER_SIZE, 0.f ),
|
2013-07-28 14:31:07 +02:00
|
|
|
previousInChain(ap),
|
|
|
|
dbMeter(44100)
|
2013-07-27 23:36:58 +02:00
|
|
|
{
|
2013-07-30 01:56:13 +02:00
|
|
|
printf("trackOutput ID: %i\n", track);
|
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
|
|
|
|
|
2013-07-28 14:31:07 +02:00
|
|
|
// UI update
|
2013-07-30 04:07:46 +02:00
|
|
|
uiUpdateConstant = 44100 / 30;
|
2013-07-28 14:31:07 +02:00
|
|
|
uiUpdateCounter = 44100 / 30;
|
2013-07-28 15:20:54 +02:00
|
|
|
|
2013-07-30 01:56:13 +02:00
|
|
|
_toReverb = 0.0;
|
|
|
|
_toMaster = 0.8;
|
|
|
|
_toSidechain = 0.0;
|
|
|
|
_toPostSidechain = 0.0;
|
2013-07-28 14:31:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// set main mix, 0-1
|
|
|
|
void setMaster(float value)
|
|
|
|
{
|
2013-07-28 15:56:34 +02:00
|
|
|
_toMaster = value;
|
2013-07-28 14:31:07 +02:00
|
|
|
}
|
2013-08-05 14:28:43 +02:00
|
|
|
|
|
|
|
/// set send
|
|
|
|
void setSend( int send, float value )
|
2013-07-28 14:31:07 +02:00
|
|
|
{
|
2013-08-05 14:28:43 +02:00
|
|
|
switch( send )
|
|
|
|
{
|
|
|
|
case SEND_REV:
|
|
|
|
_toReverb = value;
|
|
|
|
break;
|
|
|
|
case SEND_SIDE:
|
|
|
|
_toSidechain = value;
|
|
|
|
break;
|
|
|
|
case SEND_POST:
|
|
|
|
_toPostSidechain = value;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2013-07-27 23:36:58 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/// copies the track output to master buffer, sidechain & post-side buffer
|
|
|
|
void process(int nframes, Buffers* buffers)
|
|
|
|
{
|
2013-08-06 22:55:57 +02:00
|
|
|
/*
|
2013-07-31 03:48:59 +02:00
|
|
|
// zero track buffer
|
2013-08-06 22:55:57 +02:00
|
|
|
float* buf = &_trackBuffer[0];
|
2013-07-31 03:48:59 +02:00
|
|
|
for(int i = 0; i < nframes; i++ )
|
|
|
|
{
|
|
|
|
*buf++ = 0.f;
|
|
|
|
}
|
2013-08-06 22:55:57 +02:00
|
|
|
*/
|
|
|
|
|
|
|
|
memset( &_trackBuffer[0], 0, nframes );
|
2013-07-31 03:48:59 +02:00
|
|
|
|
2013-07-28 14:14:25 +02:00
|
|
|
if ( previousInChain )
|
|
|
|
{
|
2013-08-06 22:55:57 +02:00
|
|
|
buffers->audio[Buffers::TRACK_0 + track] = &_trackBuffer[0];
|
2013-07-28 14:14:25 +02:00
|
|
|
previousInChain->process( nframes, buffers );
|
|
|
|
}
|
2013-07-27 23:36:58 +02:00
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
/*
|
2013-07-31 03:48:59 +02:00
|
|
|
// run the meter
|
|
|
|
buf = _trackBuffer;
|
2013-07-28 14:31:07 +02:00
|
|
|
dbMeter.process( nframes, buf, buf );
|
|
|
|
|
|
|
|
if (uiUpdateCounter > uiUpdateConstant )
|
|
|
|
{
|
2013-08-06 22:55:57 +02:00
|
|
|
// FIXME: should be using ControllerUpdater
|
2013-07-31 03:48:59 +02:00
|
|
|
EventTrackSignalLevel e( track, dbMeter.getLeftDB() * _toMaster, dbMeter.getRightDB() * _toMaster );
|
2013-07-30 04:07:46 +02:00
|
|
|
writeToGuiRingbuffer( &e );
|
2013-07-28 14:31:07 +02:00
|
|
|
uiUpdateCounter = 0;
|
|
|
|
}
|
|
|
|
uiUpdateCounter += nframes;
|
2013-08-06 22:55:57 +02:00
|
|
|
*/
|
2013-07-28 14:42:05 +02:00
|
|
|
|
|
|
|
/// copy audio data into reverb / sidechain / master buffers
|
|
|
|
float* trackBuf = buffers->audio[Buffers::TRACK_0 + track];
|
|
|
|
float* reverb = buffers->audio[Buffers::REVERB];
|
|
|
|
float* sidechain = buffers->audio[Buffers::SIDECHAIN];
|
|
|
|
float* postSidechain = buffers->audio[Buffers::POST_SIDECHAIN];
|
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
float* masterL = buffers->audio[Buffers::MASTER_OUT_L];
|
|
|
|
float* masterR = buffers->audio[Buffers::MASTER_OUT_R];
|
2013-07-30 01:56:13 +02:00
|
|
|
|
2013-07-27 23:36:58 +02:00
|
|
|
for(int i = 0; i < nframes; i++)
|
|
|
|
{
|
2013-08-06 22:55:57 +02:00
|
|
|
float tmp = _trackBuffer[i];
|
2013-07-31 12:34:28 +02:00
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
*masterR++ += tmp; // * _toMaster;
|
|
|
|
*masterL++ += tmp; // * _toMaster;
|
2013-07-31 12:34:28 +02:00
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
//*reverb++ += tmp * _toReverb;
|
2013-07-31 12:34:28 +02:00
|
|
|
//*sidechain++ += tmp * _toSidechain;
|
|
|
|
//*postSidechain++ += tmp * _toPostSidechain;
|
2013-07-28 14:31:07 +02:00
|
|
|
|
2013-07-30 01:56:13 +02:00
|
|
|
|
2013-07-28 14:42:05 +02:00
|
|
|
trackBuf++;
|
2013-07-27 23:36:58 +02:00
|
|
|
}
|
2013-07-31 03:48:59 +02:00
|
|
|
|
2013-07-27 23:36:58 +02:00
|
|
|
}
|
2013-07-31 03:27:27 +02:00
|
|
|
|
|
|
|
~TrackOutput()
|
|
|
|
{
|
|
|
|
}
|
2013-07-27 23:36:58 +02:00
|
|
|
|
|
|
|
private:
|
|
|
|
int track;
|
|
|
|
|
2013-08-06 22:55:57 +02:00
|
|
|
std::vector<float> _trackBuffer;
|
2013-07-31 03:27:27 +02:00
|
|
|
|
2013-07-27 23:36:58 +02:00
|
|
|
float _toMaster;
|
|
|
|
|
|
|
|
float _toReverb;
|
|
|
|
float _toSidechain;
|
|
|
|
float _toPostSidechain;
|
|
|
|
|
|
|
|
/// Pointer to "previous" processor: the graph is backwards
|
|
|
|
AudioProcessor* previousInChain;
|
2013-07-28 14:31:07 +02:00
|
|
|
|
|
|
|
// Metering variables
|
|
|
|
long uiUpdateCounter;
|
|
|
|
long uiUpdateConstant;
|
|
|
|
DBMeter dbMeter;
|
2013-07-27 23:36:58 +02:00
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
#endif // LUPPP_TRACK_OUTPUT_H
|
|
|
|
|