Zrythm v2.0.0-DEV
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
port_all.h
1// SPDX-FileCopyrightText: © 2025 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/audio_port.h"
7#include "dsp/cv_port.h"
8#include "dsp/graph.h"
9#include "dsp/midi_port.h"
10
11namespace zrythm::dsp
12{
13
23inline void
24add_connection_for_ports (
25 dsp::graph::Graph &graph,
26 const dsp::PortPtrVariant &src_var,
27 const dsp::PortPtrVariant &dest_var)
28{
29 std::visit (
30 [&] (auto &&src_port, auto &&dest_port) {
31 auto * src = graph.get_nodes ().find_node_for_processable (*src_port);
32 auto * dest = graph.get_nodes ().find_node_for_processable (*dest_port);
33 assert (src);
34 assert (dest);
35 src->connect_to (*dest);
36 },
37 src_var, dest_var);
38}
39
46inline bool
47connect_like_ports (
48 dsp::graph::Graph &graph,
49 const RangeOf<PortUuidReference> auto &src_refs,
50 const RangeOf<PortUuidReference> auto &dest_refs)
51{
52 using ObjectView = utils::UuidIdentifiableObjectView<dsp::PortRegistry>;
53 const auto object_getter = [] (auto &&port_ref) {
54 return port_ref.get_object ();
55 };
56 const auto src_output_ports = src_refs | std::views::transform (object_getter);
57 const auto dest_input_ports =
58 dest_refs | std::views::transform (object_getter);
59
60 auto src_midi_out_ports =
61 src_output_ports
62 | std::views::filter (ObjectView::type_projection<dsp::MidiPort>)
63 | std::views::transform (ObjectView::type_transformation<dsp::MidiPort>);
64 auto dest_midi_in_ports =
65 dest_input_ports
66 | std::views::filter (ObjectView::type_projection<dsp::MidiPort>)
67 | std::views::transform (ObjectView::type_transformation<dsp::MidiPort>);
68 auto src_audio_out_ports =
69 src_output_ports
70 | std::views::filter (ObjectView::type_projection<dsp::AudioPort>)
71 | std::views::transform (ObjectView::type_transformation<dsp::AudioPort>);
72 auto dest_audio_in_ports =
73 dest_input_ports
74 | std::views::filter (ObjectView::type_projection<dsp::AudioPort>)
75 | std::views::transform (ObjectView::type_transformation<dsp::AudioPort>);
76 auto src_cv_out_ports =
77 src_output_ports
78 | std::views::filter (ObjectView::type_projection<dsp::CVPort>)
79 | std::views::transform (ObjectView::type_transformation<dsp::CVPort>);
80 auto dest_cv_in_ports =
81 dest_input_ports
82 | std::views::filter (ObjectView::type_projection<dsp::CVPort>)
83 | std::views::transform (ObjectView::type_transformation<dsp::CVPort>);
84
85 bool connections_made{};
86 const auto make_conns = [&connections_made, &graph] (const auto &ports) {
87 const auto &[src_port, dest_port] = ports;
88 add_connection_for_ports (graph, src_port, dest_port);
89 connections_made = true;
90 };
91
92 std::ranges::for_each (
93 std::views::zip (src_midi_out_ports, dest_midi_in_ports), make_conns);
94 std::ranges::for_each (
95 std::views::zip (src_audio_out_ports, dest_audio_in_ports), make_conns);
96 std::ranges::for_each (
97 std::views::zip (src_cv_out_ports, dest_cv_in_ports), make_conns);
98
99 return connections_made;
100}
101} // namespace zrythm::dsp