@@ -563,4 +563,99 @@ void exec_state_facade::insert(net::midi::midi_parameter& dest, const midi_port&
563
563
{
564
564
impl->insert (dest, v);
565
565
}
566
+
567
+ std::vector<ossia::net::node_base*>
568
+ exec_state_facade::list_destinations (const destination_t & address)
569
+ {
570
+ return ossia::list_destinations (address, impl->exec_devices ());
571
+ }
572
+
573
+ ossia::net::node_base*
574
+ exec_state_facade::get_first_destination (const destination_t & address)
575
+ {
576
+ return ossia::get_first_destination (address, impl->exec_devices ());
577
+ }
578
+
579
+ std::vector<ossia::net::node_base*> list_destinations (
580
+ const destination_t & address,
581
+ const ossia::small_vector<ossia::net::device_base*, 4 >& devices)
582
+ {
583
+ std::vector<ossia::net::node_base*> ret;
584
+ switch (address.which ().index ())
585
+ {
586
+ // ossia::net::parameter_base*
587
+ case destination_t ::index_of<ossia::net::parameter_base*>().index (): {
588
+ auto addr = *address.target <ossia::net::parameter_base*>();
589
+ if (addr)
590
+ {
591
+ ret.push_back (&addr->get_node ());
592
+ break ;
593
+ }
594
+ break ;
595
+ }
596
+
597
+ // ossia::traversal::path
598
+ case destination_t ::index_of<ossia::traversal::path>().index (): {
599
+ std::vector<ossia::net::node_base*> roots{};
600
+
601
+ for (auto n : devices)
602
+ roots.push_back (&n->get_root_node ());
603
+
604
+ auto & p = *address.target <ossia::traversal::path>();
605
+ ossia::traversal::apply (p, roots);
606
+
607
+ for (auto n : roots)
608
+ ret.push_back (n);
609
+ break ;
610
+ }
611
+
612
+ // ossia::net::node_base*
613
+ case destination_t ::index_of<ossia::net::node_base*>().index (): {
614
+ ret.push_back (*address.target <ossia::net::node_base*>());
615
+ break ;
616
+ }
617
+ default :
618
+ break ;
619
+ }
620
+ return ret;
621
+ }
622
+
623
+ ossia::net::node_base* get_first_destination (
624
+ const destination_t & address,
625
+ const ossia::small_vector<ossia::net::device_base*, 4 >& devices)
626
+ {
627
+ switch (address.which ().index ())
628
+ {
629
+ // ossia::net::parameter_base*
630
+ case destination_t ::index_of<ossia::net::parameter_base*>().index (): {
631
+ auto addr = *address.target <ossia::net::parameter_base*>();
632
+ if (addr)
633
+ return &addr->get_node ();
634
+ break ;
635
+ }
636
+
637
+ // ossia::traversal::path
638
+ case destination_t ::index_of<ossia::traversal::path>().index (): {
639
+ std::vector<ossia::net::node_base*> roots{};
640
+
641
+ for (auto n : devices)
642
+ roots.push_back (&n->get_root_node ());
643
+
644
+ auto & p = *address.target <ossia::traversal::path>();
645
+ ossia::traversal::apply (p, roots);
646
+
647
+ for (auto n : roots)
648
+ return n;
649
+ break ;
650
+ }
651
+
652
+ // ossia::net::node_base*
653
+ case destination_t ::index_of<ossia::net::node_base*>().index (): {
654
+ return *address.target <ossia::net::node_base*>();
655
+ }
656
+ default :
657
+ break ;
658
+ }
659
+ return nullptr ;
660
+ }
566
661
}
0 commit comments