AudioHumLab / FIRtro

An active loudspeaker xover and eq DIY system, it includes drc and a preamp with a calibrated & loudness iso 226:2003 volume control
GNU General Public License v3.0
6 stars 0 forks source link

Falla el modo "mono" #24

Closed rripio closed 7 years ago

rripio commented 7 years ago

El selector de entrada falla en modo mono. He observado que no se conmutan correctamente las fuentes. Por ejemplo, al conmutar sucesivamente las fuentes tdt y mpd ambas quedan conectadas a la vez.

rripio commented 7 years ago

Creo que el modo en que se ha implementado, duplicando las entradas a brutefir, es incorrecto: Se está implicando al selector de entradas en algo que no es su competencia. Es como si en un equipo de música se hiciera mono con conectores Y, en lugar de internamente.

El modo mono debería ser un enrutamiento interno de brutefir, con el correspondiente ajuste de nivel que ya se hace.

Propongo quitar el modo mono hasta aque se implemente internamente y dejar el selector de entradas tan sencillo como se pueda.

Rsantct commented 7 years ago

Vaya.. pero no consigo reproducir el fallo que comentas. Si alterno sucesivamente dos o más fuentes se comporta bien, estando 'mono' activado o no.

El caso es que no está implementado en el selector de entradas. El server echa mano del nuevo módulo monostereo.py que ayuda en mezclar canales en la source actual.

La implementación creo recordar que se hizo asín porque lo ideal que propones en Brutefir me pareció complicado, no veo la manera sin rearrancar Brutefir :-/

La lógica implementada en el server es la siguiente:

lectura de comandos
    si el comando es "mono x" y es distinto del modo actual:
        se pone la variable mono = x  (on|off|toggle)
        se avisa: change_mono = True;  change_input = True (*)
ejecucion de comandos
    ...
    if change_mono:
        monostereo.setMono(on o off)

    if change_input # Esto siempre se ejecutará por el aviso * anterior
        ...         # de manera que se restaura la fuente con normalidad
        ... ...  
        ... ... ...
        if mono = "on"  
            monostereo.setMono(on)

    ...
    (resto de comandos)

Y el módulo monostereo.py

setMono(modo)
    if modo = on:
        añade el cruce de canales
    if modo = off:
        se limita a desconectar todo lo que haya conectado
        de forma directa o cruzada, todo.
rripio commented 7 years ago

Así: (i es un script que abrevia el cambio de entrada = control input )

firtro@firtro:~$ i mpd
Connecting to localhost port 9999...
Connected
======================================================================
(server) Conected to client 127.0.0.1
(server_process) Command: input mpd
Cannot connect ports owned by inactive clients: "mpd_jack" is not active
Cannot connect ports owned by inactive clients: "mpd_jack" is not active
----
RefLevel gain = -8.0
Input gain    = 0.0
Level         = 2.0  (Gain = -6.0)
Headrooom     = 6.0 dB
Balance       = 0
----
System EQ     = off
Room Gain     = 0    House Atten  = 0
Bass          = 0.0  Treble       = 0.0
Loudness      = off
PEQ           = off
DRC           = 0
---
Filter Type   = mp
Preset        = plano
Mono          = on
Input         = mpd
Fs            = 48000 Hz [clock = card]
---
(server) Closing connection...
Closing connection...
input = mpd
firtro@firtro:~$ (server) Listening on address 0.0.0.0 port 9999...

firtro@firtro:~$ jack_lsp -c
system:capture_1
system:capture_2
system:playback_1
   brutefir:fr_L
system:playback_2
   brutefir:fr_R
brutefir:input-0
   mplayer_tdt:out_1
brutefir:input-1
   mplayer_tdt:out_1
brutefir:fr_L
   system:playback_1
brutefir:fr_R
   system:playback_2
mpd_jack:left
mpd_jack:right
mpd_jack:3
mpd_jack:4
mpd_jack:5
mpd_jack:6
mplayer_tdt:out_0
mplayer_tdt:out_1
   brutefir:input-0
   brutefir:input-1
Rsantct commented 7 years ago

Acabo de repetir tu secuencia en mi FIRtro grande (ubuntu 16.06) y no detecto problemas :-|

También lo he probado en el FIRtro de pruebas Debian 9.1, también sin problemas. Efectivamente mpd no puede conectar, pero no me deja ningún canal de mplayer enganchado a brutefir. Si a continuación selecciono por ejemplo la entrada analógica, se conecta correctamente con los puertos cruzados por seguir activado el mono.

Veamos en el FIRtro de pruebas Debian 9.1 con el altavoz de ejemplo2vias de serie:

inirfirtro.py, estaba la TDT y mono=on:

┌──────────────────── [Audio Connections] ────────────────────┐
│               brutefir:lo_L -> system:playback_1            │
│               brutefir:lo_R -> system:playback_2            │
│               brutefir:hi_L -> system:playback_3            │
│               brutefir:hi_R -> system:playback_4            │
│           mplayer_tdt:out_0 -> brutefir:input-0             │
│           mplayer_tdt:out_1 -> brutefir:input-0             │
│           mplayer_tdt:out_1 -> brutefir:input-1             │
│           mplayer_tdt:out_0 -> brutefir:input-1             │
│                                                             │

Cambio a MPD (no se deja):

┌──────────────────── [Audio Connections] ────────────────────┐
│               brutefir:lo_L -> system:playback_1            │
│               brutefir:lo_R -> system:playback_2            │
│               brutefir:hi_L -> system:playback_3            │
│               brutefir:hi_R -> system:playback_4            │
│                                                             │
│                                                             │

Cambio a ANALOG:

┌──────────────────── [Audio Connections] ────────────────────┐
│               brutefir:lo_L -> system:playback_1            │
│               brutefir:lo_R -> system:playback_2            │
│               brutefir:hi_L -> system:playback_3            │
│               brutefir:hi_R -> system:playback_4            │
│            system:capture_1 -> brutefir:input-0             │
│            system:capture_2 -> brutefir:input-0             │
│            system:capture_2 -> brutefir:input-1             │
│            system:capture_1 -> brutefir:input-1             │
│                                                             │

Quito el mono:

┌──────────────────── [Audio Connections] ────────────────────┐
│               brutefir:lo_L -> system:playback_1            │
│               brutefir:lo_R -> system:playback_2            │
│               brutefir:hi_L -> system:playback_3            │
│               brutefir:hi_R -> system:playback_4            │
│            system:capture_1 -> brutefir:input-0             │
│            system:capture_2 -> brutefir:input-1             │
│                                                             │
│                                                             │

Cambio a TDT (sin el mono):

┌──────────────────── [Audio Connections] ────────────────────┐
│               brutefir:lo_L -> system:playback_1            │
│               brutefir:lo_R -> system:playback_2            │
│               brutefir:hi_L -> system:playback_3            │
│               brutefir:hi_R -> system:playback_4            │
│           mplayer_tdt:out_0 -> brutefir:input-0             │
│           mplayer_tdt:out_1 -> brutefir:input-1             │
│                                                             │
│                                                             │

(los puertos están pintados con njconnect)

Rsantct commented 7 years ago

He recuperado algunos retardos en el conmutador. ¿Lo puedes probar instalando la branch issue24?

rripio commented 7 years ago

Sigue igual.

│ brutefir:fr_L -> system:playback_1 │ │ brutefir:fr_R -> system:playback_2 │ │ mplayer_tdt:out_1 -> brutefir:input-0 │ │ mplayer_tdt:out_1 -> brutefir:input-1

rripio commented 7 years ago

ERROR:root:error conectando mpd_jack:left <> brutefir:input-0 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports. ERROR:root:error conectando mpd_jack:right <> brutefir:input-1 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports. ERROR:root:error conectando mpd_jack:left <> brutefir:input-0 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports. ERROR:root:error conectando mpd_jack:right <> brutefir:input-1 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports.

server_input.log (END)

-- Roberto Ripio

amiguelez commented 7 years ago

Y como anda el usuario root de por medio? Debería lanzarse todo bajo el usuario firtro

Enviado desde algún lugar

El 28 ago 2017, a las 9:19, Roberto Ripio notifications@github.com escribió:

ERROR:root:error conectando mpd_jack:left <> brutefir:input-0 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports. ERROR:root:error conectando mpd_jack:right <> brutefir:input-1 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports. ERROR:root:error conectando mpd_jack:left <> brutefir:input-0 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports. ERROR:root:error conectando mpd_jack:right <> brutefir:input-1 Traceback (most recent call last): File "/home/master/bin/server_input.py", line 142, in change_input jack_connect(in_ports[i], out_ports[i]) File "/home/master/bin/server_input.py", line 58, in jack_connect jack.connect(p1, p2) Error: Failed to connect ports.

server_input.log (END)

-- Roberto Ripio — You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHub, or mute the thread.

rripio commented 7 years ago

Hay algo raro también con el volumen.

-- Roberto Ripio

Rsantct commented 7 years ago

Lo de "root" en el logging creo que no se refiere al usuario root, debe ser un nivel de debugging o algo así...

En breve espero actualizar una Raspberry Pi 3 con todo lo nuevo y ver si lo de las conexiones a jack colgadas puede estar relacionado con la velociadad de la máquina ...

Rsantct commented 7 years ago

Hay algo raro también con el volumen. - He arrancado el firtro en mono, entrada tdt. - Cambio a estéreo. El volumen baja. - Cambio a mono. El volumen se mantiene, sin subir al nivel inicial.

He simulado la secuencia que comentas en una RPI3 recien instalada (de momento sin entrada tdt) y veo que el volumen se adecúa bien :-| Hay un script que simula la secuencia en bin_custom.example/prueba_mono.sh

firtro@rpi3clac:~$ sh bin_custom/pruebas_mono.sh
 --- estado inicial:
level = -24.0
input = analog
mono = on

system:capture_1                -->--  brutefir:input-0
system:capture_1                -->--  brutefir:input-1
system:capture_2                -->--  brutefir:input-1
system:capture_2                -->--  brutefir:input-0
brutefir:lo_L                   -->--  system:playback_1
brutefir:lo_R                   -->--  system:playback_2
brutefir:hi_L                   -->--  system:playback_1
brutefir:hi_R                   -->--  system:playback_2

--- cambio a estereo:
level = -18.0
input = analog
mono = off

system:capture_1                -->--  brutefir:input-0
system:capture_2                -->--  brutefir:input-1
brutefir:lo_L                   -->--  system:playback_1
brutefir:lo_R                   -->--  system:playback_2
brutefir:hi_L                   -->--  system:playback_1
brutefir:hi_R                   -->--  system:playback_2

--- cambio a mono:
level = -24.0
input = analog
mono = on

system:capture_1                -->--  brutefir:input-0
system:capture_1                -->--  brutefir:input-1
system:capture_2                -->--  brutefir:input-1
system:capture_2                -->--  brutefir:input-0
brutefir:lo_L                   -->--  system:playback_1
brutefir:lo_R                   -->--  system:playback_2
brutefir:hi_L                   -->--  system:playback_1
brutefir:hi_R                   -->--  system:playback_2

firtro@rpi3clac:~$
rripio commented 7 years ago

El volumen incorrecto es en el arrnque. Es decir, tdt como entrada activa en status, mono on. initfirtro.py Y es entonces cuando el volumen es anormalmente alto. Habría que comprobar con otras entradas. A tener en cuenta: el level de la input TDT está en +6, por si pudiera influir.

Rsantct commented 7 years ago

Ya dispongo de entrada TDT operativa en la RPI3 y le he puesto gain = 6.0 Pero no observo errores :-/

en un terminal:

firtro@rpi3clac:~$ tail audio/inputs

[tdt]
in_ports:   mplayer_tdt:out_0 mplayer_tdt:out_1
fs:
clock:      card
gain:       6.0
xo:         lp
lirc_event:
resampled:  no

firtro@rpi3clac:~$ initfirtro.py
...
... ...
... ... ...
(wait4) se ha verificado  'mplayer' en 'jack_lsp'
(initfirtro) Recuperando INPUT ...
Connecting to localhost port 9999...
Connected
======================================================================
(server) Conected to client 127.0.0.1
(server_process) Command: input restore
----
RefLevel gain = -12.2
Input gain    = 6.0
Level         = 0.0  (Gain = -6.2)
Headrooom     = 6.19 dB
Balance       = 0
----
System EQ     = Yes (3.0 dB)
Room Gain     = 4.5  House Atten  = 2.0
Bass          = 0.0  Treble       = 0.0
Loudness      = -7 (0.25 dB) Loud.ref =  7.0
PEQ           = off
DRC           = 0
---
Filter Type   = lp
Preset        = plano
Mono          = on
Input         = tdt
Fs            = 44100 Hz [clock = card]
---
Closing connection...

(initfirtro):
Se ha aplicado TONE DEFEAT.
Se ha recuperado el PRESET por DEFECTO: plano
Cargado el ALTAVOZ "ejemplo2vias" con FS=44100.
Activada la ENTRADA "tdt" y los FILTROS de tipo "lp".
La ecualización de sala (DRC FIR) es la número 0.
(server) Closing connection...
(server) Listening on address 0.0.0.0 port 9999...
firtro@rpi3clac:~$ echo "get_file_name" > tdt_fifo
firtro@rpi3clac:~$ ANS_FILENAME='Radio Nacional'

firtro@rpi3clac:~$ grep "level =" audio/status
level = 0.0
firtro@rpi3clac:~$ grep "input =" audio/status
input = tdt
firtro@rpi3clac:~$ grep "mono =" audio/status
mono = on
firtro@rpi3clac:~$ 

Y en otro terminal la secuencia:

firtro@rpi3clac:~$ sh bin_custom/pruebas_mono.sh
 --- estado inicial:
level = 0.0
input = tdt
mono = on

brutefir:lo_L                   -->--  system:playback_1
brutefir:lo_R                   -->--  system:playback_2
brutefir:hi_L                   -->--  system:playback_1
brutefir:hi_R                   -->--  system:playback_2
mplayer_tdt:out_0               -->--  brutefir:input-0
mplayer_tdt:out_0               -->--  brutefir:input-1
mplayer_tdt:out_1               -->--  brutefir:input-1
mplayer_tdt:out_1               -->--  brutefir:input-0

--- cambio a estereo:
level = 6.0
input = tdt
mono = off

brutefir:lo_L                   -->--  system:playback_1
brutefir:lo_R                   -->--  system:playback_2
brutefir:hi_L                   -->--  system:playback_1
brutefir:hi_R                   -->--  system:playback_2
mplayer_tdt:out_0               -->--  brutefir:input-0
mplayer_tdt:out_1               -->--  brutefir:input-1

--- cambio a mono:
level = 0.0
input = tdt
mono = on

brutefir:lo_L                   -->--  system:playback_1
brutefir:lo_R                   -->--  system:playback_2
brutefir:hi_L                   -->--  system:playback_1
brutefir:hi_R                   -->--  system:playback_2
mplayer_tdt:out_0               -->--  brutefir:input-0
mplayer_tdt:out_0               -->--  brutefir:input-1
mplayer_tdt:out_1               -->--  brutefir:input-1
mplayer_tdt:out_1               -->--  brutefir:input-0

firtro@rpi3clac:~$
Rsantct commented 7 years ago

El volumen incorrecto es en el arrnque. Es decir, tdt como entrada activa en status, mono on. initfirtro.py Y es entonces cuando el volumen es anormalmente alto.

Se me ocurre, como motivo para percibir un volumen demasiado alto, lo que me comentaste hace poco de que a veces mplayer sintoniza la misma emisora pero pilla distintos "pid" de los disponibles, cada uno con un formato de audio distinto y usando un decoder distinto. ¿Crees que podría ser eso?

Rsantct commented 7 years ago

Revisando el tema del mono, creo que no se deben visualizar variaciones en el Volumen al cambiar stereo/mono.

Se introduce en server_process.py una nueva variable interna monoCompens (0.0 dB o -6.0 dB) que en caso de hacer el mono será añadida directamente a la ganancia enviada a Brutefir. Es el equivalente a las resistencias internas de un preamplificador en el circuito de mono/stereo.

Las pruebas realizadas son correctas, queda implementdo en la branch de pruebas actual dummports_rev

¿Os parece bien?

amiguelez commented 7 years ago

Yo lo veo bien, tiene toda su lógica.

Enviado desde algún lugar

El 10 sept 2017, a las 18:31, Rsantct notifications@github.com escribió:

Revisando el tema del mono, creo que no se deben visualizar variaciones en el Volumen al cambiar stereo/mono.

Se introduce en server_process.py una nueva variable interna monoCompens (0.0 dB o -6.0 dB) que en caso de hacer el mono será añadida directamente a la ganancia enviada a Brutefir. Es el equivalente a las resistencias internas de un preamplificador en el circuito de mono/stereo.

Las pruebas realizadas son correctas, queda implementdo en la branch de pruebas actual dummports_rev

¿Os parece bien?

— You are receiving this because you commented. Reply to this email directly, view it on GitHub, or mute the thread.

Rsantct commented 7 years ago

Pozí, al caso es que ahora el botón de mono está en la página principal de la web, pero antes estaba en la página custom y ojos que no ven... jeje

Hay algo raro también con el volumen. - He arrancado el firtro en mono, entrada tdt. - Cambio a estéreo. El volumen baja. - Cambio a mono. El volumen se mantiene, sin subir al nivel inicial.

He hecho pruebas de nivel tras reiniciar la cosa siendo mono el último estado usado, reproduciendo ruido rosa y los niveles percibidos son correctos. Creo que no hay problemas de niveles.

Bueno, estaría bien conocer el resultado de vuestras pruebas con esto ;-)

Rsantct commented 7 years ago

Más revisión de issues, cerramos esta: aquí se renovó la mecánica interna del server para hacer el mono y se simuló el escenario reclamado de un nivel anormalmente alto en el arranque estando audio/status con mono=on, no observándose anomalia.

Rsantct commented 6 years ago

UPDATE:

Parece que en alguna reescritura de código, se erró evaluando mono como boolean cuando es una string ("on","off"). Al final de server_process.py en las líneas de inicialización cuando se establece monoCompens en función de la variable de status mono.

Se ha corregido today :-/