feat: garbage collection on startup, readable status strings, audio/float32

studio-manager: call mxlGarbageCollectFlows before launching nodes to
clean up stale flow directories left by previous crashed runs.

shared/NodeBase.hpp: add mxl_status_str(mxlStatus) — converts error
codes to readable names (e.g. MXL_ERR_OUT_OF_RANGE_TOO_LATE). All
nodes now log these names instead of raw integers.

shared/FlowDef.hpp: use "audio/float32" as media_type for 32-bit audio
flows, matching the MXL SDK examples. audio/L{n} kept for other depths.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
JohannesItten
2026-07-03 10:20:53 +03:00
parent 39ba8add1a
commit 21a8ee4ba0
7 changed files with 52 additions and 12 deletions
+1 -1
View File
@@ -59,7 +59,7 @@ inline std::string make_audio_flow_def(
{"format", "urn:x-nmos:format:audio"},
{"label", label},
{"description", label + " MXL Audio Flow"},
{"media_type", "audio/L" + std::to_string(bit_depth)},
{"media_type", bit_depth == 32 ? "audio/float32" : "audio/L" + std::to_string(bit_depth)},
{"parents", json::array()},
{"grain_rate", {{"numerator", grain_rate_num}, {"denominator", grain_rate_den}}},
{"sample_rate", {{"numerator", sample_rate}, {"denominator", 1}}},
+29
View File
@@ -10,6 +10,35 @@
namespace dmf {
inline const char* mxl_status_str(mxlStatus s) noexcept {
switch (s) {
case MXL_STATUS_OK: return "MXL_STATUS_OK";
case MXL_ERR_UNKNOWN: return "MXL_ERR_UNKNOWN";
case MXL_ERR_FLOW_NOT_FOUND: return "MXL_ERR_FLOW_NOT_FOUND";
case MXL_ERR_OUT_OF_RANGE_TOO_LATE: return "MXL_ERR_OUT_OF_RANGE_TOO_LATE";
case MXL_ERR_OUT_OF_RANGE_TOO_EARLY: return "MXL_ERR_OUT_OF_RANGE_TOO_EARLY";
case MXL_ERR_INVALID_FLOW_READER: return "MXL_ERR_INVALID_FLOW_READER";
case MXL_ERR_INVALID_FLOW_WRITER: return "MXL_ERR_INVALID_FLOW_WRITER";
case MXL_ERR_TIMEOUT: return "MXL_ERR_TIMEOUT";
case MXL_ERR_INVALID_ARG: return "MXL_ERR_INVALID_ARG";
case MXL_ERR_CONFLICT: return "MXL_ERR_CONFLICT";
case MXL_ERR_PERMISSION_DENIED: return "MXL_ERR_PERMISSION_DENIED";
case MXL_ERR_FLOW_INVALID: return "MXL_ERR_FLOW_INVALID";
case MXL_ERR_STRLEN: return "MXL_ERR_STRLEN";
case MXL_ERR_INTERRUPTED: return "MXL_ERR_INTERRUPTED";
case MXL_ERR_NO_FABRIC: return "MXL_ERR_NO_FABRIC";
case MXL_ERR_INVALID_STATE: return "MXL_ERR_INVALID_STATE";
case MXL_ERR_INTERNAL: return "MXL_ERR_INTERNAL";
case MXL_ERR_NOT_READY: return "MXL_ERR_NOT_READY";
case MXL_ERR_NOT_FOUND: return "MXL_ERR_NOT_FOUND";
case MXL_ERR_EXISTS: return "MXL_ERR_EXISTS";
case MXL_ERR_UNSUPPORTED_OPERATION: return "MXL_ERR_UNSUPPORTED_OPERATION";
default: return "MXL_ERR_UNRECOGNIZED";
}
}
// Base class for all DMF node binaries.
//
// Handles the boilerplate every node needs: