#include "project_internal.h" #include "xtc/xtc_editing.h" #include #include static xtc_result selection_valid(const xtc_project *p,const uint64_t *ids,size_t count) { size_t i,j;xtc_clip_info c; if(!p || !ids || !count || count>XTC_PROJECT_MAX_CLIPS)return XTC_ERR_INVALID_ARGUMENT; for(i=0;igraph;*p=*copy;copy->graph=old; } xtc_result xtc_project_transform_clips(xtc_project *p,const uint64_t *ids,size_t count, xtc_clip_operation operation,int64_t amount,uint64_t *out_ids) { xtc_project *copy=NULL;size_t i;uint64_t output[XTC_PROJECT_MAX_CLIPS]; xtc_result r=selection_valid(p,ids,count); if(r!=XTC_OK)return r; if(operationXTC_CLIPS_DELETE || amount<-(int64_t)XTC_PROJECT_MAX_TICK || amount>(int64_t)XTC_PROJECT_MAX_TICK)return XTC_ERR_INVALID_ARGUMENT; r=xtc_project_clone(p,©); for(i=0;r==XTC_OK && i(int64_t)XTC_PROJECT_MAX_TICK)r=XTC_ERR_INVALID_ARGUMENT; else if(operation==XTC_CLIPS_DUPLICATE)r=xtc_project_duplicate_clip(copy,ids[i],c.track_id,(uint64_t)start,output+i); else r=xtc_project_edit_clip(copy,ids[i],c.track_id,(uint64_t)start,c.length_tick,c.offset_tick); } if(r==XTC_OK){publish(p,copy);if(out_ids)memcpy(out_ids,output,count*sizeof(*output));} xtc_project_destroy(copy);return r; }