En el mercado existen herramientas de audio para transmisión de FM y adición de texto RDS a la señal, como por ejemplo Stereo Tool. En este caso, es gratuito para las funciones básicas pero si quieres desbloquear y utilizar todas las características relacionadas con FM tendrás que desembolsar +600 newtons. En la versión gratuita, hay un tono beep que se activa cada pocos segundos cuando utilizas funciones sin licencia.

Pero resulta que es posible realizar lo mismo utilizando los plugins LADSPA en ALSA. Como ejemplo aquí tenéis el /etc/asound.conf que utilizamos con nuestra estación de radio servidor linux en http://97irratia.info, un servidor barato con la tarjeta de sonido integrada.

Con esta configuración, se redirige la salida del dispositivo «radio» para que utilice la cadena de plugins LADSPA, por ejemplo «aplay -D radio some.wav»

# Make USB DAC the default device
#--------------------------------------------------
# Cards
#--------------------------------------------------
pcm.audiophile {
    type hw
    card 1
}
 
ctl.audiophile {
    type hw
    card 1
}
 
 
#--------------------------------------------------
# Normal alsa
#--------------------------------------------------
pcm.!default {
    type plug
    slave.pcm "duplex"
} 
 
pcm.duplex {
    type asym
    playback.pcm "ladspa"
    capture.pcm "dsnooper"
}
 
# --- ladspa chain ---
 
pcm.ladspa {
  type ladspa
  slave.pcm "dmixplug"
  path "/usr/lib/ladspa";
  plugins [
    {
            # Equalizer - FM curve (approx, should cut at 19kHz, not 16)
            label Eq
            input {
                # 31 Hz, -48 to 24, default -30
                # 63 Hz, -48 to 24, default 0
                # 125 Hz, -48 to 24, default 0
                # 250 Hz, -48 to 24, default 0
                # 500 Hz, -48 to 24, default 0
                # 1 kHz, -48 to 24, default 0
                # 2 kHz, -48 to 24, default 0
                # 4 kHz, -48 to 24, default 0
                # 8 kHz, -48 to 24, default 0
                # 16 kHz, -48 to 24, default 0
                controls [ -30 0 0 0 0 0 0 0 0 -30 ]
    		}
    }
    {
            # Expander - remove low-level noise/hiss
            label se4
            input {
                # RMS/peak, 0 to 1, default 0
                # Attack time (ms), 1.5 to 400, default 101.125
                # Release time (ms), 2 to 800, default 401
                # Threshold level (dB), -30 to 0, default 0
                # Ratio (1:n), 1 to 20, default 1
                # Knee radius (dB), 1 to 10, default 3.25
                # Attenuation (dB), -24 to 0, default 0
                controls [ 1 101.125 401 -26 10 3.25 0 ]
            }
    }
    {
            # Compressor
            label sc4
            input {
                # RMS/peak, 0 to 1, default 0
                # Attack time (ms), 1.5 to 400, default 101.125
                # Release time (ms), 2 to 800, default 401
                # Threshold level (dB), -30 to 0, default 0
                # Ratio (1:n), 1 to 20, default 1
                # Knee radius (dB), 1 to 10, default 3.25
                # Makeup gain (dB), 0 to 24, default 0
                controls [ 0.9 101.125 401 -10 2 3.25 0 ]
            }
    }
    {
            # Limiter
            label fastLookaheadLimiter
            input {
                # Input gain (dB), -20 to 20, default 0
                # Limit (dB), -20 to 0, default 0
                # Release time (s), 0.01 to 2, default 0.5075
                controls [ 10 0 0.8 ]
            }
    }
    ]
}
 
 
 
pcm.dmixplug {
  type plug
  slave.pcm "dmixer"
}
 
 
pcm.dmixer {
    type dmix
    ipc_key 1234
    slave {
        pcm "audiophile"
        period_size 1024
        buffer_size 4096
        rate 44100
    }
} 
 
pcm.dsnooper {
    type dsnoop
    ipc_key 2048
    ipc_perm 0666 
    slave.pcm "audiophile"
    slave 
    {
        period_time 0
        period_size 1024
        buffer_size 4096
        rate 44100
    }
    bindings {
        0 0
        1 1
    }
}