Git Product home page Git Product logo

inferno's Introduction

Inferno - unofficial implementation of Dante protocol

Highly experimental for now. I don't recommend using it for serious purposes.

However, chances that it'll break already working Dante network are low.

Features

  • receiving audio from Dante devices
  • connections can be made using Dante Controller or network-audio-controller (netaudio command line tool)

Quirks, read it before using:

  • Dante protocol is undocumented. Everything was reverse-engineered or based on other reverse-engineering projects. Some things in implementation were guessed. So while it works with my setup, it may not work with yours.
  • channel names can't be changed. If you try to change them, Dante Controller may get confused
  • receiving from multicast flows isn't supported yet, unicast connection will be made
  • clocked by incoming media flows. When nothing is connected, "time will stop" (i.e. recording will pause) until something is connected again - silence won't be generated unless at least one channel is connected.
  • it will not start if there is no default route in OS routing table

Disclaimer: Dante uses technology patented by Audinate. This source code may use these patents too. Consult a lawyer if you want to:

  • make money of it
  • distribute binaries in (or from) a region where software patents apply

This project makes no claim to be either authorized or approved by Audinate.

Quick start - how to record audio?

  1. install Rust and FFmpeg
  2. clone this repo with --recursive option (some dependencies are in submodules)
  3. cd inferno2pipe
  4. ./save_to_file 4 where 4 is number of channels
    • if your Dante network operates with sample rate other that 48000Hz, prefix the command with e.g. sample_rate=44100
  5. make connections using network-audio-controller or Dante Controller

Tested with

Dante devices

  • Audinate AVIO AES3
  • Ben & Fellows 523019 4x4 balanced analog I/O module (based on Dante UltimoX4)
  • Klark Teknik DN32-DANTE (based on Dante Brooklyn II)
  • Dante Via @ OS X
  • Dante Virtual Soundcard @ Windows 10

Control software

  • Dante Controller @ Windows 11
  • network-audio-controller

Host

  • x86_64 Linux
    • Arch
    • Ubuntu

Anatomy of the repository

  • inferno_aoip - main library crate for emulating a Dante audio over IP device. In the future controller functionality will also be implemented. Start here if you want to develop your app based on Inferno.
  • inferno2pipe - capture audio, writing interleaved 32-bit integer samples into an Unix named pipe (or a raw file). Helper script for recording to more convenient format is also provided. Start here if you want to use Inferno for capturing audio
  • searchfire - fork of Searchlight mDNS crate, modified for compatibility with Dante's mDNS
  • cirb - Clock-Indexed Ring-Buffer - fork of rt-history crate with emphasis on allowing reordered incoming packets and clock synchronization

Environment variables

  • INFERNO_BIND_IP - which local IP to bind to. Specifying it may be necessary if you have multiple network interfaces
  • INFERNO_DEVICE_ID - 16 hexadecimal digits (8 bytes) used as a device ID. Dante devices usually use MAC address padded with zeros. Inferno uses 0000<IP address>0000 by default. Device ID is the storage key when saving state.
  • INFERNO_NAME - name of advertised device. If unspecified, name based on app name and IP address will be generated.
  • INFERNO_SAMPLE_RATE - sample rate this device will operate on

Contributing

Issue reports and pull requests are welcome. However I'm currently taking a break from this project and will be back in June or July 2023.

By submitting any contribution, you agree that it will be distributed according to the comment found at the top of inferno_aoip/src/lib.rs file - under the terms of GNU GPL v3 or any later version.

Please use editor respecting .editorconfig (for example, VSCode needs an extension: EditorConfig for VS Code) or configure it approprietly manually.

To do

likely in order they'll be implementated

  • proper PTPv1 clock receiver
  • use multicast flows when available
  • increase receive thread priority to reduce chance of OS UDP input queue overflow
  • improve performance of receiver. Currently it's implemented with coroutines which is not very optimal for processing thousands of packets per second.
  • integration with some existing and established audio server. Maybe JACK?
  • audio transmitter
  • ability to change channel names and settings in Dante Controller
  • send statistics (clock, latency, signal levels)
  • ability to work as a clock source (PTP leader)
  • ability to use non-default network ports to allow running multiple instances on a single IP address
  • automated integration test that will launch several instances, stream audio data between them and check for its correctness
  • API: number of channels changeable without device server restart (useful for Dante Via-like operation where transmitters & receivers can be added and removed dynamically)
  • AES67
  • primary & secondary network support, for dual-NIC computers
  • grep -r TODO inferno_aoip/src

Design

  • 100% safe Rust
  • no platform-specific code (this may change should it be needed for certain features)
  • no external libraries needed, the only dependencies are Rust crates

Motivation

I've been using free as in freedom, open source software for many years now. I'm also fascinated by connections between music and technology. One day my sound engineer collegue showed me how Dante works, how easy to use and (most of the time) stable it is. The problem was that it's not an open standard, didn't have open source implementation and I couldn't use it on my favourite operating system - Linux. Now I can.

Other open source projects related to Dante

inferno's People

Contributors

teowoz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar

inferno's Issues

Documentation ?

Hi, thanks for your effort opening Dante protocol !
I've been working on some reverse engineering projects too and I'm also interested in Dante. I'd like to work on the sending audio capability, however I mostly work in C and know nothing about Rust... So I was wondering if you had any note or documentation about Dante and your findings, so it could help me to start a low level C library ?

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.