-Updated Jack to have DBMeter instances, dbMetering taking place in process(), event for signal level added & handled in GUI

This commit is contained in:
Harry van Haaren 2013-07-26 01:27:19 +01:00
parent 9337fae460
commit c9cf150841
7 changed files with 64 additions and 34 deletions

View file

@ -7,9 +7,6 @@
#include <cmath>
#include <cstdlib>
float fabsf(float dummy0);
float log10f(float dummy0);
class DBMeter
{
public:
@ -27,33 +24,28 @@ class DBMeter
int getNumInputs() { return 2;}
int getNumOutputs(){ return 2;}
// call this to get the current dB value, range = -96 -> +10
// call these to get the current dB values
float getLeftDB()
{
return fvbargraph0;
// range scale from range = -96 -> +10, to 0 -> 1
float zeroOneL = (1-(fvbargraph0 / -96.f));
return pow(zeroOneL, 4);
}
float getRightDB()
{
return fvbargraph1;
float zeroOneR = (1-(fvbargraph1 / -96.f));
return pow(zeroOneR, 4);
}
void process(int count, float** inputs, float** outputs)
void process(int count, float* inputL, float* inputR )
{
float* input0 = inputs[0];
float* input1 = inputs[1];
float* output0 = outputs[0];
float* output1 = outputs[1];
for (int i = 0; (i < count); i = (i + 1))
{
float fTemp0 = float(input0[i]);
fRec0[0] = max((fRec0[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(fTemp0))))));
fRec0[0] = max((fRec0[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(*inputL))))));
fvbargraph0 = fRec0[0];
output0[i] = float(fTemp0);
float fTemp1 = float(input1[i]);
fRec1[0] = max((fRec1[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(fTemp1))))));
fRec1[0] = max((fRec1[1] - fConst0), min(10.f, (20.f * log10f(max(1.58489e-05f, fabsf(*inputR))))));
fvbargraph1 = fRec1[0];
output1[i] = float(fTemp1);
fRec0[1] = fRec0[0];
fRec1[1] = fRec1[0];

View file

@ -19,6 +19,8 @@ namespace Event
MASTER_VOL,
RECORD,
TRACK_SIGNAL_LEVEL,
LOOPER_LOAD,
LOOPER_PLAY,
LOOPER_STATE,
@ -138,6 +140,20 @@ class EventTimeBPM : public EventBase
EventTimeBPM(float b) : bpm(b) {}
};
class EventTrackSignalLevel : public EventBase
{
public:
int type() { return int(TRACK_SIGNAL_LEVEL); }
uint32_t size() { return sizeof(EventTrackSignalLevel); }
int track;
float left;
float right;
EventTrackSignalLevel(){}
EventTrackSignalLevel(int t, float l,float r) : track(t), left(l), right(r) {}
};
class EventTimeTempoTap : public EventBase
{
public:

View file

@ -66,6 +66,12 @@ void handleGuiEvents()
gui->getTrack(ev.track)->progress.value(ev.progress);
//jack->setLooperLoopLength( ev.track, ev.scale );
} break; }
case Event::TRACK_SIGNAL_LEVEL: {
if ( availableRead >= sizeof(EventTrackSignalLevel) ) {
EventTrackSignalLevel ev;
jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventTrackSignalLevel) );
gui->getTrack(ev.track)->getVolume()->amplitude( ev.left, ev.right );
} break; }
case Event::GUI_PRINT: {
if ( availableRead >= sizeof(EventGuiPrint) ) {
EventGuiPrint ev;

View file

@ -30,6 +30,7 @@ class GTrack : public Fl_Group
{
public:
Avtk::Volume* getVolume(){return &volume;}
Avtk::ClipSelector* getClipSelector(){return &clipSel;}
GTrack(int x, int y, int w, int h, const char* l = 0 ) :

View file

@ -49,6 +49,22 @@ Jack::Jack()
JackPortIsOutput,
0 );
for(int i = 0; i < NTRACKS; i++)
{
loopers.push_back( new Looper(i) );
timeManager.registerObserver( loopers.back() );
// allocate working buffers for each track
buffers.audio[Buffers::TRACK_0 + i] = (float*) malloc( sizeof(float) * nframes );
}
for( int i = 0; i < NTRACKS; i++)
{
dbMeters.push_back( DBMeter( buffers.samplerate ) );
}
timeManager.registerObserver( &metronome );
if ( jack_set_process_callback( client,
static_process,
static_cast<void*>(this)) )
@ -63,27 +79,13 @@ Jack::Jack()
{
cerr << "Jack() error setting timebase callback" << endl;
}
for(int i = 0; i < NTRACKS; i++)
{
// allocate working buffers for each track
buffers.audio[Buffers::TRACK_0 + i] = (float*) malloc( sizeof(float) * nframes );
loopers.push_back( new Looper(i) );
timeManager.registerObserver( loopers.back() );
dbMeters.push_back( new DBMeter( buffers.samplerate ) );
}
timeManager.registerObserver( &metronome );
jack_transport_start(client);
}
void Jack::activate()
{
jack_activate( client );
jack_transport_start(client);
}
@ -150,6 +152,16 @@ int Jack::process (jack_nframes_t nframes)
*output++ = tmp;
}
// get DB readings, and send to UI
for(int n = 0; n < NTRACKS; n++)
{
// needs to be setup to handle stereo instead of mono
dbMeters.at(n).process( nframes, buffers.audio[Buffers::TRACK_0 + n], buffers.audio[Buffers::TRACK_0 + n]);
EventTrackSignalLevel e( n, dbMeters.at(n).getLeftDB(), dbMeters.at(n).getRightDB() );
writeToGuiRingbuffer( &e );
}
metronome.process( nframes, &buffers );
return false;

View file

@ -64,7 +64,8 @@ class Jack
ControllerUpdater controllerUpdater;
vector<Looper*> loopers;
vector<DBMeter*> dbMeters;
vector<DBMeter> dbMeters;
int nframes;
int samplerate;

View file

@ -37,9 +37,11 @@ int main()
jack = new Jack();
jack->activate();
gui = new Gui();
jack->activate();
gui->show();
}