diff --git a/veejay-current/veejay-client/src/callback.c b/veejay-current/veejay-client/src/callback.c index 01f31dbc..25a6179d 100644 --- a/veejay-current/veejay-client/src/callback.c +++ b/veejay-current/veejay-client/src/callback.c @@ -2084,7 +2084,7 @@ void on_curve_buttonstore_clicked(GtkWidget *widget, gpointer user_data ) int end = get_nums( "curve_spinend" ); int start = get_nums( "curve_spinstart" ); - const int length = end - start + 1; + const int length = end - start; if( (length) <= 0 || id <= 0 ) @@ -2107,53 +2107,41 @@ void on_curve_buttonstore_clicked(GtkWidget *widget, gpointer user_data ) type = GTK_CURVE_TYPE_FREE; } - float *data = (float*) vj_calloc(sizeof(float) * length ); - int *values = (int*) vj_calloc(sizeof(int) * length ); - - unsigned char *kkf = (unsigned char*) vj_calloc( (length*4) + 64); - unsigned char *buf = (unsigned char*) vj_calloc( (length*4) + 64 ); int min=0,max=0; - - unsigned char *kf = kkf; //@ reserve space for header - - _effect_get_minmax( id, &min,&max,j ); + float *data = (float*) vj_calloc( sizeof(float) * length ); + _effect_get_minmax( id, &min, &max,j ); + + get_points_from_curve( curve, length, data ); + + char header[34]; + + int msg_len = 25 + (4*length); /*K00000000 */ + + snprintf(header,sizeof(header), "K%08dkey%02d%02d%08d%08d%02d",msg_len,i,j,start,end,type ); + + char *buf = (char*) vj_calloc( sizeof(char) * msg_len + 9 ); + strncpy( buf, header, sizeof(header)); + + char *ptr = buf + sizeof(header); int k; - - get_points_from_curve( curve, length, data ); for( k = 0 ; k < length ; k++ ) { - values[k] = (int) ( (float) min + ( data[k] * ((float) max) )); - } - int row_len = 3 + 2 + 2 + 8 + 8 + 2; - sprintf( (char*)kf, "key%02d%02d%08d%08d%02d",i,j,start,end,type ); - unsigned char *ptr = kkf + row_len; - int total_len = row_len; + int pval = (int) ( (float) min + ( data[k] * ((float) max) )); + ptr[0] = pval & 0xff; + ptr[1] = (pval >> 8) & 0xff; + ptr[2] = (pval >> 16) & 0xff; + ptr[3] = (pval >> 24) & 0xff; - for( k = 0; k < length; k ++ ) - { - unsigned char *p = ptr + (k*4); - p[0] = values[k] & 0xff; - p[1] = (values[k] >> 8) & 0xff; - p[2] = (values[k] >> 16) & 0xff; - p[3] = (values[k] >> 24) & 0xff; - - total_len += 4; - - veejay_msg( VEEJAY_MSG_DEBUG, "(%d/%d) FX set value %d on frame %d",k,length,values[k], start+k ); + ptr += 4; + veejay_msg( VEEJAY_MSG_DEBUG, "(%d/%d) FX set value %d on frame %d",k,length,pval, start+k ); } - free(values); - free(data); - - sprintf( buf, "K%08d", total_len ); - memcpy( buf + 9 , kkf, total_len ); - vj_client_send_buf( info->client, V_CMD, buf,total_len ); - free(kkf); - free(buf); + vj_client_send_buf( info->client, V_CMD, buf, msg_len + 9 ); vj_msg( VEEJAY_MSG_INFO, "Saved new animation for parameter %d on entry %d, start at frame %d and end at frame %d",j,i,start,end ); - + free(buf); + free(data); } void on_curve_buttonclear_clicked(GtkWidget *widget, gpointer user_data) diff --git a/veejay-current/veejay-client/src/curve.c b/veejay-current/veejay-client/src/curve.c index 4e6a5f8a..9ec79201 100644 --- a/veejay-current/veejay-client/src/curve.c +++ b/veejay-current/veejay-client/src/curve.c @@ -49,19 +49,16 @@ int set_points_in_curve_ext( GtkWidget *curve, unsigned char *blob, int id, int int start = 0, end =0,type=0; int entry = 0; int n = sscanf( (char*) blob, "key%2d%2d%8d%8d%2d", &entry, ¶meter_id, &start, &end,&type ); - int len = end - start + 1; + int len = end - start; int i; int min = 0, max = 0; #ifdef STRICT_CHECKING assert( fx_entry == entry ); #endif - if( len <= 0 ) - return -1; - - if(n != 5 ) + if(n != 5 || len <= 0 ) { - veejay_msg(0, "Error parsing KF headeR"); + veejay_msg(0, "Error parsing FX Anim KF header"); return -1; } @@ -69,18 +66,18 @@ int set_points_in_curve_ext( GtkWidget *curve, unsigned char *blob, int id, int unsigned int k = 0; unsigned char *in = blob + 25; - float *vec = (float*) vj_calloc(sizeof(float) * (len+1) ); - for(i = start ; i <= end; i ++ ) + float *vec = (float*) vj_calloc(sizeof(float) * len ); + for(i = start ; i < end; i ++ ) { - unsigned char *ptr = in + (i * 4); + unsigned char *ptr = in + (k * 4); int value = ( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) ); float top = 1.0 / (float) max; - float val = (float)value * top; + float val = (float) min + ( (float)value * top ); - veejay_msg(4, "FX position %d, value %d", i, value ); + veejay_msg(4, "Load FX Anim position %d, value %f", i, val ); vec[k] = val; k++; diff --git a/veejay-current/veejay-server/libsample/sampleadm.c b/veejay-current/veejay-server/libsample/sampleadm.c index e4c880b0..c31cd46e 100644 --- a/veejay-current/veejay-server/libsample/sampleadm.c +++ b/veejay-current/veejay-server/libsample/sampleadm.c @@ -1250,7 +1250,6 @@ int sample_get_all_effect_arg(int s1, int position, int *args, int arg_len, int int tmp = 0; if(!get_keyframe_value( sample->effect_chain[position]->kf, n_frame, i, &tmp ) ) { args[i] = sample->effect_chain[position]->arg[i]; - veejay_msg(4, "%d - FX [%d] P%d : %d", n_frame,position, i, args[i] ); } else { args[i] = tmp; diff --git a/veejay-current/veejay-server/libvjnet/vj-server.c b/veejay-current/veejay-server/libvjnet/vj-server.c index c9a56377..650f4c15 100644 --- a/veejay-current/veejay-server/libvjnet/vj-server.c +++ b/veejay-current/veejay-server/libvjnet/vj-server.c @@ -808,6 +808,8 @@ static int _vj_verify_msg(vj_server *vje,int link_id, char *buf, int buf_len ) return 0; } + i += 9; + } else { veejay_msg(0, "parse error."); return 0; @@ -890,6 +892,7 @@ static int _vj_parse_msg(vj_server *vje,int link_id, char *buf, int buf_len ) v[num_msg]->msg = (char*) vj_malloc( sizeof(char) * slen ); memcpy( v[num_msg]->msg, str_ptr, slen ); v[num_msg]->len = slen; + num_msg++; i += ( 9 + slen ); diff --git a/veejay-current/veejay-server/veejay/vjkf.c b/veejay-current/veejay-server/veejay/vjkf.c index 6591878a..92dfaf8b 100644 --- a/veejay-current/veejay-server/veejay/vjkf.c +++ b/veejay-current/veejay-server/veejay/vjkf.c @@ -98,7 +98,7 @@ unsigned char *keyframe_pack( void *port, int parameter_id, int entry_id, int *r free(k_e); free(k_t); - int len = end - start + 1; + int len = end - start; result = vj_calloc( (len*4) + 64 ); @@ -106,7 +106,7 @@ unsigned char *keyframe_pack( void *port, int parameter_id, int entry_id, int *r unsigned char *out = result + 25; - for( i = start; i <= end; i ++ ) + for( i = start; i < end; i ++ ) { char *key = keyframe_id( parameter_id, i ); int value = 0; @@ -147,6 +147,8 @@ unsigned char *keyframe_pack( void *port, int parameter_id, int entry_id, int *r veejay_msg(VEEJAY_MSG_DEBUG, "KF %p pack: range=%d-%d, FX entry %d, P%d, type %d", port,start,end, entry_id,parameter_id, type ); + vevo_port_dump( port, 0 ); + return result; } @@ -169,15 +171,12 @@ int keyframe_unpack( unsigned char *in, int len, int *entry, int lookup, int is in += (25); unsigned char *ptr = in; - for(i = start ; i <= end; i ++ ) + for(i = start ; i < end; i ++ ) { int value = ( ptr[0] | (ptr[1] << 8) | (ptr[2] << 16) | (ptr[3] << 24) ); char *key = keyframe_id( parameter_id, i ); vevo_property_set( port, key, VEVO_ATOM_TYPE_INT, 1, &value ); -#ifdef STRICT_CHECKING - veejay_msg(VEEJAY_MSG_DEBUG, "Parameter %d at pos %d has value %d", parameter_id, i, value ); -#endif ptr += 4; free(key); } @@ -196,6 +195,8 @@ int keyframe_unpack( unsigned char *in, int len, int *entry, int lookup, int is *entry = fx_entry; + vevo_port_dump(port, 0 ); + return 1; } @@ -269,7 +270,7 @@ int keyframe_xml_pack( xmlNodePtr node, void *port, int parameter_id ) snprintf(xmlbuf, 100,"%d", type ); xmlNewChild(node, NULL, (const xmlChar*) k_t, xmlbuf ); - for( i = start; i <= end; i ++ ) + for( i = start; i < end; i ++ ) { char *key = keyframe_id( parameter_id, i ); int value = 0; @@ -376,8 +377,13 @@ int get_keyframe_value(void *port, int n_frame, int parameter_id, int *result ) char *key = keyframe_id( parameter_id, n_frame ); int error = vevo_property_get( port, key, 0, result ); - if( error != VEVO_NO_ERROR ) + if( error != VEVO_NO_ERROR ) { + free(key); return 0; + } + + free(key); + return 1; }