feat: collect portable project media with transactional cleanup and qualify composition workflows

This commit is contained in:
Johannes Findeisen 2026-11-06 00:49:37 +01:00
commit b0cfa79131
15 changed files with 225 additions and 10 deletions

View file

@ -8,6 +8,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <math.h>
static void put32(unsigned char *p,uint32_t value){p[0]=(unsigned char)value;p[1]=(unsigned char)(value>>8);p[2]=(unsigned char)(value>>16);p[3]=(unsigned char)(value>>24);}
@ -191,4 +192,35 @@ static void normalize(void)
assert(xtc_project_normalize_audio(p,ids,1,NAN)==XTC_ERR_INVALID_ARGUMENT);
xtc_project_destroy(p);assert(unlink(path)==0 && rmdir(dir)==0);
}
int main(void){markers();sections();ripple();duplicate_track();split_midi();merge_midi();humanize();chords();arpeggio();normalize();puts("Next DAW workflow tests passed.");return 0;}
static void collect(void)
{
xtc_project *p=NULL,*q=NULL;xtc_audio_plan *audio=NULL;xtc_midi_plan *midi=NULL;xtc_plugin_spec spec;
uint64_t t,c,n;xtc_clip_info original,loaded;char root[]="/tmp/xtc-collect-XXXXXX",source[512],dest[512],moved[512],project[512],media[512],failed[512];
assert(mkdtemp(root));snprintf(source,sizeof(source),"%s/source.wav",root);test_wave(source,.5f);
snprintf(dest,sizeof(dest),"%s/collected",root);snprintf(moved,sizeof(moved),"%s/moved",root);snprintf(failed,sizeof(failed),"%s/failed",root);
assert(xtc_project_create(&p)==XTC_OK && xtc_project_create(&q)==XTC_OK && xtc_project_add_track(p,"Track",&t)==XTC_OK);
assert(xtc_project_import_audio(p,t,source,0,&c)==XTC_OK && xtc_project_find_clip(p,c,&original)==XTC_OK);
assert(xtc_project_add_midi_clip(p,t,960,960,&n)==XTC_OK);
assert(xtc_plugin_probe_format(XTC_PLUGIN_BUILTIN,XTC_BUILTIN_PATH,4,48000,&spec)==XTC_OK);strcpy(spec.sample_path,source);
assert(xtc_project_set_instrument(p,t,&spec)==XTC_OK);
{char large[512];uint64_t extra;FILE *f;
snprintf(large,sizeof(large),"%s/large.wav",root);f=fopen(large,"wb");assert(f && ftruncate(fileno(f),268435457)==0 && fclose(f)==0);
assert(xtc_project_add_clip(p,t,"Oversized",1920,960,&extra)==XTC_OK && xtc_project_set_clip_asset(p,extra,large)==XTC_OK);
assert(xtc_project_collect(p,failed)==XTC_ERR_CAPACITY && access(failed,F_OK)!=0);
assert(unlink(large)==0 && mkfifo(large,0600)==0);
assert(xtc_project_collect(p,failed)==XTC_ERR_IO && access(failed,F_OK)!=0);
assert(xtc_project_remove_clip(p,extra)==XTC_OK && unlink(large)==0);}
assert(xtc_project_collect(p,dest)==XTC_OK && xtc_project_collect(p,dest)==XTC_ERR_IO);
assert(xtc_project_find_clip(p,c,&loaded)==XTC_OK && !strcmp(loaded.asset_path,original.asset_path));
assert(rename(dest,moved)==0 && unlink(source)==0);
snprintf(project,sizeof(project),"%s/moved/project.xtc",root);snprintf(media,sizeof(media),"%s/moved/media-000.wav",root);
assert(xtc_project_load(q,project)==XTC_OK && xtc_project_find_clip(q,c,&loaded)==XTC_OK && !strcmp(loaded.asset_path,media));
assert(xtc_project_get_instrument(q,t,&spec)==XTC_OK && !strcmp(spec.sample_path,media));
assert(xtc_audio_plan_create(q,48000,&audio)==XTC_OK && xtc_audio_plan_issues(audio,NULL)==0);
{float sample=0;assert(xtc_audio_plan_render(audio,0,&sample,1)==XTC_OK && fabsf(sample-.5f)<.00001f);}
assert(xtc_midi_plan_create(q,48000,&midi)==XTC_OK && xtc_midi_plan_asset_issues(midi)==0);
assert(xtc_project_collect(p,failed)==XTC_ERR_IO && access(failed,F_OK)!=0);
xtc_audio_plan_destroy(audio);xtc_midi_plan_destroy(midi);xtc_project_destroy(p);xtc_project_destroy(q);
assert(unlink(project)==0 && unlink(media)==0 && rmdir(moved)==0 && rmdir(root)==0);
}
int main(void){markers();sections();ripple();duplicate_track();split_midi();merge_midi();humanize();chords();arpeggio();normalize();collect();puts("Next DAW workflow tests passed.");return 0;}