Phase 36: add studio mixer channel strips and refresh screenshots
This commit is contained in:
parent
f2b9b1b819
commit
2d5bcb6401
22 changed files with 667 additions and 142 deletions
|
|
@ -9,6 +9,9 @@
|
|||
#include <FL/Fl_Hold_Browser.H>
|
||||
#include <FL/Fl_Choice.H>
|
||||
#include <FL/Fl_Value_Slider.H>
|
||||
#include <FL/Fl_Dial.H>
|
||||
#include <FL/Fl_Check_Button.H>
|
||||
#include <FL/Fl_Scroll.H>
|
||||
#include <unistd.h>
|
||||
#include <FL/Fl.H>
|
||||
#include <FL/Fl_Box.H>
|
||||
|
|
@ -1006,6 +1009,77 @@ int main(int argc, char **argv)
|
|||
}
|
||||
unlink(path.c_str());rmdir(dir);
|
||||
}
|
||||
{
|
||||
reset();MainWindow window(false,"");window.show();auto *m=window.mixer();
|
||||
CHECK(m->strip_count()==0 && m->strip(UINT64_MAX)==nullptr);
|
||||
CHECK(window.create_track(true)==XTC_OK && window.create_track(true)==XTC_OK);
|
||||
xtc_track_info a{},b{};xtc_project_get_track(m->project(),0,&a);xtc_project_get_track(m->project(),1,&b);
|
||||
CHECK(m->strip_count()==2 && m->strip(a.id) && m->strip(b.id));
|
||||
auto *first=m->strip(a.id);
|
||||
auto *fader=dynamic_cast<Fl_Value_Slider *>(find(first,"dB"));CHECK(fader);
|
||||
CHECK(fader && fader->type()==FL_VERT_SLIDER && fader->h()>fader->w());
|
||||
if(fader){fader->value(-6);fader->do_callback();}
|
||||
xtc_project_get_track(m->project(),0,&a);xtc_project_get_track(m->project(),1,&b);
|
||||
CHECK(std::fabs(a.gain-std::pow(10.f,-6.f/20))<.0001f && b.gain==1);
|
||||
CHECK(first==m->strip(a.id)); // Editing must not delete its callback's widget.
|
||||
if(fader){gesture(fader,20,40,0,30);xtc_project_get_track(m->project(),0,&a);CHECK(a.gain<.5f);CHECK(window.undo()==XTC_OK);}
|
||||
if(fader){
|
||||
reserve_result=XTC_ERR_OUT_OF_MEMORY;
|
||||
Fl::add_timeout(.05,[](void *){auto *dialog=Fl::first_window();CHECK(dialog && contains(dialog,"Mixer edit failed"));if(dialog)dialog->hide();});
|
||||
fader->value(-12);fader->do_callback();reserve_result=XTC_OK;
|
||||
xtc_project_get_track(m->project(),0,&a);CHECK(std::fabs(a.gain-std::pow(10.f,-6.f/20))<.0001f);
|
||||
CHECK(std::fabs(fader->value()+6)<.001);
|
||||
}
|
||||
press(find(m->strip(b.id),b.name));CHECK(m->selected_track()==b.id);
|
||||
CHECK(window.undo()==XTC_OK);xtc_project_get_track(m->project(),0,&a);CHECK(a.gain==1);
|
||||
CHECK(window.undo(true)==XTC_OK);xtc_project_get_track(m->project(),0,&a);CHECK(a.gain<.51f);
|
||||
Fl_Dial *pan=nullptr;for(int i=0;i<m->strip(b.id)->children();++i)if(auto *d=dynamic_cast<Fl_Dial *>(m->strip(b.id)->child(i)))pan=d;
|
||||
CHECK(pan);if(pan){pan->value(-.75);pan->do_callback();}
|
||||
xtc_project_get_track(m->project(),1,&b);CHECK(b.pan==-.75f && b.gain==1);
|
||||
auto *mute=dynamic_cast<Fl_Check_Button *>(find(m->strip(b.id),"Mute"));CHECK(mute);
|
||||
if(mute){mute->value(1);mute->do_callback();}xtc_project_get_track(m->project(),1,&b);CHECK(b.mute && b.pan==-.75f);
|
||||
if(pan){int old=Fl::e_clicks;Fl::e_clicks=1;gesture(pan,20,20,0,0);Fl::e_clicks=old;}
|
||||
xtc_project_get_track(m->project(),1,&b);CHECK(b.pan==0 && b.mute);
|
||||
CHECK(m->add_bus()==XTC_OK);uint64_t bus=m->selected_track();CHECK(m->strip_count()==3 && contains(m->strip(bus),"Bus:"));
|
||||
Fl_Choice *route=nullptr;for(int i=0;i<m->strip(a.id)->children();++i)if(auto *c=dynamic_cast<Fl_Choice *>(m->strip(a.id)->child(i)))route=c;
|
||||
CHECK(route && route->size()==3); // Master, bus, terminator.
|
||||
if(route){route->value(1);route->do_callback();}xtc_project_get_track(m->project(),0,&a);CHECK(a.bus_id==bus);
|
||||
CHECK(window.undo()==XTC_OK);xtc_project_get_track(m->project(),0,&a);CHECK(a.bus_id==UINT64_MAX);
|
||||
CHECK(m->add_bus()==XTC_OK);CHECK(m->strip_count()==4);
|
||||
auto *routes=dynamic_cast<Fl_Choice *>(find(m,"Route"));CHECK(routes && routes->size()==4);
|
||||
CHECK(window.undo()==XTC_OK);CHECK(m->strip_count()==3);
|
||||
xtc_meter_snapshot snapshot{};snapshot.count=2;snapshot.tracks[0]={a.id,.5f,.25f};snapshot.tracks[1]={b.id,1.2f,.125f};
|
||||
m->meters(snapshot);CHECK(contains(m->strip(a.id),"L -6.0") && contains(m->strip(b.id),"CLIP"));
|
||||
m->select_track(a.id);CHECK(contains(m->strip(b.id),"CLIP"));m->meters(xtc_meter_snapshot{});CHECK(contains(m->strip(b.id),"CLIP"));
|
||||
m->reset_meters();CHECK(!contains(m->strip(b.id),"CLIP"));
|
||||
CHECK(window.save_project("/tmp/xtc-mixer-strips.xtc")==XTC_OK && window.open_project("/tmp/xtc-mixer-strips.xtc")==XTC_OK);
|
||||
CHECK(m->strip_count()==3);xtc_project_get_track(m->project(),1,&b);CHECK(b.pan==0 && b.mute);
|
||||
CHECK(m->select_track(b.id) && m->mix(.00001f,0,0,0)==XTC_OK);
|
||||
mute=dynamic_cast<Fl_Check_Button *>(find(m->strip(b.id),"Mute"));CHECK(mute);
|
||||
if(mute){mute->value(1);mute->do_callback();}xtc_project_get_track(m->project(),1,&b);CHECK(b.gain==.00001f && b.mute);
|
||||
unlink("/tmp/xtc-mixer-strips.xtc");window.do_callback();
|
||||
}
|
||||
{
|
||||
xtc_project *project=nullptr;CHECK(xtc_project_create(&project)==XTC_OK);
|
||||
uint64_t first=UINT64_MAX,last=UINT64_MAX;
|
||||
for(size_t i=0;i<XTC_PROJECT_MAX_TRACKS;++i){uint64_t id;char name[40];std::snprintf(name,sizeof(name),"Duplicate/name & _track");
|
||||
CHECK(xtc_project_add_track(project,name,&id)==XTC_OK);if(i==0)first=id;last=id;}
|
||||
{
|
||||
Fl_Double_Window window(1100,600);window.begin();MixerWidget m(0,0,1032,522,project,nullptr,nullptr);window.end();window.show();
|
||||
CHECK(m.strip_count()==XTC_PROJECT_MAX_TRACKS && m.select_track(last));
|
||||
auto *track_choice=dynamic_cast<Fl_Choice *>(find(&m,"Track"));
|
||||
CHECK(track_choice && track_choice->size()==static_cast<int>(XTC_PROJECT_MAX_TRACKS)+1);
|
||||
CHECK(track_choice && track_choice->value()==static_cast<int>(XTC_PROJECT_MAX_TRACKS)-1);
|
||||
CHECK(m.strip(last)->x()>=m.x() && m.strip(last)->x()+m.strip(last)->w()<m.x()+m.w()-144);
|
||||
CHECK(xtc_project_move_track(project,last,0)==XTC_OK);m.set_project(project);
|
||||
CHECK(m.selected_track()==last && m.strip_count()==XTC_PROJECT_MAX_TRACKS);
|
||||
CHECK(xtc_project_remove_track(project,first)==XTC_OK);m.set_project(project);CHECK(!m.strip(first));
|
||||
m.resize(0,0,972,442);m.select_track(last);auto *f=dynamic_cast<Fl_Value_Slider *>(find(m.strip(last),"dB"));CHECK(f && f->h()>40);
|
||||
m.resize(0,0,1500,900);CHECK(f && f->h()>400);
|
||||
window.hide();
|
||||
}
|
||||
xtc_project_destroy(project);
|
||||
}
|
||||
if (failures != 0) return 1;
|
||||
std::printf("GUI controls/errors/views/timers/cleanup passed: %u opens, %u closes.\n", opens, closes);
|
||||
return 0;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue