mirror of
https://github.com/game-stop/veejay.git
synced 2025-12-17 05:10:00 +01:00
change vims macro/keystroke recorder (keep repeating), added todo's
This commit is contained in:
@@ -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)
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user