diff --git a/veejay-current/veejay-server/libsample/sampleadm.c b/veejay-current/veejay-server/libsample/sampleadm.c index 077296e6..93a1af56 100644 --- a/veejay-current/veejay-server/libsample/sampleadm.c +++ b/veejay-current/veejay-server/libsample/sampleadm.c @@ -56,7 +56,6 @@ #include #include #include -//#define KAZLIB_OPAQUE_DEBUG 1 #ifdef HAVE_XML2 #endif @@ -79,6 +78,7 @@ static void *sample_font_ = NULL; static int sampleadm_state = SAMPLE_PEEK; /* default state */ static void *sample_cache[SAMPLE_MAX_SAMPLES]; static editlist *plain_editlist=NULL; +static veejay_t *veejay_info = NULL; extern void tagParseStreamFX(char *file, xmlDocPtr doc, xmlNodePtr cur, void *font, void *vp); extern void tag_writeStream( char *file, int n, xmlNodePtr node, void *font, void *vp ); @@ -246,7 +246,7 @@ void *sample_get_dict( int sample_id ) * call before using any other function as sample_skeleton_new * ****************************************************************************************************/ -int sample_init(int len, void *font, editlist *pedl) +int sample_init(int len, void *font, editlist *pedl, void *info) { if (!initialized) { veejay_memset(avail_num, 0, sizeof(avail_num)); @@ -261,7 +261,7 @@ int sample_init(int len, void *font, editlist *pedl) sample_font_ = font; plain_editlist = pedl; - + veejay_info = (veejay_t*)info; return 1; } @@ -564,8 +564,6 @@ int sample_get_longest(int sample_id) int _id=0; int speed = abs(si->speed); - si->resume_pos = ( si->speed < 0 ? end : (si->speed > 0 ? start : si->resume_pos ) ); - if( speed == 0 ) { veejay_msg(VEEJAY_MSG_WARNING, "Starting paused sample %d at normal speed from position %d", @@ -698,62 +696,6 @@ int sample_entry_set_is_rendering(int s1, int position, int value) { return 1; } -int sample_get_position(int s1) -{ - sample_info *si = sample_get(s1); - - if(!si) return 0; - - return si->offset; -} - -int sample_reset_chain_offset(int s1, int chain_entry, int s2) -{ - sample_info *si1 = sample_get(s1); - sample_info *si2 = sample_get(s2); - - if(!si1 || !si2) - return -1; - - int has_marker = si2->marker_start >= 0 && si2->marker_end > 0; - int start_frame = ( has_marker ? si2->marker_start : si2->first_frame ); - int end_frame = ( has_marker ? si2->marker_end : si2->last_frame ); - - int new_offset = start_frame; - if( si2->speed < 0 ) - new_offset = end_frame; - - si1->effect_chain[ chain_entry ]->frame_offset = new_offset; - - return 1; -} - -int sample_update_offset(int s1, int n_frame) -{ - int len; - sample_info *si = sample_get(s1); - - if(!si) return -1; - - int has_marker = si->marker_start >= 0 && si->marker_end > 0; - int start_frame = ( has_marker ? si->marker_start : si->first_frame ); - int end_frame = ( has_marker ? si->marker_end : si->last_frame ); - - si->offset = (n_frame - start_frame); - len = end_frame - start_frame; - - if(si->offset < 0) - { - si->offset = 0; - } - - if(si->offset > len) - { - si->offset = len; - } - return 1; -} - int sample_set_manual_fader( int s1, int value) { sample_info *si = sample_get(s1); @@ -1186,31 +1128,20 @@ int sample_get_chain_status(int s1, int position) return sample->effect_chain[position]->e_flag; } -void sample_update_ascociated_samples(int s1) +void sample_frame_tick() { - sample_info *sample = sample_get(s1); - if(!sample) { - return; - } - - int p = 0; - for( p = 0; p < SAMPLE_MAX_EFFECTS; p ++ ) { - if( sample->effect_chain[p]->source_type != 0 ) - continue; - if( !sample_exists(sample->effect_chain[p]->channel) ) - continue; + int end = sample_highest(); + int i; - int pos = sample->effect_chain[p]->frame_offset; - if(pos == 0 ) - continue; - - sample_set_resume( sample->effect_chain[p]->channel, pos ); - veejay_msg(VEEJAY_MSG_DEBUG, "Sample %d will resume playback from position %d", - sample->effect_chain[p]->channel, pos ); + for (i = 1; i <= end; i++) { + sample_info *sample = sample_get(i); + if(sample) { + sample->frame_tick = 0; + } } } -int sample_set_resume(int s1,long position) +int sample_set_resume_override(int s1, long position) { sample_info *sample = sample_get(s1); if(!sample) @@ -1239,9 +1170,45 @@ int sample_set_resume(int s1,long position) } } - if(sample->offset > 0) { - sample->resume_pos = sample->offset; - veejay_msg(VEEJAY_MSG_WARNING, "Check me, resume position set to offset %d", sample->resume_pos ); + sample->loop_pp = 0; + } + else { + sample->resume_pos = position; + } + + return 1; +} + +int sample_set_resume(int s1,long position) +{ + sample_info *sample = sample_get(s1); + if(!sample) + return -1; + + if( sample->frame_tick ) + return 1; // already incremented for this time period + + if(position == -1) { + int start = sample_get_startFrame(s1); + int end = sample_get_endFrame(s1); + + if( sample->speed < 0) { + if(sample->resume_pos <= start) { + sample->speed = sample->speed * -1; + sample->resume_pos = start; + } + else { + sample->resume_pos = end; + } + } + else if(sample->speed >= 0) { + if(sample->resume_pos >= end) { + sample->speed = sample->speed * -1; + sample->resume_pos = end; + } + else { + sample->resume_pos = start; + } } sample->loop_pp = 0; @@ -1249,6 +1216,9 @@ int sample_set_resume(int s1,long position) else { sample->resume_pos = position; } + + sample->frame_tick = 1; + return 1; } long sample_get_resume(int s1) @@ -1256,33 +1226,10 @@ long sample_get_resume(int s1) sample_info *sample = sample_get(s1); if(!sample) return -1; - if( sample->resume_pos < sample->first_frame ) - sample->resume_pos = sample->first_frame; - else if ( sample->resume_pos > sample->last_frame ) - sample->resume_pos = sample->last_frame; - - if( sample->marker_start >= 0 && sample->marker_end > 0 ) { - if( sample->resume_pos < sample->marker_start ) - sample->resume_pos = sample->marker_start; - else if ( sample->resume_pos > sample->marker_end ) - sample->resume_pos = sample->marker_end; - } - + return sample->resume_pos; } -int sample_get_offset(int s1, int position) -{ - sample_info *sample; - sample = sample_get(s1); - if (!sample) - return -1; - if (position >= SAMPLE_MAX_EFFECTS) - return -1; - - return sample->effect_chain[position]->frame_offset; -} - int sample_get_chain_volume(int s1, int position) { sample_info *sample; @@ -2438,43 +2385,6 @@ void sample_set_chain_paused( int s1, int paused ) } } -int sample_reset_offset(int s1) -{ - sample_info *sample = sample_get(s1); - int i; - if(!sample) return -1; - for(i=0; i < SAMPLE_MAX_EFFECTS; i++) - { - sample->effect_chain[i]->frame_offset = 0; - } - return 1; -} - -static int sample_calc_offset( sample_info *sample,int entry, int candidate_offset ) -{ - int s1 = sample->effect_chain[ entry ]->channel; - - for( int i = 0; i < SAMPLE_MAX_EFFECTS ; i ++ ) { - if( i > entry && - sample->effect_chain[i]->source_type == 0 && - sample->effect_chain[i]->channel == s1 ) { - return sample->effect_chain[ i ]->frame_offset; - } - } - - return candidate_offset; -} - -int sample_set_offset(int s1, int chain_entry, int frame_offset) -{ - sample_info *sample = sample_get(s1); - if (!sample) - return -1; - sample->effect_chain[chain_entry]->frame_offset = sample_calc_offset( sample, chain_entry, frame_offset ); - - return 1; -} - int sample_set_chain_audio(int s1, int chain_entry, int val) { sample_info *sample = sample_get(s1); @@ -2490,13 +2400,13 @@ int sample_set_chain_volume(int s1, int chain_entry, int volume) { sample_info *sample = sample_get(s1); if (!sample) - return -1; - /* set to zero if frame_offset is greater than sample length */ + return -1; if (volume < 0) - volume = 100; + volume = 100; if (volume > 100) - volume = 0; - sample->effect_chain[chain_entry]->volume = volume; + volume = 0; + + sample->effect_chain[chain_entry]->volume = volume; return 1; } @@ -2523,7 +2433,6 @@ int sample_chain_clear(int s1) } sample->effect_chain[i]->effect_id = -1; - sample->effect_chain[i]->frame_offset = 0; sample->effect_chain[i]->volume = 0; sample->effect_chain[i]->a_flag = 0; sample->effect_chain[i]->is_rendering = 1; @@ -2625,7 +2534,6 @@ int sample_chain_remove(int s1, int position) } sample->effect_chain[position]->effect_id = -1; - sample->effect_chain[position]->frame_offset = 0; sample->effect_chain[position]->volume = 0; sample->effect_chain[position]->a_flag = 0; sample->effect_chain[position]->is_rendering = 1; @@ -2820,7 +2728,6 @@ void ParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample, int start_at) int i; int source_type = 0; int channel = 0; - int frame_offset = 0; int e_flag = 0; int volume = 0; int a_flag = 0; @@ -2865,10 +2772,6 @@ void ParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample, int start_at) channel = get_xml_int( doc, cur ); } - if (!xmlStrcmp(cur->name, (const xmlChar *) XMLTAG_EFFECTOFFSET)) { - frame_offset = get_xml_int( doc, cur ); - } - if (!xmlStrcmp(cur->name, (const xmlChar *) XMLTAG_EFFECTACTIVE)) { e_flag = get_xml_int( doc, cur ); } @@ -2914,7 +2817,6 @@ void ParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample, int start_at) if( effect_id != -1 ) { sample_set_chain_status(dst_sample, chain_index, e_flag); - sample_set_offset(dst_sample, chain_index, frame_offset); } sample_info *skel = sample_get(dst_sample); @@ -3361,7 +3263,6 @@ void CreateEffect(xmlNodePtr node, sample_eff_chain * effect, int position) put_xml_int( node, XMLTAG_EFFECTACTIVE, effect->e_flag ); put_xml_int( node, XMLTAG_EFFECTSOURCE, effect->source_type ); put_xml_int( node, XMLTAG_EFFECTCHANNEL, effect->channel ); - put_xml_int( node, XMLTAG_EFFECTOFFSET, effect->frame_offset ); put_xml_int( node, XMLTAG_EFFECTAUDIOFLAG, effect->a_flag ); put_xml_int( node, XMLTAG_EFFECTAUDIOVOLUME, effect->volume ); put_xml_int( node, "kf_status", effect->kf_status ); diff --git a/veejay-current/veejay-server/libsample/sampleadm.h b/veejay-current/veejay-server/libsample/sampleadm.h index d1985fd5..b1a4f85a 100644 --- a/veejay-current/veejay-server/libsample/sampleadm.h +++ b/veejay-current/veejay-server/libsample/sampleadm.h @@ -48,7 +48,6 @@ #define XMLTAG_ARGUMENT "argument" #define XMLTAG_EFFECTSOURCE "source" #define XMLTAG_EFFECTCHANNEL "channel" -#define XMLTAG_EFFECTOFFSET "offset" #define XMLTAG_EFFECTACTIVE "active" #define XMLTAG_EFFECTAUDIOFLAG "use_audio" #define XMLTAG_EFFECTAUDIOVOLUME "chain_volume" @@ -96,7 +95,6 @@ typedef struct sample_eff_t { int e_flag; void *vje_instance; int arg[SAMPLE_MAX_PARAMETERS]; /* array of arguments */ - int frame_offset; int speed; /* last known play speed */ /* audio settings */ int a_flag; /* audio enabled/disabled */ @@ -165,11 +163,11 @@ typedef struct sample_info_t { int encoder_width; int encoder_height; int encoder_max_size; - + int frame_tick; + int auto_switch; int selected_entry; int effect_toggle; - int offset; int play_length; editlist *edit_list; char *edit_list_file; @@ -199,13 +197,12 @@ extern unsigned int sample_size(); extern int sample_highest(); extern int sample_highest_valid_id(); extern int sample_verify(); -extern int sample_init(int len, void *font, editlist *el); +extern int sample_init(int len, void *font, editlist *el,void *info); extern int sample_update(sample_info *sample, int s1); #ifdef HAVE_XML2 extern int sample_readFromFile(char *, void *vp, void *ptr, void *font, void *el, int *id, int *mode); extern int sample_writeToFile(char *, void *vp, void *ptr, void *font, int id, int mode); #endif -extern int sample_update_offset(int s1, int nframe); extern int sample_get_position(int s1); extern int sample_set_state(int new_state); extern int sample_get_state(); @@ -264,13 +261,11 @@ void *sample_get_plugin( int s1, int position, void *ptr ); extern int sample_get_effect(int s1, int position); /* get effect any, even if effect is disabled (required for informational purposes)*/ extern int sample_get_effect_any(int s1, int position); -extern int sample_get_offset(int s1, int position); extern int sample_get_short_info(int sample_id, int *, int *, int *, int *) ; extern int sample_get_chain_volume(int s1, int position); extern void sample_set_kf_type(int s1, int entry, int type ); /* set volume of audio data coming to the chain */ extern int sample_set_chain_volume(int s1, int position, int volume); -extern int sample_reset_chain_offset(int s1, int chain_entry, int s2); /* whether to mix underlying sample's audio */ extern int sample_get_chain_audio(int s1, int position); @@ -281,7 +276,6 @@ extern int sample_set_chain_audio(int s1, int position, int flag); extern int sample_set_chain_status(int s1, int position, int status); extern int sample_get_chain_status(int s1, int position); -extern int sample_set_offset(int s1, int position, int frame_offset); extern int sample_get_effect_arg(int s1, int position, int argnr); extern int sample_set_effect_arg(int s1, int position, int argnr, int value); @@ -297,7 +291,7 @@ extern int sample_chain_add(int s1, int c, int effect_nr); extern int sample_get_chain_channel(int s1, int position); extern int sample_set_chain_channel(int s1, int position, int channel); -//int sample_chain_replace(int s1, int position, int effect_id); +extern void sample_frame_tick(); extern int sample_chain_sprint_status(int s1,int tags,int cache,int sa,int ca, int r, int f, int m, int t,int sr,int curfps,uint32_t lo, uint32_t hi, int macro,char *s, int feedback ); @@ -327,7 +321,6 @@ extern int sample_reset_fader(int t1); extern int sample_get_fade_entry(int t1); extern void sample_set_fade_entry(int t1, int entry); extern void sample_set_fade_method(int t1, int method ); -extern int sample_reset_offset(int s1); extern int sample_get_fade_method(int t1); extern void sample_set_fade_alpha(int t1, int alpha); extern int sample_get_fade_alpha(int s1); @@ -370,7 +363,8 @@ extern int sample_get_frame_length(int s1); extern int sample_loop_dec(int s1); extern int sample_max_video_length(int s1); extern long sample_get_resume(int s1); -extern int sample_set_resume(int s1, long pos ); +extern int sample_set_resume(int s1, long pos ); +extern int sample_set_resume_override(int s1, long pos); extern void sample_update_ascociated_samples(int s1); extern void sample_chain_alloc_kf( int s1, int entry ); diff --git a/veejay-current/veejay-server/libstream/vj-tag.c b/veejay-current/veejay-server/libstream/vj-tag.c index aa5934f0..74e126e3 100644 --- a/veejay-current/veejay-server/libstream/vj-tag.c +++ b/veejay-current/veejay-server/libstream/vj-tag.c @@ -1243,7 +1243,6 @@ int vj_tag_new(int type, char *filename, int stream_nr, editlist * el, int pix_f (sample_eff_chain *) vj_calloc(sizeof(sample_eff_chain)); tag->effect_chain[i]->effect_id = -1; tag->effect_chain[i]->e_flag = 0; - tag->effect_chain[i]->frame_offset = 0; tag->effect_chain[i]->speed = INT_MAX; tag->effect_chain[i]->volume = 0; tag->effect_chain[i]->a_flag = 0; @@ -2940,98 +2939,6 @@ int vj_tag_by_type(int type) return 0; } -int vj_tag_reset_offset(int t1) -{ - vj_tag *tag = vj_tag_get(t1); - if (!tag) - return -1; - int i; - for(i=0; i < SAMPLE_MAX_EFFECTS; i++) - { - tag->effect_chain[i]->frame_offset = 0; - } - return 1; -} - -int vj_tag_reset_chain_offset( int t1, int chain_entry, int s1 ) -{ - sample_info *si = sample_get(s1); - vj_tag *tag = vj_tag_get(t1); - if(!si || !tag) - return -1; - - int has_marker = si->marker_start >= 0 && si->marker_end > 0; - int start_frame = ( has_marker ? si->marker_start : si->first_frame ); - int end_frame = ( has_marker ? si->marker_end : si->last_frame ); - - int new_offset = start_frame; - if( si->speed < 0 ) - new_offset = end_frame; - - tag->effect_chain[ chain_entry ]->frame_offset = new_offset; - - return 1; -} - -static int vj_tag_calc_offset( vj_tag *tag,int entry, int candidate_offset ) -{ - int s1 = tag->effect_chain[ entry ]->channel; - - for( int i = 0; i < SAMPLE_MAX_EFFECTS ; i ++ ) { - if( i > entry && - tag->effect_chain[i]->source_type == 0 && - tag->effect_chain[i]->channel == s1 ) { - return tag->effect_chain[ i ]->frame_offset; - } - } - - return candidate_offset; -} - -int vj_tag_set_offset(int t1, int chain_entry, int frame_offset) -{ - vj_tag *tag = vj_tag_get(t1); - if (!tag) - return -1; - tag->effect_chain[chain_entry]->frame_offset = vj_tag_calc_offset(tag, chain_entry, frame_offset); - return 1; -} - -int vj_tag_get_offset(int t1, int chain_entry) -{ - vj_tag *tag = vj_tag_get(t1); - if (!tag) - return -1; - - return tag->effect_chain[chain_entry]->frame_offset; -} - - -void vj_tag_update_ascociated_samples(int s1) -{ - vj_tag *sample = vj_tag_get(s1); - if(!sample) { - return; - } - - int p = 0; - for( p = 0; p < SAMPLE_MAX_EFFECTS; p ++ ) { - if( sample->effect_chain[p]->source_type != 0 ) - continue; - if( !sample_exists(sample->effect_chain[p]->channel) ) - continue; - - int pos = sample->effect_chain[p]->frame_offset; - if(pos == 0 ) - continue; - - sample_set_resume( sample->effect_chain[p]->channel, pos ); - veejay_msg(VEEJAY_MSG_DEBUG, "Sample %d will resume playback from position %d", - sample->effect_chain[p]->channel, pos ); - } -} - - long vj_tag_get_encoded_frames(int s1) { vj_tag *si = vj_tag_get(s1); if(!si) return -1; @@ -3917,7 +3824,6 @@ static void tagParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample) int arg[SAMPLE_MAX_PARAMETERS]; int source_type = 0; int channel = 0; - int frame_offset = 0; int e_flag = 0; int anim= 0; int anim_type = 0; @@ -3948,10 +3854,6 @@ static void tagParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample) channel = get_xml_int( doc, cur ); } - if (!xmlStrcmp(cur->name, (const xmlChar *) XMLTAG_EFFECTOFFSET)) { - frame_offset = get_xml_int( doc, cur ); - } - if (!xmlStrcmp(cur->name, (const xmlChar *) "kf_status")) { anim = get_xml_int( doc, cur ); } @@ -3990,8 +3892,6 @@ static void tagParseEffect(xmlDocPtr doc, xmlNodePtr cur, int dst_sample) vj_tag_set_chain_status(dst_sample, chain_index, e_flag); - vj_tag_set_offset(dst_sample, chain_index, frame_offset); - j = 0; vj_tag *t = vj_tag_get( dst_sample ); while (curarg != NULL) @@ -4241,7 +4141,6 @@ static void tagCreateEffect(xmlNodePtr node, sample_eff_chain * effect, int posi put_xml_int( node, XMLTAG_EFFECTACTIVE, effect->e_flag ); put_xml_int( node, XMLTAG_EFFECTSOURCE, effect->source_type ); put_xml_int( node, XMLTAG_EFFECTCHANNEL, effect->channel ); - put_xml_int( node, XMLTAG_EFFECTOFFSET, effect->frame_offset ); put_xml_int( node, XMLTAG_EFFECTAUDIOFLAG, effect->a_flag ); put_xml_int( node, XMLTAG_EFFECTAUDIOVOLUME, effect->volume ); put_xml_int( node, "kf_status", effect->kf_status ); diff --git a/veejay-current/veejay-server/veejay/liblavplayvj.c b/veejay-current/veejay-server/veejay/liblavplayvj.c index dfed14a4..497817ee 100644 --- a/veejay-current/veejay-server/veejay/liblavplayvj.c +++ b/veejay-current/veejay-server/veejay/liblavplayvj.c @@ -615,12 +615,6 @@ int veejay_start_playing_sample( veejay_t *info, int sample_id ) info->sfd = sample_get_framedup(sample_id); - if(!info->seq->active) { - if( info->settings->sample_restart ) { - sample_reset_offset( sample_id ); /* reset mixing offsets */ - } - } - sample_set_loop_stats( sample_id, 0 ); sample_set_loops( sample_id, -1 ); /* reset loop count */ @@ -750,13 +744,13 @@ void veejay_change_playback_mode( veejay_t *info, int new_pm, int sample_id ) if( !info->seq->active ) { if( info->settings->sample_restart) { - sample_set_resume(cur_id,-1); + sample_set_resume_override(cur_id,-1); long pos = sample_get_resume( cur_id ); veejay_set_frame(info, pos ); veejay_msg(VEEJAY_MSG_INFO, "Sample %d starts playing from frame %d",sample_id,pos); } else { - veejay_msg(VEEJAY_MSG_INFO, "Already playing sample (continous mode is on)"); + veejay_msg(VEEJAY_MSG_INFO, "Already playing sample %d (continous mode is on)", sample_id); } return; } @@ -840,7 +834,6 @@ void veejay_sample_set_initial_positions(veejay_t *info) int id = info->seq->samples[i].sample_id; int stats[4]; - sample_reset_offset(id); sample_set_loops(id,-1); sample_get_short_info( id, &stats[0],&stats[1],&stats[2],&stats[3]); if( stats[2] == 2 ) { @@ -868,7 +861,6 @@ void veejay_sample_set_initial_positions(veejay_t *info) void veejay_prepare_sample_positions(int id) { int stats[4] = { 0,0,0,0 }; - sample_reset_offset(id); sample_set_loops(id,-1); sample_get_short_info( id, &stats[0],&stats[1],&stats[2],&stats[3]); if( stats[2] == 2 ) { @@ -1955,7 +1947,7 @@ int veejay_init(veejay_t * info, int x, int y,char *arg, int def_tags, int gen_t return -1; } - if(!sample_init( (info->video_output_width * info->video_output_height), info->font, info->plain_editlist ) ) { + if(!sample_init( (info->video_output_width * info->video_output_height), info->font, info->plain_editlist,info ) ) { veejay_msg(VEEJAY_MSG_ERROR, "Internal error while initializing sample administrator"); return -1; } diff --git a/veejay-current/veejay-server/veejay/vj-event.c b/veejay-current/veejay-server/veejay/vj-event.c index f01d4a19..75f21849 100644 --- a/veejay-current/veejay-server/veejay/vj-event.c +++ b/veejay-current/veejay-server/veejay/vj-event.c @@ -3819,11 +3819,11 @@ void vj_event_sample_set_position( void *ptr, const char format[], va_list ap sample_get_chain_source(args[0], entry); int cha = sample_get_chain_channel( args[0], entry ); - int pos = sample_get_offset( cha,entry ); + int pos = sample_get_resume( cha ); pos += args[2]; - sample_set_offset( cha,entry, pos ); + sample_set_resume( cha, pos ); veejay_msg(VEEJAY_MSG_INFO, "Changed frame position to %d for sample %d on FX entry %d (only)", pos,cha,entry ); } @@ -3857,17 +3857,19 @@ void vj_event_sample_skip_frame(void *ptr, const char format[], va_list ap) int len = end - start; //@ skip frame = increment current with offset in args[1] - si->effect_chain[k]->frame_offset += args[1]; + int cur = sample_get_resume( si->effect_chain[k]->channel ) + args[1]; //@ check range - if( si->effect_chain[k]->frame_offset > len ) - si->effect_chain[k]->frame_offset = len; - if( si->effect_chain[k]->frame_offset < 0 ) - si->effect_chain[k]->frame_offset = 0; + if( cur > len ) + cur = len; + if( cur < 0 ) + cur = 0; + sample_set_resume_override( si->effect_chain[k]->channel, cur ); + veejay_msg(VEEJAY_MSG_DEBUG, "Set offset of mixing sample #%d (%d-%d) on chain entry %d of sample %d to %d", - si->effect_chain[k]->channel,start,end, k,i, si->effect_chain[k]->frame_offset ); + si->effect_chain[k]->channel,start,end, k,i, cur ); } } } @@ -5628,9 +5630,9 @@ void vj_event_chain_entry_src_toggle(void *ptr, const char format[], va_list ap) } sample_set_chain_source(v->uc->sample_id,entry,src); sample_set_chain_channel(v->uc->sample_id,entry,cha); + if(v->bezerk) + sample_set_resume_override( v->uc->sample_id, -1 ); veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d", entry,(src==VJ_TAG_TYPE_NONE ? "Sample":"Stream"), cha); - if(v->bezerk) - sample_reset_chain_offset( v->uc->sample_id, entry, cha ); } if(STREAM_PLAYING(v)) @@ -5668,8 +5670,8 @@ void vj_event_chain_entry_src_toggle(void *ptr, const char format[], va_list ap) } vj_tag_set_chain_source(v->uc->sample_id,entry,src); vj_tag_set_chain_channel(v->uc->sample_id,entry,cha); - if(v->bezerk && src == VJ_TAG_TYPE_NONE) { - vj_tag_reset_chain_offset( v->uc->sample_id, entry, cha ); + if( src == VJ_TAG_TYPE_NONE && v->bezerk ) { + sample_set_resume_override( cha, -1 ); } vj_tag_get_descriptive(cha, description); veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d (%s)", entry,( src == 0 ? "Sample" : "Stream" ), cha,description); @@ -5727,15 +5729,14 @@ void vj_event_chain_entry_source(void *ptr, const char format[], va_list ap) { sample_set_chain_channel(args[0],args[1], c); sample_set_chain_source (args[0],args[1],src); - int sample_offset = sample_get_offset(args[0],args[1]); + int sample_offset = sample_get_resume(args[0]); int sample_speed = 0; - if( src == VJ_TAG_TYPE_NONE ) - sample_speed = sample_get_speed(c); - veejay_msg(VEEJAY_MSG_INFO, "Mixing with source (%s %d) at speed %d position %d", - src == VJ_TAG_TYPE_NONE ? "sample" : "stream",c,sample_speed,sample_offset); - if(v->bezerk && src==VJ_TAG_TYPE_NONE) { - sample_reset_chain_offset(args[0], args[1], c ); - } + if( src == VJ_TAG_TYPE_NONE ) { + sample_speed = sample_get_speed(c); + if( v->bezerk ) sample_set_resume_override( c, -1 ); + } + veejay_msg(VEEJAY_MSG_INFO, "Mixing with source (%s %d) at speed %d position %d", + src == VJ_TAG_TYPE_NONE ? "sample" : "stream",c,sample_speed,sample_offset); } } @@ -5786,16 +5787,16 @@ void vj_event_chain_entry_source(void *ptr, const char format[], va_list ap) { vj_tag_set_chain_channel(args[0],args[1], c); vj_tag_set_chain_source (args[0],args[1],src); - if(v->bezerk && src == VJ_TAG_TYPE_NONE) { - vj_tag_reset_chain_offset( args[0], args[1], c ); - } - int sample_offset = vj_tag_get_offset(args[0],args[1]); int sample_speed = 1; - if( src == VJ_TAG_TYPE_NONE ) - sample_speed = sample_get_speed(c); + int sample_offset = 0; + if( src == VJ_TAG_TYPE_NONE ) { + sample_speed = sample_get_speed(c); + sample_offset = sample_get_resume(c); + if(v->bezerk) sample_set_resume_override( c, -1 ); + } - veejay_msg(VEEJAY_MSG_INFO, "Mixing with source (%s %d) at speed %d position %d", + veejay_msg(VEEJAY_MSG_INFO, "Mixing with source (%s %d) at speed %d position %d", src==VJ_TAG_TYPE_NONE ? "sample" : "stream",c,sample_speed, sample_offset); } } @@ -5849,11 +5850,11 @@ void vj_event_chain_entry_channel_dec(void *ptr, const char format[], va_list ap cha = old; } sample_set_chain_channel( v->uc->sample_id, entry, cha ); - veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d",entry, + if(src == VJ_TAG_TYPE_NONE && v->bezerk ) sample_set_resume_override( cha, -1 ); + + veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d",entry, (src==VJ_TAG_TYPE_NONE ? "Sample" : "Stream"),cha); - if(v->bezerk) - sample_reset_chain_offset( v->uc->sample_id, entry, cha ); } if(STREAM_PLAYING(v)) { @@ -5896,10 +5897,7 @@ void vj_event_chain_entry_channel_dec(void *ptr, const char format[], va_list ap vj_tag_set_chain_channel( v->uc->sample_id, entry, cha ); vj_tag_get_descriptive( cha, description); - if(v->bezerk && src == VJ_TAG_TYPE_NONE) { - vj_tag_reset_chain_offset( v->uc->sample_id, entry, cha ); - } - + if( src == VJ_TAG_TYPE_NONE && v->bezerk ) sample_set_resume_override( cha, -1 ); veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses Stream %d (%s)",entry,cha,description); } @@ -5949,11 +5947,9 @@ void vj_event_chain_entry_channel_inc(void *ptr, const char format[], va_list ap } sample_set_chain_channel( v->uc->sample_id, entry, cha ); + if( src == VJ_TAG_TYPE_NONE && v->bezerk ) sample_set_resume_override( cha, -1 ); veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d",entry, (src==VJ_TAG_TYPE_NONE ? "Sample" : "Stream"),cha); - if(v->bezerk && src==VJ_TAG_TYPE_NONE) - sample_reset_chain_offset( v->uc->sample_id, entry, cha ); - } if(STREAM_PLAYING(v)) { @@ -5996,10 +5992,7 @@ void vj_event_chain_entry_channel_inc(void *ptr, const char format[], va_list ap vj_tag_set_chain_channel( v->uc->sample_id, entry, cha ); vj_tag_get_descriptive( cha, description); - if(v->bezerk && src == VJ_TAG_TYPE_NONE) { - vj_tag_reset_chain_offset( v->uc->sample_id, entry, cha ); - } - + if( src == VJ_TAG_TYPE_NONE && v->bezerk ) sample_set_resume_override( cha, -1 ); veejay_msg(VEEJAY_MSG_INFO, "Chain entry %d uses %s %d (%s)",entry, (src == VJ_TAG_TYPE_NONE ? "Sample" : "Stream" ), vj_tag_get_chain_channel(v->uc->sample_id,entry),description); } @@ -6036,6 +6029,7 @@ void vj_event_chain_entry_channel(void *ptr, const char format[], va_list ap) } if(err == 0 && sample_set_chain_channel(args[0],args[1], args[2])>= 0) { + if(src == VJ_TAG_TYPE_NONE && v->bezerk ) sample_set_resume_override( args[2], -1 ); veejay_msg(VEEJAY_MSG_INFO, "Selected input channel (%s %d)", (src == VJ_TAG_TYPE_NONE ? "sample" : "stream"),args[2]); } @@ -6045,9 +6039,6 @@ void vj_event_chain_entry_channel(void *ptr, const char format[], va_list ap) (src ==VJ_TAG_TYPE_NONE ? "sample" : "stream") , args[2]); } - if( v->bezerk && src == VJ_TAG_TYPE_NONE ) { - sample_reset_chain_offset( args[0], args[1], args[2] ); - } } } if(STREAM_PLAYING(v)) @@ -6070,12 +6061,9 @@ void vj_event_chain_entry_channel(void *ptr, const char format[], va_list ap) if( src != VJ_TAG_TYPE_NONE && vj_tag_exists( args[2] )) err = 0; - if(v->bezerk && src == VJ_TAG_TYPE_NONE && err == 0) { - vj_tag_reset_chain_offset( args[0], args[1], args[2] ); - } - if( err == 0 && vj_tag_set_chain_channel(args[0],args[1],args[2])>=0) { + if( src == VJ_TAG_TYPE_NONE && v->bezerk ) sample_set_resume_override( args[2], -1 ); veejay_msg(VEEJAY_MSG_INFO, "Selected input channel (%s %d)", (src==VJ_TAG_TYPE_NONE ? "sample" : "stream"), args[2]); } @@ -6129,8 +6117,8 @@ void vj_event_chain_entry_srccha(void *ptr, const char format[], va_list ap) veejay_msg(VEEJAY_MSG_DEBUG, "Using calibration data of stream %d",channel_id); } } - else if ( v->bezerk && source == VJ_TAG_TYPE_NONE ) { - sample_reset_chain_offset( args[0], args[1], channel_id ); + else if( v->bezerk ) { + sample_set_resume_override( channel_id, -1 ); } } else @@ -6178,10 +6166,9 @@ void vj_event_chain_entry_srccha(void *ptr, const char format[], va_list ap) if( slot >= 0 ) { vj_tag_cali_prepare( args[0],slot, channel_id); } - } - else if (v->bezerk) { - vj_tag_reset_chain_offset( args[0], args[1], channel_id ); + else if ( v->bezerk ) { + sample_set_resume_override( channel_id, -1 ); } } else @@ -8119,7 +8106,7 @@ void vj_event_print_sample_info(veejay_t *v, int id) if (vje_get_extra_frame(y) == 1) { int source = sample_get_chain_source(id, i); - int sample_offset = sample_get_offset(id,i); + int sample_offset = sample_get_resume(id); int c = sample_get_chain_channel(id,i); int sample_speed = 0; if( source == VJ_TAG_TYPE_NONE ) @@ -8691,7 +8678,7 @@ void vj_event_send_sample_stack ( void *ptr, const char format[], continue; channel = sample_get_chain_channel( args[0], i ); source = sample_get_chain_source( args[0], i ); - offset = sample_get_offset( args[0], i ); + offset = sample_get_resume( args[0] ); if( source == 0 ) sample_len= sample_video_length( channel ); else @@ -8710,9 +8697,11 @@ void vj_event_send_sample_stack ( void *ptr, const char format[], continue; channel = vj_tag_get_chain_channel( args[0], i ); source = vj_tag_get_chain_source( args[0], i ); - offset = vj_tag_get_offset( args[0], i ); - if( source == 0 ) + int offset = 0; + if( source == 0 ) { sample_len= sample_video_length( channel ); + offset = sample_get_resume( channel ); + } else sample_len = vj_tag_get_n_frames( channel ); diff --git a/veejay-current/veejay-server/veejay/vj-perform.c b/veejay-current/veejay-server/veejay/vj-perform.c index bc2bc062..bc5b8159 100644 --- a/veejay-current/veejay-server/veejay/vj-perform.c +++ b/veejay-current/veejay-server/veejay/vj-perform.c @@ -529,11 +529,8 @@ static int vj_perform_next_sequence( veejay_t *info, int *type, int *next_slot *next_slot = next_current; - if( current_type == 0 ) { - sample_update_ascociated_samples( sample_id ); - } - else { - vj_tag_update_ascociated_samples( sample_id ); + if( info->bezerk && current_type == 0 ) { + sample_set_resume_override( sample_id, -1 ); } return next_sample_id; @@ -630,7 +627,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) settings->current_frame_num += num; if( num == 0 ) { - sample_set_resume( info->uc->sample_id, settings->current_frame_num ); return 0; } @@ -710,9 +706,6 @@ static int vj_perform_increase_sample_frame(veejay_t * info, long num) } } - if(!info->seq->active) { - sample_set_resume( info->uc->sample_id, settings->current_frame_num ); - } vj_perform_rand_update( info ); return 0; @@ -1539,7 +1532,7 @@ static int vj_perform_get_subframe(veejay_t * info, int this_sample_id, int sub_ int sample_a[4]; int sample_b[4]; - int offset = sample_get_offset(a, chain_entry); + int offset = sample_get_resume( b ); int len_b; if(sample_get_short_info(b,&sample_b[0],&sample_b[1],&sample_b[2],&sample_b[3])!=0) return -1; @@ -1586,7 +1579,7 @@ static int vj_perform_get_subframe(veejay_t * info, int this_sample_id, int sub_ //offset = sample_b[1] - sample_b[0]; offset = len_b; sample_set_speed( b, (-1 * sample_b[3]) ); - sample_set_offset(a,chain_entry,offset); + sample_set_resume( b, offset); return sample_b[1]; } if(sample_b[2] == 1) @@ -1601,7 +1594,7 @@ static int vj_perform_get_subframe(veejay_t * info, int this_sample_id, int sub_ else if(sample_b[2] == 3 ) offset = 0; } - sample_set_offset(a,chain_entry,offset); + sample_set_resume(b,offset); return (sample_b[0] + offset); } else @@ -1619,7 +1612,7 @@ static int vj_perform_get_subframe(veejay_t * info, int this_sample_id, int sub_ //offset = sample_b[1] - sample_b[0]; offset = 0; sample_set_speed( b, (-1 * sample_b[3])); - sample_set_offset(a,chain_entry,offset); + sample_set_resume(b,offset); return sample_b[0]; } if(sample_b[2] == 1) @@ -1635,8 +1628,7 @@ static int vj_perform_get_subframe(veejay_t * info, int this_sample_id, int sub_ else if(sample_b[2] == 3 ) offset = 0; } - sample_set_offset(a, chain_entry, offset); - + sample_set_resume(b, offset); return (sample_b[0] + offset); //1 } return 0; @@ -1646,10 +1638,10 @@ static int vj_perform_get_subframe_tag(veejay_t * info, int sub_sample, int chai { int sample[4]; - //int offset = sample_get_offset(sub_sample, chain_entry); - int offset = vj_tag_get_offset( info->uc->sample_id, chain_entry ); int len; - veejay_msg(VEEJAY_MSG_DEBUG, "Current offset for sample %d is %d", sub_sample, offset ); + + int offset = sample_get_resume( sub_sample ); + if(sample_get_short_info(sub_sample,&sample[0],&sample[1],&sample[2],&sample[3])!=0) return -1; if( sample[3] == 0 ) @@ -1690,7 +1682,7 @@ static int vj_perform_get_subframe_tag(veejay_t * info, int sub_sample, int chai //offset = sample_b[1] - sample_b[0]; offset = len; sample_set_speed( sub_sample, (-1 * sample[3]) ); - vj_tag_set_offset( info->uc->sample_id, chain_entry, offset ); + sample_set_resume( sub_sample, offset ); //sample_set_offset( sub_sample,chain_entry,offset); return sample[1]; } @@ -1707,8 +1699,7 @@ static int vj_perform_get_subframe_tag(veejay_t * info, int sub_sample, int chai offset = 0; } - vj_tag_set_offset( info->uc->sample_id, chain_entry, offset ); - //sample_set_offset(sub_sample,chain_entry,offset); + sample_set_resume( sub_sample, offset ); return (sample[0] + offset); } else @@ -1726,8 +1717,7 @@ static int vj_perform_get_subframe_tag(veejay_t * info, int sub_sample, int chai //offset = sample_b[1] - sample_b[0]; offset = 0; sample_set_speed( sub_sample, (-1 * sample[3])); - vj_tag_set_offset( info->uc->sample_id, chain_entry, offset ); - //sample_set_offset( sub_sample,chain_entry,offset); + sample_set_resume( sub_sample, offset ); return sample[0]; } if(sample[2] == 1) @@ -1743,10 +1733,8 @@ static int vj_perform_get_subframe_tag(veejay_t * info, int sub_sample, int chai if(sample[2] == 3 ) offset = 0; } - - vj_tag_set_offset( info->uc->sample_id, chain_entry, offset ); - //sample_set_offset(sub_sample, chain_entry, offset); - + + sample_set_resume( sub_sample, offset ); return (sample[0] + offset); } return 0; @@ -1916,8 +1904,6 @@ static int vj_perform_apply_secundary_tag(veejay_t * info, performer_t *p, int s case VJ_TAG_TYPE_NONE: nframe = vj_perform_get_subframe_tag(info, sample_id, chain_entry); - sample_set_resume( sample_id, nframe ); - if(!subrender) cached_frame = vj_perform_sample_is_cached(info,sample_id); @@ -2108,7 +2094,6 @@ static int vj_perform_apply_secundary(veejay_t * info,performer_t *p, int this_s case VJ_TAG_TYPE_NONE: nframe = vj_perform_get_subframe(info,this_sample_id, sample_id, chain_entry); // get exact frame number to decode - sample_set_resume( sample_id, nframe ); if(!subrender) cached_frame = vj_perform_sample_is_cached(info,sample_id); @@ -3621,7 +3606,7 @@ static int vj_perform_transition_get_sample_position(int sample_id) if(sample_get_short_info(sample_id,&sample_b[0],&sample_b[1],&sample_b[2],&sample_b[3])!=0) { return 0; } - int position = sample_get_position( sample_id ); + int position = sample_get_resume( sample_id ); if( sample_b[3] == 0 ) { return sample_b[0] + position; @@ -3661,7 +3646,7 @@ static int vj_perform_transition_get_sample_position(int sample_id) //offset = sample_b[1] - sample_b[0]; position = len_b; sample_set_speed( sample_id, (-1 * sample_b[3]) ); - sample_update_offset( sample_id, position ); + sample_set_resume( sample_id, position ); return sample_b[1]; } if(sample_b[2] == 1) @@ -3676,7 +3661,7 @@ static int vj_perform_transition_get_sample_position(int sample_id) if(sample_b[2] == 3 ) position = 0; } - sample_update_offset(sample_id, position); + sample_set_resume(sample_id, position); return (sample_b[0] + position); } @@ -3693,7 +3678,7 @@ static int vj_perform_transition_get_sample_position(int sample_id) { position = 0; sample_set_speed( sample_id, (-1 * sample_b[3])); - sample_update_offset( sample_id, position ); + sample_set_resume( sample_id, position ); return sample_b[0]; } if(sample_b[2] == 1) @@ -3708,7 +3693,7 @@ static int vj_perform_transition_get_sample_position(int sample_id) if(sample_b[2] == 3 ) position = 0; } - sample_update_offset(sample_id, position); + sample_set_resume(sample_id, position); return (sample_b[0] + position); //1 } @@ -4046,7 +4031,10 @@ int vj_perform_queue_frame(veejay_t * info, int skip ) if(!skip) { int speed = settings->current_playback_speed; - if( settings->hold_status == 1 ) { + + sample_frame_tick(); + + if( settings->hold_status == 1 ) { speed = 0; if(settings->hold_pos == 0 ) { settings->hold_status = 0;