Files
dsp-thomann/readme.md
T
LucasDLTG af2e7dc602
CI / Rust CI (push) Failing after 1m3s
feat: adapt to real usage
2026-09-06 12:29:45 +02:00

363 lines
5.5 KiB
Markdown

# dsp_thomann
## TODO
- Existing but not implemented commands: 0x19, 0x25, 0x28, 0x2E, 0x50, 0x51, 0x52, 0x53
- Commands 0x2E, 0x50, 0x51, 0x52, 0x53 seem to be used for firmware update: DO NOT SEND THEM WITHOUT KNOWLEDGE - RISK OF DEVICE BRICK (I brick my device)
- Commands: 0x19, 0x24, 0x28 are triggered by upload preset
- Identify: 0x2C parameters
- Implement: if 2 DSP with same ip they need to share same socket since dsp dont accept multiples connections
- In unlock check if first byte is device id
- This library allows to send commands even if dsp is locked
- Convert back data as in 0x38 to display real value
- Figure out Meter level encoding
- Full test of client (Improve existing one)
- Write correct readme.md
- Make client dsp408 thread safe
- Absolutely, send command to avoid tcp keep alive, that make the dsp crash
Rust library for remote LAN control of Thomann DSP408 digital signal processors.
`dsp_thomann` provides a high-level Rust API to connect, configure and monitor a DSP408 device over TCP/IP.
## Features
- TCP LAN communication with DSP408
- Automatic handshake and connection management
- Device state synchronization
- Preset management
- Channel routing
- Input/output processing control:
- Gain
- Mute
- Phase inversion
- Delay
- PEQ
- GEQ
- Crossover filters
- Compressor
- Limiter
- Gate
- Matrix routing and channel linking
- Level meter reading
- Device locking/unlocking
- Strong Rust type safety
- Protocol frame decoding and validation
---
## Installation
Add the crate to your `Cargo.toml`:
```toml
[dependencies]
dsp_thomann = "0.1"
```
---
## Quick Start
```rust
use std::net::IpAddr;
use dsp_thomann::dsp408::{DSP408, types};
fn main() -> Result<(), Box<dyn std::error::Error>> {
let host: IpAddr = "192.168.49.30".parse()?;
let mut dsp = DSP408::new(
host,
9761,
1
)?;
dsp.connect()?;
println!("Connected!");
dsp.set_mute(
types::Channel::Input(types::InputChannel::InA),
true
)?;
println!("{:#?}", dsp.state()?);
dsp.disconnect();
Ok(())
}
```
---
# Connection
A DSP device is identified by:
| Parameter | Description |
|---|---|
| Host | DSP IP address |
| Port | TCP control port |
| Device ID | DSP device identifier |
Example:
```rust
let mut dsp = DSP408::new(
"192.168.49.30".parse()?,
9761,
1
)?;
```
The library performs:
- TCP connection
- DSP handshake
- Device information retrieval
- Preset state loading
- Configuration synchronization
---
# Device State
After connection:
```rust
let state = dsp.state()?;
```
The state contains:
- Device name
- Lock status
- Preset bank
- Current DSP configuration
Including:
- Input channels
- Output channels
- Routing
- EQ
- Dynamics
- Delay
- Crossover configuration
---
# Channel Control
Channels are strongly typed:
```rust
types::Channel::Input(
types::InputChannel::InA
)
```
```rust
types::Channel::Output(
types::OutputChannel::Out1
)
```
## Available Channels
### Inputs
- InA
- InB
- InC
- InD
### Outputs
- Out1
- Out2
- Out3
- Out4
- Out5
- Out6
- Out7
- Out8
---
# Audio Processing
## Gain
```rust
dsp.set_channel_gain(
types::Channel::Output(types::OutputChannel::Out1),
-3.0
)?;
```
---
## Delay
```rust
dsp.set_channel_delay(
channel,
2.5,
types::DelayUnit::Millisecond
)?;
```
---
## PEQ
```rust
dsp.set_peq_band(
channel,
types::PEQBand::B1,
3.0,
1000.0,
0.7,
types::PEQFilter::Peak,
false
)?;
```
---
## Compressor
```rust
dsp.set_compressor(
types::OutputChannel::Out1,
types::Ratio::Ratio1_4,
10,
100,
3,
-10.0
)?;
```
---
# Presets
## Recall a preset
```rust
dsp.recall_preset(1)?;
```
## Store current configuration
```rust
dsp.store_current_configuration(
2,
false
)?;
```
## Rename current preset
```rust
dsp.set_current_preset_name(
"Live Show"
)?;
```
---
# Routing
## Matrix routing
```rust
dsp.set_matrix_routing(
types::OutputChannel::Out1,
vec![
types::InputChannel::InA,
types::InputChannel::InB,
],
)?;
```
## Link channels
```rust
dsp.link_channels(
source,
vec![destination]
)?;
```
---
# Metering
Read signal levels:
```rust
let meters = dsp.get_meter_levels()?;
println!("{:?}", meters.levels);
```
---
# Error Handling
All operations return:
```rust
Result<T, DSPError>
```
Possible errors include:
- Connection failure
- Timeout
- Invalid parameters
- Protocol errors
- Invalid responses
- Encoding/decoding failures
Example:
```rust
match dsp.connect() {
Ok(_) => println!("Connected"),
Err(e) => println!("Error: {}", e),
}
```
---
# Thread Safety
The library internally protects socket access with a mutex.
- Only one command is transmitted at a time per DSP408 instance.
- Multiple DSP devices can be controlled simultaneously.
---
# Supported DSP Features
| Feature | Supported |
|---|---|
| LAN connection | ✅ |
| Handshake | ✅ |
| Presets | ✅ |
| Device lock | ✅ |
| PEQ | ✅ |
| GEQ | ✅ |
| Compressor | ✅ |
| Limiter | ✅ |
| Gate | ✅ |
| Delay | ✅ |
| Crossover | ✅ |
| Matrix routing | ✅ |
| Metering | ✅ |