Inferno - Dante

Hey,
I’m trying Inferno Dante virtual soundcard.

It doesn’t work for now.

  • compiled statime and alsa_pcm_inferno successfully
  • I only add my ethernet interface in inferno-ptpv1.toml and used asoundrc inferno example

I can’t start statime with

sudo target/debug/statime -c inferno-ptpv1.toml

since statime doesn’t exist.
Inferno doesn’t appear in aplay -l

1 Like

I know nothing about this project but if you are running a local binary, you may want to execute this command:

sudo ./target/debug/statime -c inferno-ptpv1.toml

So you must add ./ to the executable path if you are currently doing this from the directory containing subdir target/debug .

1 Like

@djamo is right about starting statime.
Here is the content of my .asoundrc file. It should be in your home folder.

Replace “eth0” with the name of the network interface you’ll use.


pcm.fixed {
	type plug
	slave.pcm "inferno"
	hint {
		show on
		description "Plug - Inferno ALSA"
	}
}

pcm.inferno {
	type inferno
	rate 48000
	NAME "how_you_want_your_computer_to_appear_in_dante_controller"
	SAMPLE_RATE "48000"
	TX_CHANNELS 16
	RX_CHANNELS 16
	BIND_IP "eth0"
	hint {
		show on
		description "RAW - Inferno ALSA"
	}
}

ctl.fixed {
	type hw
	card 10
}

ctl.inferno {
	type hw
	card 11
}
1 Like

Would this work with a Behringer xr18 on Linux?
Would an extra piece of hardware be needed?
Many thanks

The XR18 is not Dante-enabled afaik, so no.

Correct.

The XR18 has an Ultranet interface, but this is nothing like Dante or any other AoIP protocol (apparently it’s Audio over Cat 5 but doesn’t even use Ethernet, yet alone IP).

If you are thinking you can connect a normal PC with an ethernet interface to the Ultranet port on an XR18, then, sorry, it it’s totally incompatible.

Someone has reversed engineered Ultranet, if you are interested:

Cheers,

Keith

1 Like

I think it also has a network connection which is used only for control, no audio transfer.

Yes, that is also correct. MIDI and OSC. No audio.

Cheers,

Keith

I definitely can’t start statime, I get “command not found”, even with ./
In target/debug, I have:

drwxrwxr-x 14 raphael raphael    4096 nov 24 15:37 build
drwxrwxr-x  2 raphael raphael   24576 nov 24 15:37 deps
drwxrwxr-x  2 raphael raphael    4096 nov 24 15:37 examples
drwxrwxr-x  3 raphael raphael    4096 nov 24 15:37 incremental
-rw-rw-r--  1 raphael raphael    5882 nov 24 15:37 libstatime.d
-rw-rw-r--  2 raphael raphael 6494620 nov 24 15:37 libstatime.rlib

I started again with statime from clone to compilation, now it is working, I have a statime file in target/debug.

2 Likes

Ok, I think statime is now working:

...
2025-11-28T15:04:48.493342Z TRACE timestamped_socket::socket: Timestamps: Some(Timestamp { seconds: 1764342288, nanos: 492965011 }) None
2025-11-28T15:04:48.493422Z TRACE log: Recv timestamp: Some(Timestamp { seconds: 1764342288, nanos: 492965011 }) log.target="statime" log.module_path="statime" log.file="statime-linux/src/main.rs" log.line=789
2025-11-28T15:04:48.493527Z DEBUG log: Received sync 695 log.target="statime::port::slave" log.module_path="statime::port::slave" log.file="/home/raphael/ApplicationsAutre/statime/statime/src/port/slave.rs" log.line=172
2025-11-28T15:04:48.493599Z TRACE timestamped_socket::socket: Timestamps: Some(Timestamp { seconds: 1764342288, nanos: 493306804 }) None
2025-11-28T15:04:48.494281Z DEBUG log: Received FollowUp 695 log.target="statime::port::slave" log.module_path="statime::port::slave" log.file="/home/raphael/ApplicationsAutre/statime/statime/src/port/slave.rs" log.line=283
2025-11-28T15:04:48.494340Z  INFO log: Measurement: Measurement { event_time: Time { inner: 1020186468611.0999701587 }, offset: Some(Duration { inner: -58807.3729396495 }), delay: None, peer_delay: None, raw_sync_offset: Some(Duration { inner: 65983.0999701587 }), raw_delay_offset: None } log.target="statime::port::slave" log.module_path="statime::port::slave" log.file="/home/raphael/ApplicationsAutre/statime/statime/src/port/slave.rs" log.line=607
2025-11-28T15:04:48.494430Z TRACE log: Wander uncertainty: 188656.9726245609ns log.target="statime::filters::kalman" log.module_path="statime::filters::kalman" log.file="statime/src/filters/kalman.rs" log.line=716
2025-11-28T15:04:48.494463Z TRACE log: wander score: -1 log.target="statime::filters::kalman" log.module_path="statime::filters::kalman" log.file="statime/src/filters/kalman.rs" log.line=767
2025-11-28T15:04:48.494526Z TRACE log: Estimated offset 256.42518717239693ns+-5880.656974180913ns, freq -0.37849854745446926+-0.10525108517673298, delay 124724.84626614235+-3426.51007411859 log.target="statime::filters::kalman" log.module_path="statime::filters::kalman" log.file="statime/src/filters/kalman.rs" log.line=679
2025-11-28T15:04:48.494609Z TRACE log: Steered frequency by 0.2502859538682708ppm (target: -0.12821259358619846ppm) log.target="statime::filters::kalman" log.module_path="statime::filters::kalman" log.file="/home/raphael/ApplicationsAutre/statime/statime/src/filters/kalman.rs" log.line=659

But I can’t see “Inferno” in aplay -l or in Cadence.Inferno lib is in the correct directory (/usr/lib/x86_64-linux-gnu/alsa-lib/ libasound_module_pcm_inferno.so) Here is my .asoundrc

# ------------------------------------------------------
# Custom asoundrc file for use with snd-aloop and JACK
#
# use it like this:
# env JACK_SAMPLE_RATE=44100 JACK_PERIOD_SIZE=1024 alsa_in (...)
#

# ------------------------------------------------------
# playback device
pcm.aloopPlayback {
  type dmix
  ipc_key 1
  ipc_key_add_uid true
  slave {
    pcm "hw:Loopback,0,0"
    format S32_LE
    rate {
      @func igetenv
      vars [ JACK_SAMPLE_RATE ]
      default 44100
    }
    period_size {
      @func igetenv
      vars [ JACK_PERIOD_SIZE ]
      default 1024
    }
    buffer_size 4096
  }
}

# capture device
pcm.aloopCapture {
  type dsnoop
  ipc_key 2
  ipc_key_add_uid true
  slave {
    pcm "hw:Loopback,0,1"
    format S32_LE
    rate {
      @func igetenv
      vars [ JACK_SAMPLE_RATE ]
      default 44100
    }
    period_size {
      @func igetenv
      vars [ JACK_PERIOD_SIZE ]
      default 1024
    }
    buffer_size 4096
  }
}

# duplex device
pcm.aloopDuplex {
  type asym
  playback.pcm "aloopPlayback"
  capture.pcm "aloopCapture"
}

pcm.inferno {
	type inferno
	@args.NAME { type string }
	@args.DEVICE_ID { type string }
	@args.BIND_IP { type string }
	@args.SAMPLE_RATE { type string }
	@args.PROCESS_ID { type string }
	@args.ALT_PORT { type string }
	@args.RX_CHANNELS { type string }
	@args.TX_CHANNELS { type string }
	@args.CLOCK_PATH { type string }
	@args.RX_LATENCY_NS { type string }
	@args.TX_LATENCY_NS { type string }

	# note: too long ALSA device string may not work in some or all apps (noticed in PipeWire)
	# so if you need to change them, better configure all needed settings below
	# and remove corresponding "@args. ..." lines above

	NAME $NAME
	DEVICE_ID $DEVICE_ID
	BIND_IP $BIND_IP
	SAMPLE_RATE $SAMPLE_RATE
	PROCESS_ID $PROCESS_ID
	ALT_PORT $ALT_PORT
	RX_CHANNELS $RX_CHANNELS
	TX_CHANNELS $TX_CHANNELS
	CLOCK_PATH $CLOCK_PATH
	RX_LATENCY_NS $RX_LATENCY_NS
	TX_LATENCY_NS $TX_LATENCY_NS

	hint {
		show on
		description "Inferno ALSA virtual device"
	}
}

# ------------------------------------------------------
# default device
pcm.!default {
  type plug
  slave.pcm "aloopDuplex"
}

# ------------------------------------------------------
# alsa_in -j alsa_in -dcloop -q 1
pcm.cloop {
  type dsnoop
  ipc_key 3
  ipc_key_add_uid true
  slave {
    pcm "hw:Loopback,1,0"
    channels 2
    format S32_LE
    rate {
      @func igetenv
      vars [ JACK_SAMPLE_RATE ]
      default 44100
    }
    period_size {
      @func igetenv
      vars [ JACK_PERIOD_SIZE ]
      default 1024
    }
    buffer_size 32768
  }
}

# ------------------------------------------------------
# alsa_out -j alsa_out -dploop -q 1
pcm.ploop {
  type plug
  slave.pcm "hw:Loopback,1,1"
}

Try to temporarily switch to my much simpler .asoundrc. IIRC it needed to be really barebones to work.

I tried your .asoundrc as is (with nothing else), but aplay -l still lists all the stuffs but Inferno:

$ aplay -l
**** Liste des périphériques matériels PLAYBACK ****
carte 1 : Loopback [Loopback], périphérique 0 : Loopback PCM [Loopback PCM]
  Sous-périphériques : 8/8
  Sous-périphérique #0 : subdevice #0
  Sous-périphérique #1 : subdevice #1
  Sous-périphérique #2 : subdevice #2
  Sous-périphérique #3 : subdevice #3
  Sous-périphérique #4 : subdevice #4
  Sous-périphérique #5 : subdevice #5
  Sous-périphérique #6 : subdevice #6
  Sous-périphérique #7 : subdevice #7
carte 1 : Loopback [Loopback], périphérique 1 : Loopback PCM [Loopback PCM]
  Sous-périphériques : 8/8
  Sous-périphérique #0 : subdevice #0
  Sous-périphérique #1 : subdevice #1
  Sous-périphérique #2 : subdevice #2
  Sous-périphérique #3 : subdevice #3
  Sous-périphérique #4 : subdevice #4
  Sous-périphérique #5 : subdevice #5
  Sous-périphérique #6 : subdevice #6
  Sous-périphérique #7 : subdevice #7
carte 3 : sofhdadsp [sof-hda-dsp], périphérique 0 : HDA Analog (*) []
  Sous-périphériques : 1/1
  Sous-périphérique #0 : subdevice #0
carte 3 : sofhdadsp [sof-hda-dsp], périphérique 3 : HDMI1 (*) []
  Sous-périphériques : 1/1
  Sous-périphérique #0 : subdevice #0
carte 3 : sofhdadsp [sof-hda-dsp], périphérique 4 : HDMI2 (*) []
  Sous-périphériques : 1/1
  Sous-périphérique #0 : subdevice #0
carte 3 : sofhdadsp [sof-hda-dsp], périphérique 5 : HDMI3 (*) []
  Sous-périphériques : 1/1
  Sous-périphérique #0 : subdevice #0
carte 3 : sofhdadsp [sof-hda-dsp], périphérique 31 : HDA Analog Deep Buffer (*) []
  Sous-périphériques : 1/1
  Sous-périphérique #0 : subdevice #0

also:

$ ./target/debug/inferno2pipe -c 2 -o testInferno.wav
[2025-12-02T10:38:22Z DEBUG neli::socket] Message sent:
    Nlmsghdr { nl_len: 36, nl_type: Getroute, nl_flags: NlmFFlags(FlagBuffer(1, PhantomData<neli::consts::nl::NlmF>)), nl_seq: 0, nl_pid: 0, nl_payload: Payload(Rtmsg { rtm_family: Inet, rtm_dst_len: 0, rtm_src_len: 0, rtm_tos: 0, rtm_table: Unspec, rtm_protocol: Unspec, rtm_scope: Universe, rtm_type: Unspec, rtm_flags: RtmFFlags(FlagBuffer(4096, PhantomData<neli::consts::rtnl::RtmF>)), rtattrs: RtBuffer([Rtattr { rta_len: 8, rta_type: Dst, rta_payload: Buffer }]) }) }
[2025-12-02T10:38:22Z DEBUG neli::socket] Message received: Nlmsghdr { nl_len: 112, nl_type: Newroute, nl_flags: NlmFFlags(FlagBuffer(0, PhantomData<neli::consts::nl::NlmF>)), nl_seq: 0, nl_pid: 7496, nl_payload: Payload(Rtmsg { rtm_family: Inet, rtm_dst_len: 32, rtm_src_len: 0, rtm_tos: 0, rtm_table: Main, rtm_protocol: Unspec, rtm_scope: Universe, rtm_type: Unicast, rtm_flags: RtmFFlags(FlagBuffer(512, PhantomData<neli::consts::rtnl::RtmF>)), rtattrs: RtBuffer([Rtattr { rta_len: 8, rta_type: Table, rta_payload: Buffer }, Rtattr { rta_len: 8, rta_type: Dst, rta_payload: Buffer }, Rtattr { rta_len: 8, rta_type: Oif, rta_payload: Buffer }, Rtattr { rta_len: 8, rta_type: Prefsrc, rta_payload: Buffer }, Rtattr { rta_len: 8, rta_type: Gateway, rta_payload: Buffer }, Rtattr { rta_len: 8, rta_type: Uid, rta_payload: Buffer }, Rtattr { rta_len: 36, rta_type: Cacheinfo, rta_payload: Buffer }]) }) }
[2025-12-02T10:38:22Z INFO  inferno_aoip::state_storage] using state directory: /home/raphael/.local/state/inferno_aoip/0000c0a8010a0000
[2025-12-02T10:38:22Z INFO  inferno_aoip::device_server] clock path: None
[2025-12-02T10:38:22Z INFO  inferno_aoip::device_server] waiting for clock
[2025-12-02T10:38:22Z INFO  inferno_aoip::device_server] clock ready
[2025-12-02T10:38:22Z INFO  inferno_aoip::device_server] all common tasks spawned
[2025-12-02T10:38:22Z WARN  inferno_aoip::device_server::channels_subscriber] Unable to load state (this is normal in first run): Os { code: 2, kind: NotFound, message: "No such file or directory" }
[2025-12-02T10:38:22Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:23Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:24Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:25Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:26Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:27Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:28Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:29Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:30Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:31Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:32Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:33Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:34Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:35Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
[2025-12-02T10:38:36Z DEBUG inferno_aoip::device_server::info_mcast_server] no clock available
^C[2025-12-02T10:38:36Z INFO  inferno_aoip::device_server] shutting down
[2025-12-02T10:38:36Z INFO  inferno_aoip::device_server] receiver stopped
[2025-12-02T10:38:36Z INFO  inferno_aoip::device_server] shutdown ok

Do you have a clock leader ?

you mean statime? I posted a log snippet above

Yes but where do you send your Dante flux ? A Dante-equipped mixing desk, a PC running Dante Via ?

oh, ok: a Yamaha DM2000 with a DANTE YGDAI slot card

I had the same error because i did not actually have a clock leader in the network and statime does not replace a clock : it’s just used to timestamp the packets. So be sure that the DM2000 is actually the clock master.

1 Like