1
0
Fork 0
forked from hanez/xtc
xtc/tests/integration/test_portability.c

94 lines
5.5 KiB
C
Raw Normal View History

#define _XOPEN_SOURCE 700
#include "xtc/xtc_audio.h"
#include "xtc/xtc_mixer.h"
#include "xtc/xtc_midi.h"
#include "xtc/xtc_plugin.h"
#include "xtc/xtc_control.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
int main(void)
{
char root[] = "/tmp/xtc-portable-XXXXXX", moved[512], file[512], media[512], old[512];
xtc_project *p = NULL; unsigned version; uint64_t track, clip;
float in[64], expected[64], actual[64]; size_t i;
xtc_recorder *rec = NULL; xtc_audio_plan *audio = NULL;
assert(mkdtemp(root));
assert(xtc_project_create(&p) == XTC_OK);
snprintf(file,sizeof(file),"%s/migration.xtc",root);
for (version = 1; version <= 9; ++version) {
xtc_track_info t; xtc_clip_info c; size_t notes, points;
snprintf(old,sizeof(old),"tests/fixtures/project-v%u.xtc",version);
assert(xtc_project_load(p,old) == XTC_OK);
assert(xtc_project_get_track(p,0,&t) == XTC_OK && !strcmp(t.name,"Keys") && t.gain == 1);
assert(xtc_project_get_clip(p,0,&c) == XTC_OK && c.midi == (version >= 3));
assert(!t.is_bus && t.bus_id == UINT64_MAX);
assert(c.gain == 1 && c.fade_in_tick == 0 && c.fade_out_tick == 0);
assert(xtc_project_note_count(p,&notes) == XTC_OK && notes == (size_t)(version >= 3));
assert(xtc_project_automation_count(p,&points) == XTC_OK && points == (size_t)(version >= 4));
{ unsigned int map[3]; xtc_automation_point point;
assert(xtc_project_get_control_map(p,0,map) == XTC_OK && map[0] == 7 && map[1] == 10 && map[2] == 64);
if (points) assert(xtc_project_get_automation(p,0,&point) == XTC_OK && !point.step); }
assert(xtc_project_save(p,file) == XTC_OK && xtc_project_load(p,file) == XTC_OK);
}
for (version = 5; version <= 6; ++version) {
xtc_plugin_spec spec; xtc_plan *plan = NULL;
snprintf(old,sizeof(old),"tests/fixtures/project-plugin-v%u.xtc",version);
assert(xtc_project_load(p,old) == XTC_OK);
assert(xtc_graph_get_plugin(xtc_project_graph(p),0,&spec) == XTC_OK && spec.tempo == 120000 && spec.point_count == version-5);
assert(xtc_project_save(p,file) == XTC_OK && xtc_project_load(p,file) == XTC_OK);
{ xtc_result r = xtc_graph_compile(xtc_project_graph(p),48000,64,&plan);
assert((r == XTC_ERR_NOT_FOUND || r == XTC_ERR_UNSUPPORTED) && !plan); }
}
xtc_project_destroy(p); p = NULL;
assert(xtc_project_create(&p) == XTC_OK && xtc_project_add_track(p,"Audio",&track) == XTC_OK);
snprintf(media,sizeof(media),"%s/media.wav",root);
for (i = 0; i < 64; ++i) in[i] = (float)i / 100;
assert(xtc_recorder_create(media,48000,64,&rec) == XTC_OK);
xtc_recorder_push(rec,in,64); assert(xtc_recorder_finish(rec) == XTC_OK); xtc_recorder_destroy(rec);
assert(xtc_project_import_audio(p,track,media,0,&clip) == XTC_OK);
assert(xtc_audio_plan_create(p,48000,&audio) == XTC_OK);
assert(xtc_audio_plan_render(audio,0,expected,64) == XTC_OK); xtc_audio_plan_destroy(audio);
assert(xtc_project_save(p,file) == XTC_OK);
{ FILE *f = fopen(file,"r"); char text[4096]; size_t n; assert(f);
n = fread(text,1,sizeof(text)-1,f); text[n] = 0; fclose(f);
assert(strstr(text,"ASSET 6d656469612e776176\n")); }
{
char sub[512], copy[512]; xtc_clip_info c;
snprintf(sub,sizeof(sub),"%s/elsewhere",root); assert(mkdir(sub,0700) == 0);
snprintf(copy,sizeof(copy),"%s/elsewhere/copy.xtc",root);
assert(xtc_project_save(p,copy) == XTC_OK && xtc_project_load(p,copy) == XTC_OK);
assert(xtc_project_find_clip(p,clip,&c) == XTC_OK && !strcmp(c.asset_path,media));
unlink(copy); rmdir(sub);
}
{
char alias_dir[512], alias[512]; xtc_clip_info c;
snprintf(alias_dir,sizeof(alias_dir),"%s/aliases",root); assert(mkdir(alias_dir,0700) == 0);
snprintf(alias,sizeof(alias),"%s/aliases/link.xtc",root); assert(symlink(file,alias) == 0);
assert(xtc_project_load(p,alias) == XTC_OK);
assert(xtc_project_find_clip(p,clip,&c) == XTC_OK && !strcmp(c.asset_path,media));
unlink(alias); rmdir(alias_dir);
}
snprintf(moved,sizeof(moved),"%s-moved",root); assert(rename(root,moved) == 0);
snprintf(file,sizeof(file),"%s-moved/migration.xtc",root);
assert(xtc_project_load(p,file) == XTC_OK);
{ char *cwd = getcwd(NULL,0); assert(cwd && chdir("/") == 0);
assert(xtc_audio_plan_create(p,48000,&audio) == XTC_OK && xtc_audio_plan_issues(audio,NULL) == 0);
assert(xtc_audio_plan_render(audio,0,actual,64) == XTC_OK);
for (i = 0; i < 64; ++i) assert(expected[i] == actual[i]);
xtc_audio_plan_destroy(audio); assert(chdir(cwd) == 0); free(cwd); }
snprintf(media,sizeof(media),"%s-moved/media.wav",root); assert(unlink(media) == 0);
assert(xtc_project_save(p,file) == XTC_OK && xtc_project_load(p,file) == XTC_OK);
assert(xtc_audio_plan_create(p,48000,&audio) == XTC_OK && xtc_audio_plan_issues(audio,NULL) == 1);
xtc_audio_plan_destroy(audio);
/* Unknown records/versions fail without discarding the retained clip. */
{ FILE *f = fopen(file,"a"); assert(f); fputs("FUTURE 1\n",f); fclose(f);
assert(xtc_project_load(p,file) == XTC_ERR_FORMAT);
{ xtc_clip_info c; assert(xtc_project_find_clip(p,clip,&c) == XTC_OK && c.asset_path[0]); } }
xtc_project_destroy(p); unlink(file); rmdir(moved);
puts("v1-v9 migration, current folder relocation, cwd independence and missing-media preservation passed.");
return 0;
}