feat: duplicate complete tracks with instruments routing and automation

This commit is contained in:
Johannes Findeisen 2026-11-06 00:33:58 +01:00
commit 4c855ee5d7
9 changed files with 65 additions and 5 deletions

View file

@ -1376,6 +1376,9 @@ int main(int argc, char **argv)
s->position(3840);CHECK(s->ripple_time(960,false)==XTC_OK);
xtc_marker moved{};xtc_project_get_marker(s->project(),1,&moved);CHECK(moved.tick==1920);
CHECK(window.undo()==XTC_OK);
CHECK(s->select(0));CHECK(s->duplicate_track("Keys copy")==XTC_OK);
size_t tracks=0,clips=0;xtc_project_get_counts(s->project(),&tracks,&clips);CHECK(tracks==2 && clips==2);
CHECK(window.undo()==XTC_OK);xtc_project_get_counts(s->project(),&tracks,&clips);CHECK(tracks==1 && clips==1);
window.do_callback();
}
if (failures != 0) return 1;

View file

@ -2,6 +2,7 @@
#include "xtc/xtc_editing.h"
#include "xtc/xtc_mixer.h"
#include "xtc/xtc_audio.h"
#include "xtc/xtc_plugin.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
@ -64,4 +65,21 @@ static void ripple(void)
assert(xtc_project_find_clip(p,c,&clip)==XTC_OK && clip.start_tick==0);
xtc_project_destroy(p);
}
int main(void){markers();sections();ripple();puts("Next DAW workflow tests passed.");return 0;}
static void duplicate_track(void)
{
xtc_project *p=NULL;uint64_t t,b,c,n,id=999;xtc_track_info track;xtc_plugin_spec spec,actual;size_t count;
assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"Keys",&t)==XTC_OK);
assert(xtc_project_add_bus(p,"Bus",&b)==XTC_OK && xtc_project_route_track(p,t,b)==XTC_OK);
assert(xtc_project_add_midi_clip(p,t,960,1920,&c)==XTC_OK && xtc_project_add_note(p,c,240,120,60,90,1,&n)==XTC_OK);
assert(xtc_plugin_probe_format(XTC_PLUGIN_BUILTIN,XTC_BUILTIN_PATH,0,48000,&spec)==XTC_OK && xtc_project_set_instrument(p,t,&spec)==XTC_OK);
assert(xtc_project_set_mix(p,t,.5f,-.5f,1,0)==XTC_OK);
{xtc_automation_point a={t,960,XTC_AUTOMATION_GAIN,.75f,0};assert(xtc_project_set_automation(p,&a)==XTC_OK);}
assert(xtc_project_duplicate_track(p,b,"Bus copy",&id)==XTC_ERR_INVALID_STATE && id==999);
assert(xtc_project_duplicate_track(p,t,"Keys copy",&id)==XTC_OK && id!=t);
assert(xtc_project_get_track(p,1,&track)==XTC_OK && track.id==id && track.gain==.5f && track.mute && track.bus_id==b);
assert(xtc_project_get_instrument(p,id,&actual)==XTC_OK && actual.index==spec.index);
assert(xtc_project_note_count(p,&count)==XTC_OK && count==2);
assert(xtc_project_automation_count(p,&count)==XTC_OK && count==2);
xtc_project_destroy(p);
}
int main(void){markers();sections();ripple();duplicate_track();puts("Next DAW workflow tests passed.");return 0;}