use std::sync::Arc;
use multimux::config::{Config, InputSpec};
use multimux::pipeline::SampleSource;
use multimux::{Backoff, InputCtx, SchemeRegistry, SourceConnector};
use transmux::pipeline::{Sample, TrackSpec};
struct SilenceSource;
impl SampleSource for SilenceSource {
fn track_specs(&self) -> Vec<TrackSpec> {
Vec::new()
}
async fn next_samples(&mut self) -> multimux::Result<Option<Vec<(u32, Sample)>>> {
Ok(None)
}
}
struct SilenceConnector;
impl SourceConnector for SilenceConnector {
type Source = SilenceSource;
async fn connect(&self) -> multimux::Result<Self::Source> {
Ok(SilenceSource)
}
}
fn build_registry() -> SchemeRegistry {
let mut registry = SchemeRegistry::new();
registry.register_input(
"silence",
Arc::new(|ctx: InputCtx| {
Ok(tokio::spawn(multimux::supervise(
SilenceConnector,
ctx.store,
ctx.target_duration_secs,
ctx.part_target_ms,
Backoff::production_default(),
ctx.name,
ctx.shutdown_rx,
)))
}),
);
registry
}
fn main() {
let registry = build_registry();
assert!(registry.input("silence").is_some());
assert!(registry.input("nope").is_none());
let json = r#"{
"routes": [
{
"name": "cam1",
"input": { "type": "custom", "type_tag": "silence", "params": {} }
}
]
}"#;
let config: Config = serde_json::from_str(json).expect("valid JSON");
config
.validate()
.expect("a Custom input is always structurally valid");
match &config.routes[0].input {
InputSpec::Custom { type_tag, .. } => assert_eq!(type_tag, "silence"),
other => panic!("expected InputSpec::Custom, got {other:?}"),
}
println!(
"custom_scheme: registered a \"silence\" input scheme with zero multimux edits; \
a config naming it parsed and validated."
);
}