feat(midi): import Standard MIDI Files with transactional undo (phase 104)
This commit is contained in:
parent
02ee1818a3
commit
f37ad8987a
9 changed files with 234 additions and 5 deletions
|
|
@ -372,6 +372,17 @@ int midi_workflow_tests()
|
|||
std::string midi=std::string(dir)+"/clip.mid";auto *original=s->project();
|
||||
CHECK(window.export_midi_clip(midi.c_str())==XTC_OK && s->project()==original);
|
||||
{char signature[4];FILE *f=fopen(midi.c_str(),"rb");CHECK(f && fread(signature,1,4,f)==4 && !memcmp(signature,"MThd",4));if(f)fclose(f);}
|
||||
size_t tracks=0,clips=0;CHECK(xtc_project_get_counts(s->project(),&tracks,&clips)==XTC_OK);auto original_clips=clips;
|
||||
s->position(3840);CHECK(window.import_midi_file(midi.c_str())==XTC_OK);
|
||||
CHECK(xtc_project_get_counts(s->project(),&tracks,&clips)==XTC_OK && clips==original_clips+1);
|
||||
xtc_clip_info imported{};CHECK(xtc_project_find_clip(s->project(),s->selected_clip(),&imported)==XTC_OK && imported.start_tick==3840 && imported.midi);
|
||||
CHECK(window.undo()==XTC_OK && xtc_project_get_counts(s->project(),&tracks,&clips)==XTC_OK && clips==original_clips);
|
||||
original=s->project();submit_result=XTC_ERR_INVALID_STATE;CHECK(window.import_midi_file(midi.c_str())==XTC_ERR_INVALID_STATE && s->project()==original);submit_result=XTC_OK;
|
||||
CHECK(window.import_midi_file("/no-such-xtc-file.mid")==XTC_ERR_NOT_FOUND && s->project()==original);
|
||||
CHECK(window.new_project()==XTC_OK && window.import_midi_file(midi.c_str())==XTC_OK);
|
||||
CHECK(xtc_project_get_counts(s->project(),&tracks,&clips)==XTC_OK && tracks==1 && clips==1);
|
||||
CHECK(window.undo()==XTC_OK && xtc_project_get_counts(s->project(),&tracks,&clips)==XTC_OK && !tracks && !clips);
|
||||
CHECK(window.undo(true)==XTC_OK && xtc_project_get_counts(s->project(),&tracks,&clips)==XTC_OK && tracks==1 && clips==1);
|
||||
unlink(midi.c_str());window.detach_piano(false);
|
||||
s->grid(480);window.show_track_inspector(true);window.resize(20,30,1300,820);
|
||||
CHECK(window.set_loop(960,3840,true)==XTC_OK);window.do_callback();CHECK(!window.shown());
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@
|
|||
#include "xtc/xtc_editing.h"
|
||||
#include "xtc/xtc_audio.h"
|
||||
#include "xtc/xtc_sample.h"
|
||||
#include "xtc/xtc_midi_file.h"
|
||||
#include <dirent.h>
|
||||
#include <assert.h>
|
||||
#include <stdio.h>
|
||||
|
|
@ -294,6 +295,26 @@ static void sample_failures(void)
|
|||
}
|
||||
xtc_sample_destroy(source);xtc_project_destroy(p);assert(rmdir(root)==0);
|
||||
}
|
||||
static void midi_file_failures(void)
|
||||
{
|
||||
xtc_project *p=NULL;uint64_t t,c,n;char path[]="/tmp/xtc-midi-failure-XXXXXX";int fd=mkstemp(path);
|
||||
assert(fd>=0);close(fd);assert(xtc_project_create(&p)==XTC_OK && xtc_project_add_track(p,"MIDI",&t)==XTC_OK);
|
||||
assert(xtc_project_add_midi_clip(p,t,0,1920,&c)==XTC_OK && xtc_project_add_note(p,c,0,480,60,100,2,&n)==XTC_OK);
|
||||
assert(xtc_project_export_midi_clip(p,c,path)==XTC_OK);
|
||||
for(int operation=0;operation<2;++operation){int succeeded=0;
|
||||
for(int failure=0;failure<128;++failure){
|
||||
xtc_project *copy=NULL;uint64_t out=999;size_t tracks,clips,notes;xtc_result r;
|
||||
assert(xtc_project_clone(p,©)==XTC_OK);fail_after=failure;
|
||||
r=operation ? xtc_project_import_midi(copy,t,3840,path,&out) : xtc_project_export_midi_clip(copy,c,path);fail_after=-1;
|
||||
if(r==XTC_OK)succeeded=1;
|
||||
else{assert(r==XTC_ERR_OUT_OF_MEMORY && out==999);
|
||||
assert(xtc_project_get_counts(copy,&tracks,&clips)==XTC_OK && tracks==1 && clips==1 && xtc_project_note_count(copy,¬es)==XTC_OK && notes==1);
|
||||
{FILE *f=fopen(path,"rb");char signature[4];assert(f && fread(signature,1,4,f)==4 && !memcmp(signature,"MThd",4));fclose(f);}
|
||||
}
|
||||
xtc_project_destroy(copy);if(succeeded)break;
|
||||
}assert(succeeded);
|
||||
}xtc_project_destroy(p);unlink(path);
|
||||
}
|
||||
static void strum_failures(void)
|
||||
{
|
||||
xtc_project *p=NULL;uint64_t t,c,n;int succeeded=0;
|
||||
|
|
@ -340,6 +361,7 @@ static void track_insert_failures(void)
|
|||
}
|
||||
int main(void)
|
||||
{
|
||||
midi_file_failures();
|
||||
strum_failures();
|
||||
track_insert_failures();
|
||||
sample_failures();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue