fix issue #119, keep rendering FX chain on pause, evaluate speed of mixing sample instead of top sample, use resume position instead of starting position where necessary (resume position falls to start position if not set), set resume position after frame increment

This commit is contained in:
c0ntrol
2018-10-06 17:22:25 +02:00
parent 41437f5138
commit 388fe062bc
3 changed files with 54 additions and 48 deletions

View File

@@ -290,6 +290,7 @@ int veejay_set_speed(veejay_t * info, int speed)
}
if(sample_set_speed(info->uc->sample_id, speed) != -1)
settings->current_playback_speed = speed;
break;
case VJ_PLAYBACK_MODE_TAG:
@@ -328,11 +329,7 @@ int veejay_hold_frame(veejay_t * info, int rel_resume_pos, int hold_pos)
static void veejay_sample_resume_at( veejay_t *info, int cur_id )
{
long pos = 0;
if( info->settings->sample_restart )
pos = sample_get_startFrame( cur_id );
else
pos = sample_get_resume( cur_id );
long pos = sample_get_resume(cur_id);
veejay_set_frame(info, pos );
veejay_msg(VEEJAY_MSG_DEBUG, "Sample %d continues with frame %d", cur_id, pos );
}
@@ -568,7 +565,6 @@ static int veejay_stop_playing_sample( veejay_t *info, int new_sample_id )
sample_chain_free( info->uc->sample_id,0);
sample_set_framedups(info->uc->sample_id,0);
sample_set_resume(info->uc->sample_id, info->settings->current_frame_num );
return 1;
}
@@ -651,7 +647,7 @@ static int veejay_start_playing_sample( veejay_t *info, int sample_id )
if( speed != 0 )
settings->previous_playback_speed = speed;
veejay_set_speed(info, speed);
veejay_set_speed(info, speed);
veejay_msg(VEEJAY_MSG_INFO, "Playing sample %d (FX=%x, Sl=%d, Speed=%d, Start=%d, Loop=%d)",
sample_id, tmp,info->sfd, speed, start, looptype );
@@ -725,7 +721,7 @@ void veejay_change_playback_mode( veejay_t *info, int new_pm, int sample_id )
{
if( info->settings->sample_restart )
{
long pos = sample_get_startFrame( cur_id );
long pos = sample_get_resume( cur_id );
veejay_set_frame(info, pos );
@@ -2931,7 +2927,7 @@ veejay_t *veejay_malloc()
veejay_msg(VEEJAY_MSG_DEBUG, "env VEEJAY_FULLSCREEN=[0|1] not set");
}
info->pause_render = 1;// old behaviour was always to pause everything on speed=0
info->pause_render = 0;
char *pausefl = getenv( "VEEJAY_PAUSE_EVERYTHING" );
if( pausefl ) {
int val = 0;

View File

@@ -4434,8 +4434,9 @@ void vj_event_sample_rec_start( void *ptr, const char format[], va_list ap)
}
else
{
veejay_set_frame(v, sample_get_startFrame(v->uc->sample_id));
v->seq->rec_id = 0;
//veejay_set_frame(v, sample_get_startFrame(v->uc->sample_id));
veejay_set_frame(v, sample_get_resume(v->uc->sample_id));
v->seq->rec_id = 0;
}
}
@@ -5660,7 +5661,7 @@ void vj_event_chain_entry_src_toggle(void *ptr, const char format[], va_list ap)
veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d", entry,(src==VJ_TAG_TYPE_NONE ? "Sample":"Stream"), cha);
if(v->no_bezerk)
{
veejay_set_frame(v, sample_get_startFrame(v->uc->sample_id));
veejay_set_frame(v, sample_get_resume(v->uc->sample_id));
}
}
@@ -5765,7 +5766,7 @@ void vj_event_chain_entry_source(void *ptr, const char format[], va_list ap)
if(v->no_bezerk)
{
veejay_set_frame(v,
sample_get_startFrame(args[0]));
sample_get_resume(args[0]));
}
}
@@ -5880,7 +5881,7 @@ void vj_event_chain_entry_channel_dec(void *ptr, const char format[], va_list ap
(src==VJ_TAG_TYPE_NONE ? "Sample" : "Stream"),cha);
if(v->no_bezerk)
veejay_set_frame(v , sample_get_startFrame(v->uc->sample_id));
veejay_set_frame(v , sample_get_resume(v->uc->sample_id));
}
if(STREAM_PLAYING(v))
{
@@ -5976,7 +5977,7 @@ void vj_event_chain_entry_channel_inc(void *ptr, const char format[], va_list ap
veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d",entry,
(src==VJ_TAG_TYPE_NONE ? "Sample" : "Stream"),cha);
// if(v->no_bezerk) veejay_set_sample(v, v->uc->sample_id);
if(v->no_bezerk) veejay_set_frame(v,sample_get_startFrame(v->uc->sample_id));
if(v->no_bezerk) veejay_set_frame(v,sample_get_resume(v->uc->sample_id));
}
if(STREAM_PLAYING(v))
@@ -7682,10 +7683,7 @@ void vj_event_effect_add(void *ptr, const char format[], va_list ap)
);
if(v->no_bezerk && vj_effect_get_extra_frame(real_id) )
{
//veejay_set_sample(v,v->uc->sample_id);
//
int nf = sample_get_startFrame( v->uc->sample_id );
veejay_set_frame(v,nf );
veejay_set_frame(v,sample_get_resume(v->uc->sample_id));
}
v->uc->chain_changed = 1;
}

View File

@@ -284,7 +284,7 @@ static int vj_perform_increase_tag_frame(veejay_t * info, long num)
settings->current_playback_speed =
+(settings->current_playback_speed);
}
return -1;
return 0;
}
if( info->seq->active ) {
@@ -298,9 +298,10 @@ static int vj_perform_increase_tag_frame(veejay_t * info, long num)
}
if (settings->current_frame_num >= settings->max_frame_num) {
settings->current_frame_num = settings->min_frame_num;
return -1;
settings->current_frame_num = settings->min_frame_num;
return 0;
}
return 0;
}
@@ -311,25 +312,26 @@ static int vj_perform_increase_plain_frame(veejay_t * info, long num)
settings->simple_frame_dup ++;
if (settings->simple_frame_dup >= info->sfd) {
settings->current_frame_num += num;
settings->simple_frame_dup = 0;
settings->current_frame_num += num;
settings->simple_frame_dup = 0;
}
// auto loop plain mode
// auto loop plain mode
if (settings->current_frame_num < settings->min_frame_num) {
settings->current_frame_num = settings->max_frame_num;
return 0;
settings->current_frame_num = settings->max_frame_num;
return 0;
}
if (settings->current_frame_num > settings->max_frame_num) {
if(!info->continuous)
{
veejay_msg(VEEJAY_MSG_DEBUG, "Reached end of video - Ending veejay session ... ");
veejay_change_state(info, LAVPLAY_STATE_STOP);
}
settings->current_frame_num = settings->min_frame_num;
return 0;
if(!info->continuous)
{
veejay_msg(VEEJAY_MSG_DEBUG, "Reached end of video - Ending veejay session ... ");
veejay_change_state(info, LAVPLAY_STATE_STOP);
}
settings->current_frame_num = settings->min_frame_num;
return 0;
}
return 0;
}
@@ -403,9 +405,11 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num)
{
video_playback_setup *settings = (video_playback_setup *) info->settings;
int start,end,looptype,speed;
int ret_val = 1;
if(sample_get_short_info(info->uc->sample_id,&start,&end,&looptype,&speed)!=0) return -1;
if(sample_get_short_info(info->uc->sample_id,&start,&end,&looptype,&speed)!=0) {
veejay_msg(0, "Sample %d no longer exists ?! Unable to queue frame", info->uc->sample_id);
return -1;
}
settings->current_playback_speed = speed;
@@ -424,13 +428,18 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num)
sample_set_framedups( info->uc->sample_id , cur_sfd);
if( cur_sfd != 0 )
return 1;
return 0;
}
settings->current_frame_num += num;
sample_set_resume( info->uc->sample_id, settings->current_frame_num );
if( num == 0 )
return 1;
return 0;
if (speed >= 0) { /* forward play */
@@ -534,11 +543,13 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num)
}
}
}
// sample_update_offset( info->uc->sample_id, settings->current_frame_num );
// sample_update_offset( info->uc->sample_id, settings->current_frame_num );
sample_set_resume( info->uc->sample_id, settings->current_frame_num );
vj_perform_rand_update( info );
vj_perform_rand_update( info );
return ret_val;
return 0;
}
static long vj_perform_alloc_row(veejay_t *info, int c, int plane_len)
@@ -1512,7 +1523,7 @@ static int vj_perform_get_subframe(veejay_t * info, int this_sample_id, int sub_
if(sample_get_short_info(a,&sample_a[0],&sample_a[1],&sample_a[2],&sample_a[3])!=0) return -1;
if( info->settings->current_playback_speed == 0 )
if( sample_b[3] == 0 )
{
return sample_b[0] + offset;
}
@@ -1618,7 +1629,7 @@ static int vj_perform_get_subframe_tag(veejay_t * info, int sub_sample, int chai
if(sample_get_short_info(sub_sample,&sample[0],&sample[1],&sample[2],&sample[3])!=0) return -1;
if( info->settings->current_playback_speed == 0 )
if( sample[3] == 0 )
{
return sample[0] + offset;
}
@@ -3876,6 +3887,7 @@ int vj_perform_queue_video_frame(veejay_t *info, const int skip_incr)
int vj_perform_queue_frame(veejay_t * info, int skip )
{
video_playback_setup *settings = (video_playback_setup*) info->settings;
int ret_val = 0;
if( pvar_.follow_run ) {
veejay_msg(VEEJAY_MSG_DEBUG, "Following to [%d,%d]", pvar_.follow_now[0], pvar_.follow_now[1] );
@@ -3915,13 +3927,13 @@ int vj_perform_queue_frame(veejay_t * info, int skip )
switch(info->uc->playback_mode)
{
case VJ_PLAYBACK_MODE_TAG:
vj_perform_increase_tag_frame(info, speed);
ret_val = vj_perform_increase_tag_frame(info, speed);
break;
case VJ_PLAYBACK_MODE_SAMPLE:
vj_perform_increase_sample_frame(info, speed);
ret_val = vj_perform_increase_sample_frame(info, speed);
break;
case VJ_PLAYBACK_MODE_PLAIN:
vj_perform_increase_plain_frame(info, speed);
ret_val = vj_perform_increase_plain_frame(info, speed);
break;
default:
break;
@@ -3935,7 +3947,7 @@ int vj_perform_queue_frame(veejay_t * info, int skip )
settings->cycle_count[1] ++;
}
return 0;
return ret_val;
}
static int track_dup = 0;