{"id":1135,"date":"2026-05-13T12:04:50","date_gmt":"2026-05-13T16:04:50","guid":{"rendered":"https:\/\/www.gradio.net\/?page_id=1135"},"modified":"2026-05-13T12:04:50","modified_gmt":"2026-05-13T16:04:50","slug":"changelog-gr-aoip","status":"publish","type":"page","link":"https:\/\/www.gradio.net\/index.php\/changelog-gr-aoip\/","title":{"rendered":"Changelog GR-AoIP"},"content":{"rendered":"\n<h1 class=\"wp-block-heading\">Changelog \u2014 G Radio AoIP<\/h1>\n\n\n\n<p class=\"wp-block-paragraph\">Todas las versiones publicadas de <code>gr-aoip<\/code>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">[0.1.2] \u2014 2026-05-13<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Correcciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Perfiles Est\u00e9reo \u2014 codecs no-Opus no funcionaban en TX ni en RX<\/strong>: el pipeline TX aplicaba <code>opus_rate()<\/code> (que fuerza el rate a valores v\u00e1lidos para Opus: 8k\/12k\/16k\/24k\/48kHz) a todos los codecs, incluso AAC, FLAC y PCM. El pipeline RX ten\u00eda hardcodeado <code>application\/x-rtp,encoding-name=OPUS<\/code> y <code>rtpopusdepay<\/code> para todos los codecs, sin importar cu\u00e1l estuviera configurado. Como resultado, solo Opus funcionaba en el perfil Est\u00e9reo.<\/li>\n\n\n\n<li><strong>PCM L16 \u2014 pipeline completamente rehecho con RFC 3551<\/strong>: en lugar de <code>rtpgstpay<\/code>\/<code>rtpgstdepay<\/code> (que encapsulaba caps propietarias de GStreamer que <code>rtpjitterbuffer<\/code> no pod\u00eda parsear, produciendo <code>_gst_util_uint64_scale: assertion 'denom != 0' failed<\/code>), PCM L16 ahora usa <code>rtpL16pay<\/code>\/<code>rtpL16depay<\/code> \u2014 el mismo mecanismo est\u00e1ndar del perfil MPX. En TX se a\u00f1ade una etapa <code>audioconvert ! audio\/x-raw,format=S16BE<\/code> antes del payloader (rtpL16pay requiere big-endian). En RX las caps especifican <code>encoding-name=L16,clock-rate={rate},channels=2<\/code> con el sample rate real del audio.<\/li>\n\n\n\n<li><strong>package-all.sh \u2014 compilaciones ARM fallaban con \u00abno Cargo.toml in \/tmp\u00bb<\/strong>: la funci\u00f3n <code>make_zip<\/code> ejecutaba <code>cd \/tmp<\/code> sin restaurar el directorio de trabajo, lo que hac\u00eda que los builds de ARM32\/ARM64 posteriores no encontraran el proyecto. Corregido usando un subshell <code>(cd \/tmp &amp;&amp; zip ...)<\/code>.<\/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>Subcomandos <code>start<\/code> \/ <code>stop<\/code> \/ <code>status<\/code><\/strong>: el binario ahora acepta argumentos de l\u00ednea de comandos.<\/li>\n\n\n\n<li><code>gr-aoip start<\/code> \u2014 intenta arrancar via <code>systemctl --user start gr-aoip<\/code>; si no hay servicio systemd, lanza el proceso en background directamente.<\/li>\n\n\n\n<li><code>gr-aoip stop<\/code> \u2014 para el servicio systemd y adem\u00e1s mata cualquier proceso hu\u00e9rfano <code>gr-aoip<\/code> (ej. ejecuciones de desarrollo desde <code>target\/release\/<\/code>) excluyendo el propio proceso del subcomando.<\/li>\n\n\n\n<li><code>gr-aoip status<\/code> \u2014 indica si hay un proceso corriendo y en qu\u00e9 puerto web.<\/li>\n\n\n\n<li><strong>Buffer de red configurable en perfiles Est\u00e9reo y Mono<\/strong>: <code>StereoConfig<\/code> y <code>MonoConfig<\/code> tienen ahora el campo <code>jitter_buffer_ms<\/code> (default 200 ms, compatible con configs existentes via <code>serde(default)<\/code>). El pipeline RX Est\u00e9reo\/Mono usa este valor en <code>rtpjitterbuffer latency={ms} do-lost=true do-retransmission=false<\/code>, con la misma l\u00f3gica que el perfil MPX. La UI muestra el campo <strong>\u00abBuffer de red RX (ms)\u00bb<\/strong> en la secci\u00f3n Est\u00e9reo.<\/li>\n\n\n\n<li><strong>UI \u2014 opciones filtradas por codec<\/strong>: el selector de Codec en el perfil Est\u00e9reo ahora actualiza din\u00e1micamente los controles disponibles al cambiar de codec.<\/li>\n\n\n\n<li><strong>Opus<\/strong>: solo muestra 48 000 Hz (oculta el selector de frecuencia); bitrates 32\u2013512 kbps; nota informativa.<\/li>\n\n\n\n<li><strong>AAC \/ MP3<\/strong>: 44 100 \/ 48 000 Hz; bitrates 64\u2013320 kbps.<\/li>\n\n\n\n<li><strong>FLAC<\/strong>: 44 100 \/ 48 000 Hz; oculta el campo de bitrate (lossless); nota con ancho de banda t\u00edpico.<\/li>\n\n\n\n<li><strong>PCM L16<\/strong>: 22 050 \/ 32 000 \/ 44 100 \/ 48 000 Hz; oculta el campo de bitrate; muestra el ancho de banda calculado en tiempo real (ej. \u00ab44 100 Hz \u2192 \u22481 411 kbps, calidad CD\u00bb).<\/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.1.1] \u2014 2026-05-03<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Correcciones<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Cambiar pesta\u00f1a TX\/RX revert\u00eda al modo guardado<\/strong>: el polling de config cada 5 segundos sobreescrib\u00eda el modo seleccionado en la UI antes de que el usuario pulsara Aplicar.<\/li>\n\n\n\n<li><strong>Picker de dispositivos abr\u00eda siempre en \u00abEntradas\u00bb<\/strong>: ahora abre en la pesta\u00f1a correcta seg\u00fan el modo activo (Entradas para TX, Salidas para RX).<\/li>\n\n\n\n<li><strong>Dispositivos duplicados en el picker<\/strong>: cuando PipeWire y ALSA coexisten, <code>pactl<\/code> y la enumeraci\u00f3n ALSA listaban los mismos dispositivos f\u00edsicos con nombres distintos. Se deduplican por nombre l\u00f3gico.<\/li>\n\n\n\n<li><strong>Nombres de dispositivos truncados en el primer <code>_<\/code><\/strong>: dispositivos como <code>UMC202HD<\/code> aparec\u00edan como <code>BEHRINGER<\/code> porque el nombre se cortaba en el primer gui\u00f3n bajo. Corregido el parseo de descripciones de <code>pactl<\/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.1.0] \u2014 2026-04-28<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Lanzamiento inicial<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Tres perfiles de audio: <strong>MPX<\/strong> (192 kHz, RTP\/UDP, L16 mono), <strong>Est\u00e9reo<\/strong> (SRT + Opus\/AAC, 44100\/48000 Hz) y <strong>Mono<\/strong> (SRT + Opus, para enlaces hostiles).<\/li>\n\n\n\n<li>Interfaz web embebida en el binario (puerto 7171) con monitor en tiempo real: gauge de buffer, VU meters, estad\u00edsticas de latencia\/paquetes\/p\u00e9rdida, uptime.<\/li>\n\n\n\n<li>Control ON\/OFF del pipeline desde la UI; autostart configurable.<\/li>\n\n\n\n<li>Clock recovery adaptativo para MPX (ajusta el rate del pipeline seg\u00fan la ocupaci\u00f3n del jitter buffer).<\/li>\n\n\n\n<li>Selector de dispositivos de audio con soporte PipeWire\/PulseAudio y ALSA directo.<\/li>\n\n\n\n<li>Protecci\u00f3n por contrase\u00f1a (hash SHA-256) para la secci\u00f3n de configuraci\u00f3n.<\/li>\n\n\n\n<li>Paquetes <code>.deb<\/code> y <code>.zip<\/code> para amd64, arm64 y armhf (cross-compilados en Docker Bookworm para garantizar compatibilidad GLIBC 2.36).<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Changelog \u2014 G Radio AoIP Todas las versiones publicadas de gr-aoip. [0.1.2] \u2014 2026-05-13 Correcciones Novedades [0.1.1] \u2014 2026-05-03 Correcciones [0.1.0] \u2014 2026-04-28 Lanzamiento inicial<\/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,"_kad_post_classname":"","footnotes":""},"class_list":["post-1135","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages\/1135","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=1135"}],"version-history":[{"count":1,"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages\/1135\/revisions"}],"predecessor-version":[{"id":1136,"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/pages\/1135\/revisions\/1136"}],"wp:attachment":[{"href":"https:\/\/www.gradio.net\/index.php\/wp-json\/wp\/v2\/media?parent=1135"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}