change vims macro/keystroke recorder (keep repeating), added todo's

This commit is contained in:
niels
2015-08-05 22:58:16 +02:00
parent 5f202a28b1
commit 3f601e3669
3 changed files with 82 additions and 85 deletions

View File

@@ -189,6 +189,11 @@ void veejay_backtrace_handler(int n , void *dist, void *x)
exit(EX_SOFTWARE); exit(EX_SOFTWARE);
} }
int veejay_get_debug_level()
{
return _debug_level;
}
void veejay_set_debug_level(int level) void veejay_set_debug_level(int level)
{ {
if(level) if(level)

View File

@@ -35,6 +35,7 @@ extern void report_bug();
extern void veejay_msg(int type, const char format[], ...); extern void veejay_msg(int type, const char format[], ...);
extern int veejay_is_colored(); extern int veejay_is_colored();
extern void veejay_set_debug_level(int level); extern void veejay_set_debug_level(int level);
extern int veejay_get_debug_level();
extern void veejay_set_colors(int level); extern void veejay_set_colors(int level);
extern void veejay_silent(); extern void veejay_silent();
extern int veejay_is_silent(); extern int veejay_is_silent();

View File

@@ -137,21 +137,38 @@ static char *get_print_buf(int size) {
char *res = (char*) vj_calloc(sizeof(char) * s ); char *res = (char*) vj_calloc(sizeof(char) * s );
return res; return res;
} }
/**
* MACRO|keystrokes|VIMS macro
*
* macro banks are selected by [CTRL] + [F1...F12] (or via VIMS 34)
*
* depending on macro_status, we are:
* 0 : stopped
* 1 : recording VIMS events
* 2 : playing VIMS events
*
* the messages are indexed by frame_position and slow_multiplier
* MAX_MACROS messages can be stored per keyframe
*
* the playback resumes from where you have started the macro recorder
* the reset function clears all macro banks
*
* TODO clear selected macro slot instead of clear all
* TODO play all macro banks simultaneously (instead of playing only selected bank)
* TODO play macro once (instead of looping)
* TODO reloaded select macro bank / macro tabbed page | VIMS getters/setters etc
* TODO once macro is done, FX configuration is not restored
*/
#define MAX_MACRO_BANKS 12 #define MAX_MACRO_BANKS 12
static void *macro_bank_[MAX_MACRO_BANKS]; static void *macro_bank_[MAX_MACRO_BANKS];
static void *macro_port_ = NULL; static void *macro_port_ = NULL;
static int current_macro_ = 0; static int current_macro_ = 0;
static int macro_status_ = 0; static int macro_status_ = 0;
static int macro_line_[3] = {-1 ,0,0}; static int macro_line_[3] = {-1 ,0,0};
static int macro_current_age_ = 0; #define MAX_MACROS 16
static int macro_expected_age_ = 0;
#define MAX_MACROS 8
typedef struct { typedef struct {
char *msg[MAX_MACROS]; char *msg[MAX_MACROS];
int pending[MAX_MACROS];
int age[MAX_MACROS];
} macro_block_t; } macro_block_t;
int vj_event_macro_status(void) int vj_event_macro_status(void)
@@ -159,10 +176,10 @@ int vj_event_macro_status(void)
return macro_status_; return macro_status_;
} }
static char *retrieve_macro_(veejay_t *v, long frame, int idx ); static char *retrieve_macro_(veejay_t *v,int idx, char *key );
static void store_macro_( veejay_t *v,char *str, long frame ); static void store_macro_( veejay_t *v,char *str, long frame );
static void reset_macro_(void); static void reset_macro_(void);
static void replay_macro_(void); static void display_replay_macro_(void);
extern void veejay_pipe_write_status(veejay_t *info); extern void veejay_pipe_write_status(veejay_t *info);
extern int _vj_server_del_client(vj_server * vje, int link_id); extern int _vj_server_del_client(vj_server * vje, int link_id);
@@ -547,31 +564,24 @@ static void macro_select( int slot )
{ {
if( slot >= 0 && slot < MAX_MACRO_BANKS ) if( slot >= 0 && slot < MAX_MACRO_BANKS )
{ {
macro_bank_[ current_macro_ ] = macro_port_; void *oldptr = macro_bank_[ current_macro_ ];
int old = current_macro_;
if(macro_bank_[slot] == NULL ) {
macro_bank_[slot] = vpn( VEVO_ANONYMOUS_PORT );
if(!macro_bank_[slot]) {
veejay_msg(0,"Unable to get port for macro slot %d", slot );
slot = old;
macro_bank_[old] = oldptr;
}
}
current_macro_ = slot; current_macro_ = slot;
macro_port_ = macro_bank_[ current_macro_ ]; macro_port_ = macro_bank_[slot];
if( !macro_port_ )
{
if( macro_status_ == 1 )
{
veejay_msg(VEEJAY_MSG_INFO,
"Continuing recording keystrokes in slot %d", current_macro_);
macro_bank_[ current_macro_ ] =
vpn(VEVO_ANONYMOUS_PORT );
macro_port_ = macro_bank_[ current_macro_ ];
}
else if (macro_status_ == 2 )
{
veejay_msg(VEEJAY_MSG_INFO,
"No keystrokes found in slot %d", current_macro_);
}
}
macro_current_age_ = 0;
macro_expected_age_ = 0;
} }
} }
static void replay_macro_(void) static void display_replay_macro_(void)
{ {
int i,k; int i,k;
char **items; char **items;
@@ -591,13 +601,15 @@ static void replay_macro_(void)
macro_block_t *m = (macro_block_t*) mb; macro_block_t *m = (macro_block_t*) mb;
for( i = 0; i < MAX_MACROS; i ++ ) for( i = 0; i < MAX_MACROS; i ++ )
{ {
if(m->msg[i]) { m->pending[i] = 1; strokes ++; } if(m->msg[i]) {
veejay_msg(VEEJAY_MSG_DEBUG,"\tVIMS [%s] at macro %s",m->msg[i],items[k]);
strokes ++;
}
} }
} }
free(items[k]); free(items[k]);
} }
veejay_msg(VEEJAY_MSG_INFO, "Replay %d keystrokes in macro slot %d!", strokes, veejay_msg(VEEJAY_MSG_INFO, "Replay %d VIMS messages in macro bank %d!", strokes,current_macro_ );
current_macro_ );
free(items); free(items);
} }
} }
@@ -626,7 +638,7 @@ static void reset_macro_(void)
} }
free(items[k]); free(items[k]);
} }
veejay_msg(VEEJAY_MSG_INFO, "Cleared %d keystrokes from macro slot %d", veejay_msg(VEEJAY_MSG_INFO, "VIMS Macro recorder cleared %d VIMS messages from bank %d",
strokes, current_macro_ ); strokes, current_macro_ );
free(items); free(items);
} }
@@ -635,30 +647,15 @@ static void reset_macro_(void)
macro_port_ = NULL; macro_port_ = NULL;
} }
static char *retrieve_macro_(veejay_t *v, long frame, int idx ) static char *retrieve_macro_(veejay_t *v, int idx, char *key )
{ {
void *mb = NULL; void *mb = NULL;
char key[16];
int s = 0;
if( SAMPLE_PLAYING(v))
s = sample_get_framedups( v->uc->sample_id );
else if ( PLAIN_PLAYING(v))
s = v->settings->simple_frame_dup;
snprintf(key,16,"%08ld%02d", frame,s );
int error = vevo_property_get( macro_port_, key, 0, &mb ); int error = vevo_property_get( macro_port_, key, 0, &mb );
if( error == VEVO_NO_ERROR ) if( error == VEVO_NO_ERROR )
{ {
if( idx == MAX_MACROS )
return NULL;
macro_block_t *m = (macro_block_t*) mb; macro_block_t *m = (macro_block_t*) mb;
if( m->msg[idx ] && m->pending[idx] == 1 && m->age[idx] == macro_expected_age_) if( m->msg[idx ])
{ {
m->pending[idx] = 0;
macro_expected_age_ ++;
return m->msg[idx]; return m->msg[idx];
} }
} }
@@ -676,7 +673,6 @@ static void store_macro_(veejay_t *v, char *str, long frame )
else if ( PLAIN_PLAYING(v)) else if ( PLAIN_PLAYING(v))
s = v->settings->simple_frame_dup; s = v->settings->simple_frame_dup;
snprintf(key,16,"%08ld%02d", frame,s ); snprintf(key,16,"%08ld%02d", frame,s );
int error = vevo_property_get( macro_port_, key, 0, &mb ); int error = vevo_property_get( macro_port_, key, 0, &mb );
@@ -684,9 +680,6 @@ static void store_macro_(veejay_t *v, char *str, long frame )
{ // first element { // first element
macro_block_t *m = vj_calloc( sizeof(macro_block_t)); macro_block_t *m = vj_calloc( sizeof(macro_block_t));
m->msg[0] = vj_strdup(str); m->msg[0] = vj_strdup(str);
m->pending[0] = 1;
m->age[0] = macro_current_age_;
macro_current_age_++;
vevo_property_set( macro_port_, key, VEVO_ATOM_TYPE_VOIDPTR,1,&m ); vevo_property_set( macro_port_, key, VEVO_ATOM_TYPE_VOIDPTR,1,&m );
} }
else else
@@ -698,17 +691,11 @@ static void store_macro_(veejay_t *v, char *str, long frame )
if(c->msg[k] == NULL ) if(c->msg[k] == NULL )
{ {
c->msg[k] = vj_strdup(str); c->msg[k] = vj_strdup(str);
c->pending[k] = 1;
c->age[k] = macro_current_age_;
macro_current_age_ ++;
return; return;
} }
} }
veejay_msg(VEEJAY_MSG_ERROR, "Slot for frame %ld is full (keystroke recorder)",frame ); veejay_msg(VEEJAY_MSG_ERROR, "VIMS Macro recorder reached buffer limit at frame %ld",frame );
} }
veejay_msg(0, "key = %s, '%s' %ld", key,str,frame);
} }
@@ -1731,14 +1718,23 @@ void vj_event_update_remote(void *ptr)
v->settings->is_dat = 0; v->settings->is_dat = 0;
//@ repeat macros
if(macro_status_ == 2 && macro_port_ != NULL) if(macro_status_ == 2 && macro_port_ != NULL)
{ {
int n_macro = 0; int n_macro = 0;
int s = 0;
char *macro_msg = NULL; char *macro_msg = NULL;
char key[32];
if( SAMPLE_PLAYING(v))
s = sample_get_framedups( v->uc->sample_id );
else if ( PLAIN_PLAYING(v))
s = v->settings->simple_frame_dup;
snprintf(key,sizeof(key),"%08d%02d", v->settings->current_frame_num,s );
for( n_macro = 0; n_macro < MAX_MACROS ; n_macro ++ ) for( n_macro = 0; n_macro < MAX_MACROS ; n_macro ++ )
{ {
macro_msg = retrieve_macro_( v, v->settings->current_frame_num, n_macro ); macro_msg = retrieve_macro_( v, n_macro,key );
if(macro_msg) if(macro_msg)
vj_event_parse_msg(v,macro_msg, strlen(macro_msg)); vj_event_parse_msg(v,macro_msg, strlen(macro_msg));
} }
@@ -7878,7 +7874,7 @@ void vj_event_select_macro( void *ptr, const char format[], va_list ap )
char *str = NULL; char *str = NULL;
P_A( args, str, format, ap ); P_A( args, str, format, ap );
macro_select( args[0] ); macro_select( args[0] );
veejay_msg(VEEJAY_MSG_INFO, "Changed macro slot to %d", current_macro_ ); veejay_msg(VEEJAY_MSG_INFO, "Changed VIMS macro slot to %d", current_macro_ );
} }
void vj_event_select_bank(void *ptr, const char format[], va_list ap) void vj_event_select_bank(void *ptr, const char format[], va_list ap)
@@ -10356,58 +10352,53 @@ void vj_event_set_macro_status( void *ptr, const char format[], va_list ap )
{ {
reset_macro_(); reset_macro_();
macro_status_ = 0; macro_status_ = 0;
macro_current_age_ = 0;
macro_expected_age_ = 0;
args[0] = 0; args[0] = 0;
macro_line_[0] = -1; macro_line_[0] = -1;
macro_line_[1] = 0; macro_line_[1] = 0;
macro_line_[2] = 0; macro_line_[2] = 0;
veejay_msg(VEEJAY_MSG_INFO, "Cleared all recorded keystrokes"); veejay_msg(VEEJAY_MSG_INFO, "VIMS Macro reset");
} }
if( args[0] == 0 ) if( args[0] == 0 )
{ {
if( macro_port_ ) if( macro_port_ )
{ {
macro_status_ = 0; //@ stop macro_status_ = 0;
veejay_msg(VEEJAY_MSG_INFO, "Stopped macro recorder"); veejay_msg(VEEJAY_MSG_INFO, "VIMS Macro recorder stopped");
} }
} else if (args[0] == 1 ) } else if (args[0] == 1 )
{ {
reset_macro_(); reset_macro_();
macro_port_ = vpn(VEVO_ANONYMOUS_PORT); macro_port_ = vpn(VEVO_ANONYMOUS_PORT);
macro_bank_[ current_macro_ ] = macro_port_; macro_bank_[ current_macro_ ] = macro_port_;
veejay_msg(VEEJAY_MSG_INFO , "Recording keystrokes!");
macro_status_ = 1; macro_status_ = 1;
macro_line_[0] = v->settings->current_frame_num; macro_line_[0] = v->settings->current_frame_num;
macro_line_[1] = v->uc->playback_mode; macro_line_[1] = v->uc->playback_mode;
macro_line_[2] = v->uc->sample_id; macro_line_[2] = v->uc->sample_id;
macro_current_age_ =0;
veejay_msg(VEEJAY_MSG_INFO , "VIMS Macro recorder started (replay at %x | frame %ld, id %d | bank %d)",
macro_line_[1], macro_line_[0], macro_line_[2], current_macro_);
} }
else if (args[0] == 2) else if (args[0] == 2)
{ {
if( macro_status_ == 0 && macro_port_ ) if( macro_status_ == 0 && macro_port_ )
{ {
macro_status_ = 2; macro_status_ = 2;
veejay_msg(VEEJAY_MSG_INFO, "Resume playing keystrokes"); veejay_msg(VEEJAY_MSG_INFO, "VIMS Macro resuming playback from bank %d", current_macro_);
} else if( macro_line_[0] >= 0 && macro_port_ != NULL) }
else if( macro_line_[0] >= 0 && macro_port_ != NULL)
{ {
/* if( macro_status_ == 1 )
{ //@ store current speed and direction
char last[100];
snprintf(last,100, "%03d:%d;",
VIMS_VIDEO_SET_SPEED, v->settings->current_playback_speed );
store_macro_( v, last, v->settings->current_frame_num );
}*/
macro_status_ = 2; macro_status_ = 2;
veejay_msg(VEEJAY_MSG_INFO, "Replay all keystrokes!"); veejay_msg(VEEJAY_MSG_INFO, "VIMS Macro playback (%x| frame %ld, id %d)",
macro_line_[1], macro_line_[0], macro_line_[2]);
veejay_change_playback_mode( v, macro_line_[1],macro_line_[2] ); veejay_change_playback_mode( v, macro_line_[1],macro_line_[2] );
veejay_set_frame( v, macro_line_[0] ); veejay_set_frame( v, macro_line_[0] );
macro_expected_age_ = 0; if( veejay_get_debug_level() )
replay_macro_(); display_replay_macro_();
} }
else else
{ {
veejay_msg(VEEJAY_MSG_INFO, "No keystrokes to playback!"); veejay_msg(VEEJAY_MSG_INFO, "VIMS Macro has nothing to playback");
veejay_msg(VEEJAY_MSG_INFO, "Use CAPS-LOCK modifier to jump to next or previous sample."); veejay_msg(VEEJAY_MSG_INFO, "Use CAPS-LOCK modifier to jump to next or previous sample.");
} }
} }