add support for transitions to streams (limited to 0 loops and bound by dummy frame length value)

This commit is contained in:
c0ntrol
2019-01-17 23:04:30 +01:00
parent 10fba9d6aa
commit 23e637e587
2 changed files with 92 additions and 2 deletions

View File

@@ -2164,6 +2164,8 @@ int vj_tag_set_effect(int t1, int position, int effect_id)
if( vj_effect_single_instance( effect_id ))
return 0;
veejay_memset( &(tag->effect_chain[position]->transition), 0 ,sizeof(transition_eff));
if( tag->effect_chain[position]->effect_id != -1 && tag->effect_chain[position]->effect_id != effect_id )
{
//verify if the effect should be discarded
@@ -2251,6 +2253,87 @@ int vj_tag_set_effect(int t1, int position, int effect_id)
return 1;
}
int vj_tag_chain_entry_set_transition_stop(int t1, int entry, int enabled, int loop_at, int frame_pos) {
vj_tag *tag = vj_tag_get(t1);
if(!tag)
return 0;
if( tag->effect_chain[entry]->effect_id <= 0 )
return 0;
int arg_len = 0;
int is_mixer = 0;
vj_effect_get_info( tag->effect_chain[entry]->effect_id, &is_mixer, &arg_len );
if(!is_mixer || arg_len <= 0)
return 0;
if( enabled == 1 ) {
if( vj_tag_get_all_effect_args( t1, entry, tag->effect_chain[entry]->transition.args, arg_len, frame_pos ) == -1 )
return 0;
tag->effect_chain[entry]->transition.at_loop = loop_at;
tag->effect_chain[entry]->transition.enabled = 1;
}
else {
for( int i = 0; i < SAMPLE_MAX_PARAMETERS; i ++ ) {
tag->effect_chain[entry]->transition.args[i] = 0;
}
tag->effect_chain[entry]->transition.at_loop = -1;
tag->effect_chain[entry]->transition.enabled = 0;
}
return 1;
}
int vj_tag_chain_entry_transition_now(int t1, int entry, int *type) {
vj_tag *tag = vj_tag_get(t1);
if(!tag)
return 0;
if( tag->effect_chain[entry]->effect_id <= 0 )
return 0;
int arg_len = 0;
int is_mixer = 0;
vj_effect_get_info( tag->effect_chain[entry]->effect_id, &is_mixer, &arg_len );
if( is_mixer == 0 || arg_len == 0 )
return 0;
if( tag->effect_chain[entry]->transition.enabled == 0 )
return 0;
// These type of FX know when the transition is done
int state = vj_effect_is_transition_ready(
tag->effect_chain[entry]->effect_id,
_tag_info->effect_frame1->width,
_tag_info->effect_frame1->height );
if(state == TRANSITION_COMPLETED) {
if( tag->loop_stat < tag->effect_chain[entry]->transition.at_loop )
return 0;
*type = tag->effect_chain[entry]->source_type;
return tag->effect_chain[entry]->channel;
} else if(state == TRANSITION_RUNNING) {
return 0;
}
// Any other FX, the user can define the transition by defining parameter values
for( int i = 0;i < arg_len; i ++ ) {
if( tag->effect_chain[entry]->arg[i] < tag->effect_chain[entry]->transition.args[i] ) {
return 0;
}
}
if( tag->loop_stat < tag->effect_chain[entry]->transition.at_loop )
return 0;
*type = tag->effect_chain[entry]->source_type;
return tag->effect_chain[entry]->channel;
}
int vj_tag_has_cali_fx( int t1 ) {
vj_tag *tag = vj_tag_get(t1);
if (!tag)
@@ -2778,9 +2861,14 @@ int vj_tag_chain_remove(int t1, int index)
tag->effect_chain[index]->source_type = 1;
tag->effect_chain[index]->channel = t1; //set to self
tag->effect_chain[index]->transition.enabled = 0;
tag->effect_chain[index]->transition.at_loop = 0;
int j;
for (j = 0; j < SAMPLE_MAX_PARAMETERS; j++)
for (j = 0; j < SAMPLE_MAX_PARAMETERS; j++) {
tag->effect_chain[index]->arg[j] = 0;
tag->effect_chain[index]->transition.args[j] = 0;
}
if( index == tag->fade_entry )
tag->fade_entry = -1;

View File

@@ -373,6 +373,8 @@ int vj_tag_has_cali_fx( int t1 );
int vj_tag_cali_write_file( int t1, char *name, editlist *el );
uint8_t *vj_tag_get_cali_data( int t1, int what );
void vj_tag_set_chain_paused(int t1, int paused);
int vj_tag_chain_entry_transition_now(int s1, int entry, int *type);
int vj_tag_chain_entry_set_transition_stop(int s1, int entry, int enabled, int loop_at, int frame_pos);
#ifdef HAVE_XML2
void tag_writeStream( char *file, int n, xmlNodePtr node, void *font, void *vp);