Zrythm v2.0.0-alpha.1
a highly automated and intuitive digital audio workstation
Loading...
Searching...
No Matches
channel_subgraph_builder.h
1// SPDX-FileCopyrightText: © 2025-2026 Alexandros Theodotou <alex@zrythm.org>
2// SPDX-License-Identifier: LicenseRef-ZrythmLicense
3
4#pragma once
5
6#include "dsp/graph.h"
7#include "structure/tracks/channel.h"
8#include "utils/views.h"
9
10namespace zrythm::structure::tracks
11{
17{
18public:
19 static void add_nodes (dsp::graph::Graph &graph, Channel &ch);
20
34 static void add_connections (
35 dsp::graph::Graph &graph,
36 Channel &ch,
37 dsp::PortUuidReference track_processor_output);
38
48 template <dsp::FinalPortSubclass T>
50 dsp::graph::Graph &graph,
51 const T &src_port,
52 const T &dest_port)
53 {
54 auto * src = graph.get_nodes ().find_node_for_processable (src_port);
55 auto * dest = graph.get_nodes ().find_node_for_processable (dest_port);
56 assert (src);
57 assert (dest);
58 assert (src != dest && "Cannot connect a port to itself");
59 assert (src_port.is_output () && "Source port must be an output port");
60 assert (dest_port.is_input () && "Destination port must be an input port");
61 src->connect_to (*dest);
62 }
63
70 static bool connect_like_ports (
71 dsp::graph::Graph &graph,
72 const utils::RangeOf<dsp::PortUuidReference> auto &src_refs,
73 const utils::RangeOf<dsp::PortUuidReference> auto &dest_refs)
74 {
75 const auto object_getter = [] (auto &&port_ref) { return port_ref.get (); };
76 const auto src_output_ports =
77 src_refs | std::views::transform (object_getter);
78 const auto dest_input_ports =
79 dest_refs | std::views::transform (object_getter);
80
81 using utils::views::qobject_cast_and_filter;
82 auto src_midi_out_ports =
83 src_output_ports | qobject_cast_and_filter<dsp::MidiPort>;
84 auto dest_midi_in_ports =
85 dest_input_ports | qobject_cast_and_filter<dsp::MidiPort>;
86 auto src_audio_out_ports =
87 src_output_ports | qobject_cast_and_filter<dsp::AudioPort>;
88 auto dest_audio_in_ports =
89 dest_input_ports | qobject_cast_and_filter<dsp::AudioPort>;
90 auto src_cv_out_ports =
91 src_output_ports | qobject_cast_and_filter<dsp::CVPort>;
92 auto dest_cv_in_ports =
93 dest_input_ports | qobject_cast_and_filter<dsp::CVPort>;
94
95 bool connections_made{};
96 const auto make_conns = [&connections_made, &graph] (const auto &ports) {
97 const auto &[src_port, dest_port] = ports;
98 add_connection_for_ports (graph, *src_port, *dest_port);
99 connections_made = true;
100 };
101
102 std::ranges::for_each (
103 std::views::zip (src_midi_out_ports, dest_midi_in_ports), make_conns);
104 std::ranges::for_each (
105 std::views::zip (src_audio_out_ports, dest_audio_in_ports), make_conns);
106 std::ranges::for_each (
107 std::views::zip (src_cv_out_ports, dest_cv_in_ports), make_conns);
108
109 return connections_made;
110 }
111};
112} // namespace zrythm::structure::tracks
The Graph class represents a graph of DSP nodes.
Definition graph.h:20
A helper class to add nodes and standard connections for a channel to a DSP graph.
static void add_connection_for_ports(dsp::graph::Graph &graph, const T &src_port, const T &dest_port)
Adds a connection to the graph for the given ports.
static void add_connections(dsp::graph::Graph &graph, Channel &ch, dsp::PortUuidReference track_processor_output)
Adds connections for the nodes already in the graph.
static bool connect_like_ports(dsp::graph::Graph &graph, const utils::RangeOf< dsp::PortUuidReference > auto &src_refs, const utils::RangeOf< dsp::PortUuidReference > auto &dest_refs)
Connects ports of the same type in the given source and destination ranges.
Represents a channel strip on the mixer.
Definition channel.h:58