# `Rockbox.Dsp`
[🔗](https://github.com/tsirysndr/rockboxd/blob/master/bindings/elixir/lib/rockbox/dsp.ex#L1)

The DSP pipeline: EQ, tone, surround, compressor, ReplayGain, resampler.

A DSP handle wraps the process-wide audio DSP singleton, so only one should
be alive at a time. The handle is a NIF resource — it is freed by the BEAM
garbage collector, no explicit close needed.

ReplayGain `mode` here uses the *DSP-native* values (see `t:rg_mode/0`):
`0` track, `1` album, `2` shuffle, `3` off.

# `rg_mode`

```elixir
@type rg_mode() :: 0..3
```

DSP ReplayGain mode: 0 track, 1 album, 2 shuffle, 3 off.

# `t`

```elixir
@opaque t()
```

Opaque DSP handle (a NIF resource).

# `binary_to_samples`

```elixir
@spec binary_to_samples(binary()) :: [integer()]
```

Convert a little-endian int16 binary to a list of samples.

# `eq_enable`

```elixir
@spec eq_enable(t(), boolean()) :: :ok
```

# `flush`

```elixir
@spec flush(t()) :: :ok
```

# `new`

```elixir
@spec new(pos_integer()) :: t()
```

Create a DSP for interleaved S16LE stereo at `sample_rate` Hz.

# `process`

```elixir
@spec process(t(), binary()) :: binary()
```

Run interleaved stereo S16 samples through the pipeline. Accepts and returns
a binary of little-endian int16 samples (use `samples_to_binary/1` /
`binary_to_samples/1` to convert lists).

# `samples_to_binary`

```elixir
@spec samples_to_binary([integer()]) :: binary()
```

Convert a list of int16 samples to a little-endian binary.

# `set_channel_config`

```elixir
@spec set_channel_config(t(), integer()) :: :ok
```

# `set_compressor`

```elixir
@spec set_compressor(
  t(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer(),
  integer()
) :: :ok
```

# `set_eq_band`

```elixir
@spec set_eq_band(t(), 0..9, integer(), number(), number()) :: :ok
```

Configure one EQ band (0..9). Band 0 low shelf, 9 high shelf.

# `set_eq_precut`

```elixir
@spec set_eq_precut(t(), number()) :: :ok
```

# `set_input_frequency`

```elixir
@spec set_input_frequency(t(), pos_integer()) :: :ok
```

# `set_replaygain`

```elixir
@spec set_replaygain(t(), rg_mode(), boolean(), number()) :: :ok
```

ReplayGain mode (see `t:rg_mode/0`), clipping prevention, preamp in dB.

# `set_replaygain_gains`

```elixir
@spec set_replaygain_gains(
  t(),
  number() | nil,
  number() | nil,
  number() | nil,
  number() | nil
) :: :ok
```

Per-track gains in plain dB / peaks as linear amplitude. Pass `nil` for an
absent tag.

# `set_replaygain_gains_raw`

```elixir
@spec set_replaygain_gains_raw(t(), integer(), integer(), integer(), integer()) :: :ok
```

Native Q7.24 factors (the `raw_*` metadata fields); 0 = not tagged.

# `set_stereo_width`

```elixir
@spec set_stereo_width(t(), integer()) :: :ok
```

# `set_surround`

```elixir
@spec set_surround(t(), integer(), integer(), integer(), integer()) :: :ok
```

# `set_tone`

```elixir
@spec set_tone(t(), integer(), integer()) :: :ok
```

# `set_tone_cutoffs`

```elixir
@spec set_tone_cutoffs(t(), integer(), integer()) :: :ok
```

---

*Consult [api-reference.md](api-reference.md) for complete listing*
