sequencer play fix.

This commit is contained in:
Johannes Findeisen 2026-11-06 22:00:35 +01:00
commit d6ded83beb
16 changed files with 372 additions and 16 deletions

View file

@ -48,6 +48,9 @@ xtc_result status_result = XTC_OK, submit_result = XTC_OK, reserve_result = XTC_
unsigned int submissions = 0U;
xtc_backend_status engine_status = {};
bool partial_open = false;
bool midi_ports_available = true;
xtc_result midi_visit_result = XTC_OK, midi_route_result = XTC_OK;
std::string routed_input, routed_output;
unsigned int opens = 0, starts = 0, stops = 0, closes = 0, collects = 0, alive = 0;
int failures = 0;
#define CHECK(c) do { if (!(c)) { std::fprintf(stderr,"FAIL %s:%d: %s\n",__FILE__,__LINE__,#c); ++failures; } } while (0)
@ -116,6 +119,8 @@ void reset()
engine_status.sample_rate = 48000U;
engine_status.buffer_frames = 1024U;
partial_open = false;
midi_ports_available=true; midi_visit_result=midi_route_result=XTC_OK;
routed_input.clear(); routed_output.clear();
}
}
extern "C" {
@ -171,13 +176,13 @@ xtc_result xtc_backend_submit(xtc_backend *backend, const xtc_graph *graph)
return XTC_OK;
}
xtc_result xtc_backend_start_routed(xtc_backend *b,const char *input,const char *output)
{auto r=xtc_backend_start(b);if(r==XTC_OK && input && *input)r=xtc_backend_route_midi(b,XTC_PORT_INPUT,input,0);if(r==XTC_OK && output && *output)r=xtc_backend_route_midi(b,XTC_PORT_OUTPUT,output,0);if(r!=XTC_OK && handle.running)(void)xtc_backend_stop(b);return r;}
{routed_input=input ? input : "";routed_output=output ? output : "";auto r=xtc_backend_start(b);if(r==XTC_OK && input && *input)r=xtc_backend_route_midi(b,XTC_PORT_INPUT,input,0);if(r==XTC_OK && output && *output)r=xtc_backend_route_midi(b,XTC_PORT_OUTPUT,output,0);if(r!=XTC_OK && handle.running)(void)xtc_backend_stop(b);return r;}
xtc_result xtc_backend_set_midi_options(xtc_backend *,int input,int output,int thru)
{CHECK(input>=-1 && input<16 && output>=-1 && output<16 && thru>=0 && thru<2);return handle.running ? XTC_ERR_INVALID_STATE : XTC_OK;}
xtc_result xtc_backend_visit_midi_ports(xtc_backend *,xtc_port_direction d,xtc_backend_port_visitor visit,void *c)
{visit(d==XTC_PORT_OUTPUT ? "Keyboard:out" : "Synth:in",c);return XTC_OK;}
{if(midi_visit_result!=XTC_OK)return midi_visit_result;if(midi_ports_available)visit(d==XTC_PORT_OUTPUT ? "Keyboard:out" : "Synth:in",c);return XTC_OK;}
xtc_result xtc_backend_route_midi(xtc_backend *,xtc_port_direction,const char *name,int)
{return !strcmp(name,"missing:port") ? XTC_ERR_NOT_FOUND : XTC_OK;}
{return !strcmp(name,"missing:port") ? XTC_ERR_NOT_FOUND : midi_route_result;}
xtc_result xtc_backend_panic(xtc_backend *) { xtc_midi_plan_panic(handle.midi, engine_status.sample_position); return XTC_OK; }
xtc_result xtc_backend_read_meters(xtc_backend *, xtc_meter_snapshot *out)
{
@ -372,7 +377,31 @@ int midi_workflow_tests()
CHECK(find(&dialog,"Refresh MIDI devices"));press(find(&dialog,"Refresh MIDI devices"));
CHECK(window.settings().midi_output_channel==4);
auto missing=settings;strcpy(missing.midi_input_port,"missing:port");CHECK(window.apply_preferences(missing)==XTC_OK);
CHECK(window.start_configured_backend()==XTC_ERR_NOT_FOUND && !handle.running);CHECK(window.apply_preferences(settings)==XTC_OK);
CHECK(window.start_configured_backend()==XTC_OK && handle.running);
CHECK(routed_input.empty() && routed_output=="Synth:in");
CHECK(!strcmp(window.settings().midi_input_port,"missing:port"));
CHECK(contains(&window,"MIDI device unavailable"));
CHECK(xtc_backend_stop(&handle)==XTC_OK);
strcpy(missing.midi_input_port,"Keyboard:out");strcpy(missing.midi_output_port,"missing:port");
CHECK(window.apply_preferences(missing)==XTC_OK);
CHECK(window.start_configured_backend()==XTC_OK && routed_input=="Keyboard:out" && routed_output.empty());
CHECK(xtc_backend_stop(&handle)==XTC_OK);
CHECK(window.apply_preferences(settings)==XTC_OK);
midi_ports_available=false;
press(find(&window,"Play"));
CHECK(handle.running && routed_input.empty() && routed_output.empty());
CHECK(contains(&window,"MIDI device unavailable"));
CHECK(xtc_backend_stop(&handle)==XTC_OK);
midi_ports_available=true;
CHECK(window.start_configured_backend()==XTC_OK && routed_input=="Keyboard:out" && routed_output=="Synth:in");
CHECK(xtc_backend_stop(&handle)==XTC_OK);
midi_visit_result=XTC_ERR_IO;
CHECK(window.start_configured_backend()==XTC_ERR_IO && !handle.running);
midi_visit_result=XTC_OK;midi_route_result=XTC_ERR_IO;
CHECK(window.start_configured_backend()==XTC_ERR_IO && !handle.running);
midi_route_result=XTC_OK;start_result=XTC_ERR_IO;
CHECK(window.start_configured_backend()==XTC_ERR_IO && !handle.running);
start_result=XTC_OK;
CHECK(window.create_track(true)==XTC_OK && window.open_piano_roll()==XTC_OK);
CHECK(window.piano_roll()->add_note(0,240,64,90,2)==XTC_OK);
std::string midi=std::string(dir)+"/clip.mid";auto *original=s->project();