#include #include "NodeBase.hpp" #include "FlowDef.hpp" #include #include namespace dmf { class GainDbNode: public dmf::NodeBase { void run() override { if (!config().contains("audio_in_flow_id") || !config().contains("audio_out_flow_id")) { log("no audio connected to in or out"); return; } const std::string in_flow_id = config().at("audio_in_flow_id").at("id").get(); dmf::AudioFlowInfo in_flow_info = dmf::read_audio_flow_info(domain(), in_flow_id); int gain = 0; if (config().contains("gain")) { gain = config().at("gain").get(); } // create writer int sample_rate = in_flow_info.sample_rate; const std::string out_flow_id = config().at("audio_out_flow_id").at("id").get(); std::string flow_def = dmf::make_audio_flow_def( out_flow_id, node_id(), sample_rate, in_flow_info.channels, 32, sample_rate, in_flow_info.samples_per_grain ); mxlFlowWriter writer{}; mxlFlowConfigInfo cfg{}; bool created = false; mxlStatus st = mxlCreateFlowWriter(instance(), flow_def.c_str(), nullptr, &writer, &cfg, &created); if (st != MXL_STATUS_OK) { log("audio mxlCreateFlowWriter failed (%s) — continuing without audio", dmf::mxl_status_str(st)); } else { log("audio channels=%u buffer=%u samples", cfg.continuous.channelCount, cfg.continuous.bufferLength); } const mxlRational rate = {sample_rate, 1}; uint64_t index = mxlGetCurrentIndex(&rate); while (dmf::g_running.load(std::memory_order_relaxed)) { mxlMutableBufferSlice slice{}; uint8_t* buf = nullptr; } mxlReleaseFlowWriter(instance(), writer); } }; } int main() { dmf::GainDbNode node; return node.execute(); }