[{"data":1,"prerenderedAt":33},["ShallowReactive",2],{"note-why-lv2-plugins-on-zynthian-need-inferred-port-groups-ca":3},{"slug":4,"order":5,"title":6,"summary":7,"measured":8,"topic":9,"toc":10,"html":32},"why-lv2-plugins-on-zynthian-need-inferred-port-groups",60,"Per què la majoria dels plugins LV2 d'un Zynthian necessiten grups de ports inferits","La meitat dels plugins LV2 instal·lats en un Zynthian tenen més de quatre controls i cap grup de ports i la pantalla tàctil els talla en pantalles de quatre en l'ordre dels ports. Un paquet generat que substitueix la descripció del plugin, mai els seus fitxers, hi pot afegir grups que llegeixen tots els consumidors de Zynthian.","Una Raspberry Pi 5 amb ZynthianOS Vangelis-2610.1, octubre del 2026.","zynthian",[11,14,17,20,23,26,29],{"id":12,"title":13},"la-mancanca-mesurada","La mancança mesurada",{"id":15,"title":16},"on-llegeix-cada-consumidor-de-zynthian","On llegeix cada consumidor de Zynthian",{"id":18,"title":19},"per-que-un-paquet-afegit-no-pot-completar-un-plugin","Per què un paquet afegit no pot completar un plugin",{"id":21,"title":22},"el-canal-que-funciona-un-paquet-que-substitueix","El canal que funciona: un paquet que substitueix",{"id":24,"title":25},"quins-grups","Quins grups",{"id":27,"title":28},"quan-cal-un-intermediari","Quan cal un intermediari",{"id":30,"title":31},"que-ho-demostra-a-l-aparell","Què ho demostra a l'aparell","\u003Ch2 id=\"la-mancanca-mesurada\">La mancança mesurada\u003C\u002Fh2>\n\u003Cp>En una imatge de Zynthian (ZynthianOS Vangelis-2610.1) hi ha 1243 plugins LV2 instal·lats amb controls i només 105\ndeclaren grups de ports. 623 no tenen grups i tenen més de quatre controls, de manera que la pantalla tàctil els talla en\npantalles de quatre, en l'ordre dels ports, siguin quins siguin els controls.\u003C\u002Fp>\n\u003Ch2 id=\"on-llegeix-cada-consumidor-de-zynthian\">On llegeix cada consumidor de Zynthian\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>MOD-UI\u003C\u002Fstrong> troba una MOD GUI en qualsevol fitxer carregat el subjecte del qual és l'URI del plugin. Per això ja funciona\nun paquet de GUI generat a part.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>El motor de la pantalla tàctil\u003C\u002Fstrong> llegeix els ports a través de lilv. En cada port llegeix \u003Ccode>pg:group\u003C\u002Fcode> i en el node del\ngrup \u003Ccode>lv2:symbol\u003C\u002Fcode> (obligatori: sense ell tots els ports cauen en un sol grup &quot;params&quot;), \u003Ccode>lv2:name\u003C\u002Fcode> (o, si no hi és,\n\u003Ccode>rdfs:label\u003C\u002Fcode>) i \u003Ccode>lv2:displayPriority\u003C\u002Fcode>. Les pantalles de quatre es tallen per grup, ordenades per prioritat de\nvisualització. Mai no llegeix \u003Ccode>pg:mainInput\u003C\u002Fcode>, \u003Ccode>lv2:portGroups\u003C\u002Fcode>, \u003Ccode>units:unit\u003C\u002Fcode> ni \u003Ccode>rdfs:comment\u003C\u002Fcode> en un port i no existeix\ncap fitxer de disposició indexat per URI de plugin o per símbol de port. El nom, el tipus, la categoria i la descripció\ndel plugin es desen per URI després de la primera exploració, de manera que una descripció canviada necessita una\nregeneració des de la configuració web.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"per-que-un-paquet-afegit-no-pot-completar-un-plugin\">Per què un paquet afegit no pot completar un plugin\u003C\u002Fh2>\n\u003Cp>lilv ignora un segon paquet que declara un plugin que ja ha carregat (&quot;Duplicate plugin ... ignored&quot;) i els ports d'un\nplugin són nodes anònims, de manera que un fitxer a part no té res d'estable on lligar \u003Ccode>pg:group\u003C\u002Fcode>. Provat amb un petit\nplugin d'envolupant, els grups van quedar buits.\u003C\u002Fp>\n\u003Ch2 id=\"el-canal-que-funciona-un-paquet-que-substitueix\">El canal que funciona: un paquet que substitueix\u003C\u002Fh2>\n\u003Cp>La regla dels duplicats de lilv és una comparació de versions, no un refús pla: un segon paquet per al mateix URI\n\u003Cstrong>substitueix\u003C\u002Fstrong> el que ja s'ha carregat quan el seu \u003Ccode>lv2:minorVersion\u003C\u002Fcode> o \u003Ccode>lv2:microVersion\u003C\u002Fcode> és més nou; un d'igual o més\nantic es descarta. La prova que va trobar els grups buits feia servir una versió igual.\u003C\u002Fp>\n\u003Cp>Per tant, per a un plugin que no és d'OpenMixer, el paquet complementari és un paquet generat que:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>reprodueix sencera la descripció del plugin (cada port, cada paràmetre, tal com els declara el plugin), llegida amb\nl'analitzador de Turtle, mai reescrita a mà;\u003C\u002Fli>\n\u003Cli>manté \u003Ccode>lv2:binary\u003C\u002Fcode> apuntant a la biblioteca instal·lada del plugin: cap intermediari;\u003C\u002Fli>\n\u003Cli>augmenta en un el \u003Ccode>lv2:microVersion\u003C\u002Fcode> instal·lat, perquè lilv el carregui i descarti l'original;\u003C\u002Fli>\n\u003Cli>afegeix nodes de grup, cadascun amb \u003Ccode>lv2:symbol\u003C\u002Fcode>, \u003Ccode>lv2:name\u003C\u002Fcode> i \u003Ccode>lv2:displayPriority\u003C\u002Fcode>, lligats als ports reproduïts \u003Cstrong>pel\nsímbol del port\u003C\u002Fstrong>: els símbols són estables, els nodes anònims no;\u003C\u002Fli>\n\u003Cli>porta un fitxer de marca al costat, perquè una execució posterior distingeixi la seva sortida del paquet del plugin i no\ntoqui mai els fitxers instal·lats del plugin.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Esborrar el paquet marcat restaura l'original: lilv no té res de més nou per preferir i torna a carregar els fitxers del\nplugin. Un plugin que ja declara els seus propis grups es deixa tal com és, sense marca i sense generar res.\u003C\u002Fp>\n\u003Ch2 id=\"quins-grups\">Quins grups\u003C\u002Fh2>\n\u003Cp>Els grups s'infereixen automàticament, sobre tots els plugins instal·lats en el moment d'instal·lar, mai amb una disposició\nfeta a mà per a cada plugin. Les regles, per ordre: els grups parcials del mateix plugin; \u003Ccode>lv2:designation\u003C\u002Fcode>; un prefix\ncomú de nom o de símbol (&quot;Band 1 …&quot;, \u003Ccode>b1_\u003C\u002Fcode>); una unitat comuna; una tirada contigua d'índexs de port; la disposició de la\nMOD GUI del plugin si en té. Un plugin que les regles no poden agrupar amb seguretat no rep cap paquet complementari, mai una\ndisposició endevinada.\u003C\u002Fp>\n\u003Cp>Les regles i l'escriptor del paquet els especifica omx-panel: \u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Fgroup-inference\">inferència de grups\u003C\u002Fa> i\n\u003Ca href=\"\u002Fprojects\u002Fomx-panel\u002Flv2-complement\">el paquet complementari LV2\u003C\u002Fa>.\u003C\u002Fp>\n\u003Ch2 id=\"quan-cal-un-intermediari\">Quan cal un intermediari\u003C\u002Fh2>\n\u003Cp>Un paquet intermediari, amb URI, ports i grups propis i una capa que reenvia l'àudio, els paràmetres i l'estat a\nplugin-hostd, és només l'excepció: per a un plugin la descripció del qual l'analitzador de Turtle no pot llegir, el camp de\nversió del qual ja és al màxim o els fitxers del qual declaren més d'un subjecte per al mateix URI.\u003C\u002Fp>\n\u003Ch2 id=\"que-ho-demostra-a-l-aparell\">Què ho demostra a l'aparell\u003C\u002Fh2>\n\u003Col>\n\u003Cli>lilv, carregat després del generador, veu els grups inferits en un plugin que ha coincidit amb les regles i el paquet\noriginal ha perdut la substitució.\u003C\u002Fli>\n\u003Cli>El lector de ports de Zynthian retorna aquests grups i la pantalla tàctil mostra les pantalles esperades.\u003C\u002Fli>\n\u003Cli>Un plugin que declara tots els seus grups es carrega exactament com abans: sense marca, els mateixos bytes.\u003C\u002Fli>\n\u003Cli>Esborrar un paquet marcat torna els fitxers originals del plugin.\u003C\u002Fli>\n\u003Cli>Un plugin completat així continua corrent per plugin-hostd sense canvis: l'addició, els paràmetres i l'estat funcionen com\nen qualsevol plugin LV2.\u003C\u002Fli>\n\u003C\u002Fol>\n",1793954996419]