An event aproach.

This commit is contained in:
Valentin Boettcher 2018-03-31 19:37:44 +02:00
parent 185e842412
commit 6a4188dbb7
10 changed files with 81 additions and 99 deletions

View file

@ -17,6 +17,7 @@
*/
#include "audiobuffer.hxx"
#include "eventhandler.hxx"
#include "config.hxx"
#include <stdio.h>

View file

@ -62,10 +62,6 @@ ClipSelector::ClipSelector( int _x, int _y, int _w, int _h,
void ClipSelector::setID( int id )
{
ID = id;
if(!_master){
EventGridInit e (clips, numClips, ID);
writeToDspRingbuffer( &e );
}
}
@ -91,7 +87,12 @@ std::string ClipSelector::clipName(int clip)
void ClipSelector::clipName(int clip, std::string name)
{
clips[clip].setName( name );
redraw();
redraw();
}
void ClipSelector::setClipBeats(int scene, int beats, bool isBeatsToRecord)
{
clips[scene].setBeats(beats, isBeatsToRecord);
}
void ClipSelector::setSpecial(int scene)
@ -423,7 +424,18 @@ int ClipSelector::handle(int event)
return 0;
default:
return Fl_Widget::handle(event);
}
}
}
void ClipState::setBeats(int beats, bool isBarsToRecord)
{
if(beats > 0) {
barsText = std::to_string(beats/4);
if(isBarsToRecord)
barsText = "(" + barsText + ")";
}
else
barsText = std::string("");
}
} // Avtk

View file

@ -41,9 +41,9 @@ class ClipState
public:
ClipState() :
state(GridLogic::STATE_EMPTY),
name(""),
lclip(0) // I would use nullptr, but thats not common here...
{}
name(""),
barsText("")
{}
void setName(std::string n)
{
@ -65,33 +65,15 @@ public:
return state;
}
void setLooperClip(LooperClip* lc){
lclip = lc;
}
// we wrap it here, so there may be no
// fuzz with the looperclip
const char * getBarsString(){
if(!lclip)
return 0;
int beats = lclip->getBeats();
int barsToRecord = lclip->getBarsToRecord();
int bars = (beats == 0) ? barsToRecord : beats / 4;
if (bars <= 0)
return 0;
if(bars != lastBars)
barsText = std::to_string(bars);
void setBeats(int beats, bool isBarsToRecord);
const char * getBarsString(){
return barsText.c_str();
}
private:
GridLogic::State state;
GridLogic::State state;
std::string name;
LooperClip* lclip;
std::string barsText;
// tmp
@ -127,6 +109,8 @@ public:
void setState( int clipNum, GridLogic::State s );
void clipName(int clip, std::string name);
void setClipBeats(int scene, int beats, bool isBeatsToRecord);
std::string clipName(int clip);
void draw();

View file

@ -35,10 +35,6 @@
using namespace std;
namespace Avtk {
class ClipState;
}
namespace Event
{
enum SEND_TYPE {
@ -82,7 +78,6 @@ enum EVENT_TYPE {
GRID_SELECT_CLIP_ENABLE, // enable selecting a clip from the grid
GRID_SELECT_CLIP_EVENT, // a press / release on the selected clip
GRID_SELECT_NEW_CHOSEN, // a different clip is now "special"
GRID_INIT, // init the cells with references to the looper clips
/// Track
TRACK_JACKSEND,
@ -132,6 +127,9 @@ enum EVENT_TYPE {
// for keeping loop index's inside the enum
EVENT_TYPE_FINAL,
// Clip
CLIP_BEATS_CHANGED,
};
/// returns the pretty name of an event
@ -604,26 +602,6 @@ public:
EventStateSaveFinish() {};
};
class EventGridInit : public EventBase
{
public:
int type()
{
return int(GRID_INIT);
}
uint32_t size()
{
return sizeof(EventGridInit);
}
Avtk::ClipState *clips;
int numClips;
int track;
EventGridInit() {};
EventGridInit(Avtk::ClipState * c, int n, int t): clips(c), numClips(n), track(t) {}
};
class EventGridEvent : public EventBase
{
public:
@ -1196,6 +1174,27 @@ public:
}
};
class EventClipBeatsChanged : public EventBase
{
public:
int type()
{
return int(CLIP_BEATS_CHANGED);
}
uint32_t size()
{
return sizeof(EventClipBeatsChanged);
}
int track;
int scene;
int beats;
bool isBeatsToRecord;
EventClipBeatsChanged() {}
EventClipBeatsChanged(int t, int s, int b, bool i) : track(t), scene(s), beats(b), isBeatsToRecord(i) {}
};
#endif // LUPPP_EVENT_H

View file

@ -171,15 +171,7 @@ void handleDspEvents()
break;
}
// ========= GRID =====
case Event::GRID_INIT: {
if ( availableRead >= sizeof(EventGridInit) ) {
EventGridInit ev;
jack_ringbuffer_read( rbToDsp, (char*)&ev, sizeof(EventGridInit) );
jack->getLogic()->setupClips( ev.clips, ev.numClips, ev.track );
}
break;
}
// ========= GRID =====
case Event::GRID_STATE: {
if ( availableRead >= sizeof(EventGridState) ) {
EventGridState ev;
@ -484,7 +476,7 @@ void handleDspEvents()
cout << "DSP: Unkown message!! Will clog ringbuffer" << endl;
// just do nothing
break;
}
}
}
} else {
// next call will get the half-written event

View file

@ -140,13 +140,6 @@ void handleGuiEvents()
//jack->setLooperLoopLength( ev.track, ev.scale );
} break;
}
case Event::LOOPER_BARS_TO_RECORD: {
if ( availableRead >= sizeof(EventLooperLoopLength) ) {
EventLooperBarsToRecord ev;
jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventLooperBarsToRecord) );
}
break;
}
case Event::LOOPER_PROGRESS: {
if ( availableRead >= sizeof(EventLooperProgress) ) {
EventLooperProgress ev;
@ -286,6 +279,14 @@ void handleGuiEvents()
break;
}
case Event::CLIP_BEATS_CHANGED: {
if ( availableRead >= sizeof(EventClipBeatsChanged) ) {
EventClipBeatsChanged ev;
jack_ringbuffer_read( rbToGui, (char*)&ev, sizeof(EventClipBeatsChanged) );
gui->getTrack(ev.track)->getClipSelector()->setClipBeats(ev.scene, ev.beats, ev.isBeatsToRecord);
}
break;
}
case Event::TRACK_SEND: {
if ( availableRead >= sizeof(EventTrackSend) ) {
@ -297,7 +298,7 @@ void handleGuiEvents()
}
if ( ev.send == SEND_XSIDE )
if ( ev.track < NTRACKS ) {
gui->getTrack(ev.track)->setXSide( ev.value );
gui->getTrack(ev.track)->setXSide( ev.value );
}
}
break;

View file

@ -43,14 +43,14 @@ public:
void sendVolume(float vol);
private:
int m_trackid;
AudioProcessor* m_previousProcessor;
bool m_active;
float m_sendvol;
jack_port_t* m_sendport_l;
jack_port_t* m_sendport_r;
jack_port_t* m_returnport_l;
jack_port_t* m_returnport_r;
int m_trackid;
AudioProcessor* m_previousProcessor;
int m_counter;
};

View file

@ -160,19 +160,6 @@ void Logic::looperBarsToRecord(int t, int s, int b)
}
}
void Logic::setupClips(Avtk::ClipState clips[], int clipNum, int t)
{
if(!clips)
return;
Looper * looper = jack->getLooper( t );
for(int i = 0; i < clipNum; i++){
LooperClip * tmp = looper->getClip(i);
if(tmp)
clips[i].setLooperClip(tmp);
}
}
void Logic::looperUseAsTempo(int t, int s)
{
size_t clipBeats = jack->getLooper( t )->getClip( s )->getBeats();

View file

@ -64,7 +64,6 @@ public:
void looperUseAsTempo(int track, int scene);
void looperClipLenght(int track, int scene, int lenght);
void looperBarsToRecord(int track, int scene, int bars);
void setupClips(Avtk::ClipState clips[], int clipNum, int t);
};
#endif // LUPPP_LOGIC_H

View file

@ -16,8 +16,6 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "looperclip.hxx"
#include <stdio.h>
#include "config.hxx"
#include "jack.hxx"
@ -50,8 +48,9 @@ void LooperClip::init()
_queuePlay = false;
_queueStop = false;
_queueRecord= false;
_wantedBeats= -0;
_queueRecord= false;
_wantedBeats= -1;
setBeats(0);
if ( _buffer ) {
_buffer->init();
@ -115,6 +114,8 @@ void LooperClip::load( AudioBuffer* ab )
}
_buffer = ab;
EventClipBeatsChanged e( track, scene, _wantedBeats, true );
writeToGuiRingbuffer( &e );
_playhead = 0;
jack->getControllerUpdater()->setTrackSceneProgress(track, scene, 0 );
@ -182,13 +183,15 @@ void LooperClip::setPlayHead(float ph)
{
if(!_recording&&_playing) {
_playhead = ph;
jack->getControllerUpdater()->setTrackSceneProgress(track, scene, getProgress() );
jack->getControllerUpdater()->setTrackSceneProgress( track, scene, getProgress() );
}
}
void LooperClip::setBarsToRecord(int bars)
{
_wantedBeats = bars * 4; // we set bars
_wantedBeats = bars * 4; // we set beats
EventClipBeatsChanged e( track, scene, _wantedBeats, true);
writeToGuiRingbuffer(&e);
}
int LooperClip::getBeatsToRecord()
@ -252,7 +255,11 @@ void LooperClip::setBeats(int beats)
{
if ( _buffer ) {
_buffer->setBeats( beats );
}
}
// Even on Reset!
EventClipBeatsChanged e(track, scene, beats, false);
writeToGuiRingbuffer(&e);
}
int LooperClip::getBeats()
@ -284,10 +291,10 @@ void LooperClip::bar()
GridLogic::State s = GridLogic::STATE_EMPTY;
// first update the buffer, as time has passed
if ( _recording ) {
if ( _recording ) {
// FIXME: assumes 4 beats in a bar
_buffer->setBeats( _buffer->getBeats() + 4 );
_buffer->setAudioFrames( jack->getTimeManager()->getFpb() * _buffer->getBeats() );
setBeats( _buffer->getBeats() + 4 );
_buffer->setAudioFrames( jack->getTimeManager()->getFpb() * _buffer->getBeats() );
}
if ( _playhead >= _recordhead ) {