-Implementing TimeManager class, using Observer pattern for updates

main
Harry van Haaren 2013-05-14 00:03:43 +01:00
parent 24bf134736
commit 7061eaa173
4 changed files with 93 additions and 9 deletions

View File

@ -2,6 +2,8 @@
#ifndef LUPPP_BUFFERS_H #ifndef LUPPP_BUFFERS_H
#define LUPPP_BUFFERS_H #define LUPPP_BUFFERS_H
#include <jack/transport.h>
class Buffers class Buffers
{ {
public: public:
@ -15,6 +17,15 @@ class Buffers
MASTER_OUTPUT = 0, MASTER_OUTPUT = 0,
MASTER_INPUT, MASTER_INPUT,
}; };
// Jack details
jack_nframes_t nframes;
jack_nframes_t samplerate;
jack_nframes_t transportFrame;
jack_position_t transportPosition;
jack_transport_state_t transportState;
}; };
#endif // LUPPP_BUFFERS_H #endif // LUPPP_BUFFERS_H

View File

@ -17,8 +17,8 @@ Jack::Jack()
// open the client // open the client
client = jack_client_open ( "Luppp", JackNullOption , 0 , 0 ); client = jack_client_open ( "Luppp", JackNullOption , 0 , 0 );
nframes = jack_get_buffer_size( client ); buffers.nframes = jack_get_buffer_size( client );
samplerate = jack_get_sample_rate( client ); buffers.samplerate = jack_get_sample_rate( client );
masterOutput = jack_port_register( client, masterOutput = jack_port_register( client,
"master_out", "master_out",
@ -33,12 +33,21 @@ Jack::Jack()
0 ); 0 );
if ( jack_set_process_callback( client, if ( jack_set_process_callback( client,
static_process, static_process,
static_cast<void*>(this)) ) static_cast<void*>(this)) )
{ {
cerr << "Jack() error setting process callback" << endl; cerr << "Jack() error setting process callback" << endl;
} }
if ( jack_set_timebase_callback(client,
0,
(JackTimebaseCallback)static_timebase,
static_cast<void*>(this)) )
{
cerr << "Jack() error setting timebase callback" << endl;
}
loopers.push_back( new Looper() ); loopers.push_back( new Looper() );
} }
@ -61,6 +70,7 @@ int Jack::process (jack_nframes_t nframes)
// pre-zero output buffers // pre-zero output buffers
memset( buffers.audio[Buffers::MASTER_OUTPUT], 0, sizeof(float) * nframes ); memset( buffers.audio[Buffers::MASTER_OUTPUT], 0, sizeof(float) * nframes );
loopers.at(0)->process(nframes, &buffers ); loopers.at(0)->process(nframes, &buffers );
/* /*
@ -86,11 +96,19 @@ int Jack::getSamplerate()
return jack_get_sample_rate( client ); return jack_get_sample_rate( client );
} }
int Jack::timebase(jack_transport_state_t, int Jack::timebase(jack_transport_state_t state,
jack_nframes_t, jack_nframes_t nframes,
jack_position_t*, jack_position_t* pos,
int) int newPos)
{ {
// fill buffers with data, then pass to timeManager
buffers.transportFrame = jack_get_current_transport_frame(client);
buffers.transportPosition = *pos;
buffers.transportState = state;
// update "time" from JACK master, or write master?
timeManager.process( &buffers );
return 0; return 0;
} }
@ -107,4 +125,3 @@ int Jack::static_timebase(jack_transport_state_t state,
{ {
return static_cast<Jack*>(instance)->timebase(state,nframes, pos, newPos ); return static_cast<Jack*>(instance)->timebase(state,nframes, pos, newPos );
} }

View File

@ -15,8 +15,10 @@
#include <cstring> #include <cstring>
#include <jack/jack.h> #include <jack/jack.h>
#include <jack/midiport.h> #include <jack/midiport.h>
#include <jack/transport.h>
#include "looper.hxx" #include "looper.hxx"
#include "timemanager.hxx"
using namespace std; using namespace std;
@ -36,6 +38,7 @@ class Jack
private: private:
Buffers buffers; Buffers buffers;
TimeManager timeManager;
vector<Looper*> loopers; vector<Looper*> loopers;

53
src/timemanager.hxx Normal file
View File

@ -0,0 +1,53 @@
#ifndef LUPPP_TIME_H
#define LUPPP_TIME_H
#include <iostream>
#include "buffers.hxx"
using namespace std;
// inherits from ObserverSubject
class TimeManager
{
public:
TimeManager()
{
}
void process(Buffers* buffers)
{
float bpm = 120;
int framesPerBeat = (int) samplerate / (bpm / 60.0);
// divide by zero errors!
if ( framesPerBeat > 0 )
{
int newBeat = buffers->transportFrame / framesPerBeat;
}
//cout << buffers->transportPosition.frame << endl;
}
private:
int samplerate;
// list of Observers of this TimeManager Subject, "beat", "bar" updates?
/*
for(int i = 0; i < numObservers; i++ )
{
observers[i]->notifyNewBeat(int beat);
}
if ( bar != oldBar )
{
for(int i = 0; i < numObservers; i++ )
{
observers[i]->notifyNewBar(int bar);
}
}
*/
};
#endif // LUPPP_TIME_H