{"id":1126,"date":"2026-05-11T15:49:47","date_gmt":"2026-05-11T19:49:47","guid":{"rendered":"https:\/\/www.gradio.net\/?page_id=1126"},"modified":"2026-05-11T15:49:47","modified_gmt":"2026-05-11T19:49:47","slug":"changelog-g-radio-player","status":"publish","type":"page","link":"https:\/\/www.gradio.net\/index.php\/changelog-g-radio-player\/","title":{"rendered":"Changelog G Radio Player"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Changelog \u2014 G Radio Player<\/h1>\n\n\n\n<p>Todas las versiones publicadas de <code>gradio-player<\/code> (paquete .deb).<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.4.1] \u2014 2026-05-11<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Correcciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Plugin DSP \u2014 sin crujido al inicio de cada audio<\/strong>: cada pipeline crea su propio <code>DspProcessor<\/code> con estado limpio (filtros biquad del crossover en cero). En v0.4.0 todos los pipelines compart\u00edan el mismo objeto y los registros de retardo del tema anterior contaminaban los primeros frames del nuevo. El compresor ahora arranca con <code>gain_db = makeup_db<\/code> en lugar de 0, eliminando el pop inicial mientras el compresor converge.<\/li>\n\n\n\n<li><strong>Plugin DSP \u2014 VU metros activos en la ventana de configuraci\u00f3n<\/strong>: los metros ahora leen de variables at\u00f3micas globales (<code>DISP_LEVELS<\/code>, <code>DISP_GRS<\/code>) escritas directamente por el pad probe. En v0.4.0 la UI le\u00eda del master <code>DspProcessor<\/code> que ya no procesaba audio, por eso las barras aparec\u00edan apagadas.<\/li>\n\n\n\n<li><strong>Plugin DSP \u2014 ajustes de par\u00e1metros en tiempo real<\/strong>: el pad probe verifica un contador de versi\u00f3n at\u00f3mico (<code>PROC_CFG_VER<\/code>) en cada buffer; si cambi\u00f3, recarga la config del master y llama <code>update_config()<\/code> sin bloquear el hilo de audio. En v0.4.0 los cambios de knobs no llegaban al pipeline activo.<\/li>\n\n\n\n<li><strong>Tandas de comerciales \u2014 botones \u25b2\u25bc\u2715 funcionan correctamente<\/strong>: el \u00edndice visual de cada \u00edtem no coincid\u00eda con la l\u00ednea real del archivo <code>.com<\/code> cuando hab\u00eda \u00edtems filtrados por d\u00eda\/fecha. Ahora cada \u00edtem guarda su <code>file_line<\/code> real y las operaciones de swap\/delete lo usan. Adem\u00e1s los botones aplican el cambio y reconstruyen el panel inmediatamente.<\/li>\n\n\n\n<li><strong>Panel \u00ab\u2b1b Cola activa\u00bb en la secci\u00f3n de comerciales<\/strong>: encima de las pr\u00f3ximas 4 tandas aparece la cola actual (<code>comercialeslist4<\/code>) con fondo rojo oscuro, mostrando lo que sonar\u00e1 al terminar el tema en curso. Incluye bot\u00f3n \u2715 por \u00edtem para borrado individual y bot\u00f3n \ud83d\uddd1 Vaciar todo. Se refresca en &lt; 200ms cuando el scheduler carga comerciales al segundo :58 o cuando el operador modifica la cola.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.4.0] \u2014 2026-05-10<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Novedades<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Plugin de procesamiento de audio DSP multiband<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Bot\u00f3n \ud83c\udf9a Procesador<\/strong> en la barra de herramientas: activa o desactiva el procesador de audio en vivo. El \u00edcono cambia entre <code>processor-off<\/code> y <code>processor-on<\/code> seg\u00fan el estado. El estado (activo\/inactivo) persiste entre reinicios.<\/li>\n\n\n\n<li><strong>Bot\u00f3n \u2699 Config DSP<\/strong> (junto al anterior): abre la ventana de configuraci\u00f3n completa del procesador con la interfaz rack de GR-Processor.<\/li>\n\n\n\n<li><strong>Cadena DSP<\/strong>: crossover Linkwitz-Riley de 4.\u00b0 orden \u2192 compresor linked-stereo RMS feed-forward por banda \u2192 clipper suave (tanh) \u2192 limitador brick-wall. Soporta de 2 a 6 bandas configurables.<\/li>\n\n\n\n<li><strong>Ajuste en tiempo real<\/strong>: todos los pipelines activos (m\u00fasica, comerciales, eventos) comparten el mismo <code>Arc&lt;Mutex&lt;DspProcessor>><\/code>; cualquier cambio de par\u00e1metro se refleja inmediatamente en el audio en reproducci\u00f3n sin necesidad de reiniciar o esperar la pr\u00f3xima canci\u00f3n.<\/li>\n\n\n\n<li><strong>Ventana de configuraci\u00f3n<\/strong>: knobs Cairo id\u00e9nticos al GR-Processor aut\u00f3nomo (THR, RATIO, ATK, REL, GAIN, CLIP). Sliders de ganancia de entrada\/salida y umbral del limitador en paneles laterales.<\/li>\n\n\n\n<li><strong>Presets<\/strong>: 6 presets de f\u00e1brica (ROCK, BLUE, CLASIC, VOICE, HARD BASS, STRONG). Botones <strong>\u25b6 LOAD<\/strong> y <strong>\u25cf SAVE<\/strong> para cargar y guardar presets propios en <code>~\/.config\/gradio\/presets\/<\/code>. El \u00faltimo preset usado se recuerda al reiniciar.<\/li>\n\n\n\n<li><strong>Configuraci\u00f3n persistente<\/strong>: <code>~\/.gradio\/data\/processor.json<\/code> guarda estado (on\/off), todos los par\u00e1metros de bandas, ganancias y \u00faltimo preset.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Panel de comerciales \u2014 Pr\u00f3ximas 4 tandas<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li>El panel \u00ab\ud83d\udce2 Comerciales\u00bb reemplaza la lista plana de la cola activa por una vista de <strong>las pr\u00f3ximas 4 tandas programadas<\/strong>, leyendo directamente los archivos <code>.com<\/code> del horario.<\/li>\n\n\n\n<li>Cada tarjeta muestra: hora de reproducci\u00f3n, duraci\u00f3n acumulada de la tanda y bot\u00f3n <strong>\u25b6 Play<\/strong>.<\/li>\n\n\n\n<li><strong>Bot\u00f3n \u25b6 Play<\/strong> en cada tanda: hace fadeout del tema en curso, reproduce la tanda inmediatamente y luego contin\u00faa con el playlist. Marca la tanda como ya reproducida para que el scheduler no la vuelva a cargar.<\/li>\n\n\n\n<li>Los botones <strong>\u25b2 \u25bc \u2715<\/strong> de cada \u00edtem editan directamente el archivo <code>.com<\/code> del horario (no la cola activa).<\/li>\n\n\n\n<li>Cada tarjeta tiene un fondo de color diferente (azul \/ verde \/ \u00e1mbar \/ violeta) para diferenciar visualmente los bloques.<\/li>\n\n\n\n<li>El panel se refresca autom\u00e1ticamente cada 30 segundos.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Otras mejoras<\/h4>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Nombres de comerciales legibles<\/strong>: se decodifica el percent-encoding del URI de GStreamer al mostrar el t\u00edtulo en la barra de estado (<code>LAMEGAAVANCE%20KALIMAN<\/code> \u2192 <code>LAMEGAAVANCE KALIMAN<\/code>).<\/li>\n\n\n\n<li><strong>\u00cdconos del procesador<\/strong>: tres nuevos PNG en <code>assets\/<\/code> \u2014 <code>processor-off.png<\/code>, <code>processor-on.png<\/code>, <code>processor-config.png<\/code>.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.3.9] \u2014 2026-05-05<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Correcciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Drop &amp; drop al \u00e1rea extendida del playlist<\/strong>: el <code>playlist_vbox<\/code> no se<br>estiraba con el frame, dejando muerta la zona inferior cuando se ampliaba<br>la ventana. Se forz\u00f3 <code>vexpand+Fill<\/code> y se agreg\u00f3 un <code>DropTarget<\/code> catch-all<br>en <code>lists_row<\/code> con ruteo por X.<\/li>\n\n\n\n<li><strong>Tooltips de los botones \u2b06\/\u2b07\/\ud83d\uddd1 de la cola<\/strong>: se borraban cada 200 ms<br>porque el rebuild del listbox se disparaba con cada escritura de<br><code>playlist-refill<\/code>, aunque el contenido visible no cambiara. El trigger<br>ahora compara un signature de paths+duraci\u00f3n.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Novedades<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Validaci\u00f3n de audio antes de encolar<\/strong> (v\u00eda <code>symphonia<\/code>): cualquier<br>archivo cuyo decode falle se descarta autom\u00e1ticamente. Aplica a:<br><code>playlist-refill<\/code>, <code>comercial-scheduler<\/code> (3 schedulers), drag-drop a la<br>cola y a comerciales, botones \u2912\/\u2913 y doble-click del buscador, y los<br>comandos remotos TCP <code>AgregarAlPlaylist<\/code> \/ <code>ReproducirAhora<\/code> \/<br><code>PlaylistPlayAhora<\/code>. Resuelve el cuelgue del player ante audios corruptos.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.3.8] \u2014 2026-05-04<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Correcciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Drag &amp; drop buscador \u2192 playlist<\/strong>: el drop solo funcionaba sobre la mitad superior del panel; los <code>DropTarget<\/code> ahora cubren <code>playlist_listbox<\/code>, <code>playlist_scroll<\/code> y <code>playlist_frame<\/code> para todo el \u00e1rea visible (incluyendo cuando la ventana se extiende tras abrir el buscador).<\/li>\n\n\n\n<li><strong>Reanudar tras pausa larga<\/strong>: si se pausaba un tema y se reanudaba minutos despu\u00e9s, el detector de drift wall-vs-pos disparaba un crossfade espurio. <code>action_play<\/code> ahora realinea <code>current_track_start<\/code> con la posici\u00f3n real del pipeline al salir de Paused.<\/li>\n\n\n\n<li><strong>Editor <code>gr-playlist<\/code><\/strong>: aceptaba solo <code>gio::File<\/code>; ahora tambi\u00e9n STRING (text\/uri-list desde gr-buscador) y <code>FileList<\/code>, instalados sobre listbox y scroll.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Novedades<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Buscador<\/strong>: cada fila de resultado lleva dos botones: \u2912 insertar al inicio del playlist y \u2913 agregar al final (\u00edconos <code>up.png<\/code> \/ <code>down.png<\/code>).<\/li>\n\n\n\n<li><strong>Comerciales \/ Eventos \/ Eventos en espera<\/strong>: cada fila muestra duraci\u00f3n (con cache para no relanzar <code>ffprobe<\/code>) y botones inline \u2191\/\u2193 que reordenan las l\u00edneas en el archivo correspondiente.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.3.6] \u2014 2026-05-01<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Novedades<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u00cdcono del pisador reemplazado por <code>sello.png<\/code>.<\/li>\n\n\n\n<li>Panel Playlist: nueva cabecera con bot\u00f3n <strong>Autom\u00e1tico<\/strong> (robot.png) que pausa\/reanuda <code>playlist-refill<\/code>. Verde oscuro = autom\u00e1tico activo; rojo oscuro = pausado.<\/li>\n\n\n\n<li>Panel Playlist: bot\u00f3n <strong>Vaciar<\/strong> (trash.png) para vaciar la cola de reproducci\u00f3n de inmediato.<\/li>\n\n\n\n<li><code>playlist-refill<\/code>: respeta el archivo <code>tmp\/pause_refill<\/code>; cuando existe, el daemon duerme sin rellenar la cola.<\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.2.0] \u2014 2026-04-01<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Novedades<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>(pendiente: describir cambios respecto a 0.1.0)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">### Correcciones<\/h2>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.1.0] \u2014 publicado en gradio.net (versi\u00f3n inicial)<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Primera versi\u00f3n p\u00fablica del sistema de automatizaci\u00f3n de radio.<\/li>\n\n\n\n<li>Radio-player GTK4 con crossfading y duck de volumen.<\/li>\n\n\n\n<li>Daemons: <code>comercial-scheduler<\/code> y <code>playlist-refill<\/code>.<\/li>\n\n\n\n<li>Herramientas: <code>gr-pautaje<\/code>, <code>gr-parrilla<\/code>, <code>gr-botonera<\/code>, <code>gr-visor<\/code>, <code>gr-buscador<\/code>, <code>gr-playlist<\/code>, <code>gr-record<\/code>, <code>gr-reportes<\/code>.<\/li>\n\n\n\n<li>Instalador <code>.deb<\/code> para amd64.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Changelog \u2014 G Radio Player Todas las versiones publicadas de gradio-player (paquete .deb). [0.4.1] \u2014 2026-05-11 Correcciones [0.4.0] \u2014 2026-05-10 Novedades Plugin de procesamiento de audio DSP multiband Panel de comerciales \u2014 Pr\u00f3ximas 4 tandas Otras mejoras [0.3.9] \u2014 2026-05-05 Correcciones Novedades [0.3.8] \u2014 2026-05-04 Correcciones Novedades [0.3.6] \u2014 2026-05-01 Novedades [0.2.0] \u2014 2026-04-01 Novedades&#8230;<\/p>\n","protected":false},"author":4,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"footnotes":""},"class_list":["post-1126","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages\/1126","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/comments?post=1126"}],"version-history":[{"count":1,"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages\/1126\/revisions"}],"predecessor-version":[{"id":1127,"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages\/1126\/revisions\/1127"}],"wp:attachment":[{"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/media?parent=1126"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}