Resampling en linux

Introducción

Es deseable configurar la forma en la que se hace el resampling en linux para evitar que se haga resampling en la tarjeta de sonido. Algunos mezcladores de sonido (ej. el dmix que viene con ALSA) también hacen dicha conversión por defecto (ver "Does dmix affect sound quality?").

Alternativas para evitar el resampling

Hay dos alternativas para evitar tener que hacer resampling en tiempo real:

  • Usar tarjetas de sonido que usen un reloj que permita trabajar a 44100hz. Algunas tarjetas de sonido incluyen dos relojes: uno para trabajar a 44100 y sus múltiplos y otro para trabajar a 48000hz. (Creo que la M-Audio Audiophile 2496 entra en esta categoría).
  • Convertir los ficheros de FLAC 16/44100 a FLAC 16/48000 mediante el uso de libsamplerate con la máxima calidad.

Verificar que frecuencia de muestreo estamos usando

Ejecutaremos:

cat /proc/asound/card0/pcm0p/sub0/hw_params

En mi caso, usa la segunda tarjeta que es una USB:

cat /proc/asound/card1/pcm0p/sub0/hw_params

siendo la salida en mi caso:

access: RW_INTERLEAVED
format: S16_LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 6000
buffer_size: 24000

Siendo bastante obvio, que a pesar de reproducir 40100hz la tarjeta está usando 48000.

Resampling en tiempo real

Lo que se hace en este caso es pasar del formato original (típicamente FLAC 16 bits, 44100hz) al deseado (16bits/48000hz o 24bits/96000hz).

Ajustar MPD

Instalación de MPD

Para que MPD haga el resampling de forma correcta es importante compilarlo de forma que haga uso de libsamplerate. Esto en gentoo se asegura:

USE="libsamplerate" emerge mpd

Si lo compilamos a pelo, asegurarnos de no incluir —disable-lsr

Evitamos el resampleo automático de ALSA

Aquí muestro cómo configurar MPD para que haga el resampling por medio de la librería libsamplerate.

Ajustaremos el fichero de configuración /etc/mpd.conf de forma que incluya auto_resample "no":

audio_output {
    type "alsa"
    name "my ALSA device"
    auto_resample "no"
}

Evitamos el mezclado en ALSA

El propósito del mezclado conseguir que el sonido de múltiples aplicaciones vayan a la misma salida. Yo no quiero ese. Usaré un ordenador específico para escuchar música y no usaré otras aplicaciones a la vez. En ese caso no necesito mezclador. Al hablar de la arquitectura de ALSA, vimos que el sonido podía ir directamente al hardware o pasar por DMIX. Para evitar que el sonido pase por DMIX haremos:

audio_output {
    type "alsa"
    name "my ALSA device"
    device "hw:0,0"
}

(el uso de hw es el que consigue que no pase por DMIX)

Se puede forzar dmix para que use 44100hz, pero insisto en que si sólo vamos a reproducir música, no es necesario ni dmix ni pulseaudio, que controlan el mezclado que sale de diversas aplicaciones. Para forzarlo, tendríamos que tocar la configuración de ALSA (/etc/asound.conf o ~/.asoundrc) incluyendo:

pcm.!default {
  type plug
  slave.pcm {
    type dmix
    ipc_key 1024
    slave {
       pcm "hw:0,0"
       rate 44100
    }
  }
}

Control de volumen mediante MPD

Interesa aumentar el número de bits mediante:

format "*:24:*"

Por otro lado le indicaremos que usaremos un mezclador de software (en lugar de usar el de ALSA):

mixer_type      "software"

Desde mpd.conf

-digital volume best practice-
Seleccionamos el tipo

  • audio_output_format <sample_rate:bits:channels>: This specifies the sample rate, bits per sample, and number of channels of audio that is sent to each audio output. Note that audio outputs may specify their own audio format which will be used for actual output to the audio device. An example is "44100:16:2" for 44100Hz, 16 bits, and 2 channels. The default is to use the audio format of the input file.
  • samplerate_converter <integer or prefix>: This specifies the libsamplerate converter to use. The supplied value should either be an integer or a prefix of the name of a converter. The default is "Fastest Sinc Interpolator".

La librería libsamplerate admite varios modos de trabajo. Por defecto, se usa "Fastest Sinc Interpolator". Para seleccionar algún algoritmo de mayor calidad, usaremos:

samplerate_converter "Best Sinc Interpolator"

Le podemos decir a MPD el formato en el que queremos que exporte todo el audio decodificado:

audio_output_format "48000:16:2"

Hacer que vaya un poco más rápido

En algunos ordenadores se pueden acelerar las cosas un poco en algunas máquinas, podemos incluir:

audio_output {
        .......
    use_mmap    "yes"   # Para que vaya más rápido.
        .......
}

Veremos que al ejecutar:

cat /proc/asound/card0/pcm0p/sub0/hw_params

Cambia de:

access: RW_INTERLEAVED

a:
access: MMAP_INTERLEAVED

Experiencia con mi Audigy 2 NX

Tanto si selecciono 44100 como si selecciono 48000, la tarjeta muestra 48000. Entiendo que lo mejor es seleccionar 48000 para que la conversión se haga por software.

Al seleccionar 96000, la tarjeta se pone en modo 96000 también. En este modo y con la máxima calidad de resampling, el consumo es de 55% de CPU.

24bits y MPD

No sé si ocurre sólo en con mi Audigy 2 NX, pero por algún motivo no hace funcionar la tarjeta con 24 bits aunque ponga:

audio_output_format        "48000:24:2"

Para conseguirlo, tuve que incluir plughw en lugar de hw en /etc/mpd.conf:

audio_output {
    type        "alsa"
    name        "Mi ALSA"
    device    "plughw:1,0"    # No usa DMIX
    use_mmap    "yes"   # Para que vaya más rápido.
}

En ese caso, la ejecución de:

# cat /proc/asound/card1/pcm0p/sub0/hw_params

muestra:
access: MMAP_INTERLEAVED
format: S24_3LE
subformat: STD
channels: 2
rate: 48000 (48000/1)
period_size: 6000
buffer_size: 24000

que efectivamente muestra S24_3LE.

Resampling de alta calidad con SoX

Para convertir un fichero de 44100hz/16bits a 96000hz/24bits:

sox 44100_16.wav --bits 24 96000_24.wav rate -v -s -M 96000

Luego comprimimos a FLAC si queremos:

flac -8 96000_24.wav

Como referencia, el fichero flac a 96000/24 ocupa sólo un poco más que el fichero wav original:

44100_16.flac:  29916032
44100_16.wav:   43088684
96000_24.flac:  43650418
96000_24.wav:  140697680
Salvo que se diga otra cosa, el contenido de esta obra está bajo la licencia: Creative Commons Reconocimiento NoComercial CompartirIgual 2.5 España.