#include "sequencer_widget.hpp" #include "sequencer_track_widget.hpp" #include #include Fl_Choice *SequencerWidget::instrument_choice(uint64_t track) const { auto *view=track_widget(track); return view && !view->is_bus() ? view->instrument_choice() : nullptr; } void SequencerWidget::refresh_instruments() try { sync_views(); size_t tracks = 0, clips = 0; xtc_project_get_counts(project_,&tracks,&clips); catalog_.clear(); for (unsigned int i=0;i<2;++i) { xtc_plugin_spec s{}; if (xtc_plugin_probe(XTC_BUILTIN_PATH,i,48000,&s)==XTC_OK) catalog_.push_back(s); } for (size_t i = 0; i < tracks; ++i) { xtc_track_info t{}; xtc_plugin_spec spec{}; xtc_project_get_track(project_,i,&t); if (xtc_project_get_instrument(project_,t.id,&spec) != XTC_OK) continue; bool present = false; for (const auto &item : catalog_) if (!std::strcmp(item.path,spec.path) && item.index == spec.index) present = true; if (!present) catalog_.push_back(spec); } for(auto *view:track_widgets_) { auto *choice=view->instrument_choice(); xtc_track_info t{}; for(size_t i=0;itrack_id()) break;} if(t.is_bus) {choice->hide(); continue;} choice->clear(); choice->add("Built-in sine"); xtc_plugin_spec current{}; int selected = 0; bool assigned = xtc_project_get_instrument(project_,t.id,¤t) == XTC_OK; for (size_t j = 0; j < catalog_.size(); ++j) { std::string name = std::string(xtc_plugin_format_name(catalog_[j].format))+": "+catalog_[j].label; int item = choice->add("Instrument"); choice->replace(item,name.c_str()); if (assigned && !std::strcmp(current.path,catalog_[j].path) && current.index == catalog_[j].index) selected = static_cast(j)+1; } choice->add("Load plugin..."); choice->value(selected); choice->show(); } } catch (const std::bad_alloc &) { catalog_.clear(); for(auto *view:track_widgets_) view->instrument_choice()->hide(); } void SequencerWidget::instrument_callback(Fl_Widget *widget, void *context) { auto *owner = static_cast(context); auto *choice = static_cast(widget); for (auto *view : owner->track_widgets_) if (view->instrument_choice() == choice) { uint64_t track = view->track_id(); int index = choice->value(); bool browse = index == static_cast(owner->catalog_.size())+1; xtc_plugin_spec spec{}; if (index > 0 && !browse) { if (static_cast(index) > owner->catalog_.size()) return; spec = owner->catalog_[static_cast(index)-1]; } if (owner->instrument_select) owner->instrument_select(owner->context_,track,index > 0 && !browse ? &spec : nullptr,browse); owner->refresh_instruments(); owner->redraw(); return; } }