[{"data":1,"prerenderedAt":33},["ShallowReactive",2],{"note-could-the-host-take-vst3-ca":3},{"slug":4,"order":5,"title":6,"summary":7,"measured":8,"topic":9,"toc":10,"html":32},"could-the-host-take-vst3",110,"\"Podria l'amfitrió acceptar VST3? La costura de l'adaptador i el seu cost\"","Un adaptador VST3 és possible en C pla contra l'API C de Steinberg, amb llicències que un amfitrió GPL pot fer servir i una prova va allotjar un efecte VST3 real de cap a cap. Costaria unes 6200 línies i tres setmanes, per a una demanda escassa i per això no es fa; el que ho faria canviar queda escrit.","L'adaptador LV2 d'omx-clap-core, el VST 3 SDK 3.8.1 i la seva API C a Fedora 44 i una revisió de les pàgines dels fabricants de plugins, octubre del 2026.","core",[11,14,17,20,23,26,29],{"id":12,"title":13},"la-resposta-en-xifres","La resposta en xifres",{"id":15,"title":16},"la-costura","La costura",{"id":18,"title":19},"l-sdk","L'SDK",{"id":21,"title":22},"la-prova","La prova",{"id":24,"title":25},"el-pla-de-proves-si-es-fa","El pla de proves, si es fa",{"id":27,"title":28},"es-podria-allotjar","Es podria allotjar",{"id":30,"title":31},"per-que-ara-no-i-que-ho-faria-canviar","Per què ara no i què ho faria canviar","\u003Ch2 id=\"la-resposta-en-xifres\">La resposta en xifres\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>L'adaptador LV2 i la seva infraestructura tenen 5754 línies de codi en 336 funcions: 1594 línies (139 funcions) neutrals\nquant al format, 1699 (73) mixtes, és a dir lògica neutral al voltant d'unes quantes crides al format i 2461 (124)\npròpies d'LV2.\u003C\u002Fli>\n\u003Cli>La infraestructura ja es comparteix: les sis capçaleres de la biblioteca que inclou l'adaptador són neutrals i quatre ja\nes fan servir fora de l'adaptador.\u003C\u002Fli>\n\u003Cli>La costura que falta tallar és la capa que presenta un plugin LV2 com un plugin CLAP: 1314 de les seves 1319 línies són\nneutrals o mixtes i 1161 servirien per a una capa VST3. El nucli LV2 és pròpia d'LV2 en dos terços; el seu codi neutral (el\nbucle del worker, el confinament de camins, les funcions d'àtoms, un dipòsit de memòria de temps real) serveix idees d'LV2\nque VST3 no té.\u003C\u002Fli>\n\u003Cli>Al fil d'àudio, la capa afegeix una crida indirecta per cicle i una per esdeveniment MIDI de sortida; totes les altres\ncrides indirectes d'allà són de l'amfitrió CLAP o del mateix plugin. Una capa compartida no n'ha d'afegir cap.\u003C\u002Fli>\n\u003Cli>Un adaptador VST3 no necessita C++: l'API C generada per Steinberg funciona i una prova de 477 línies de C11 va allotjar un\nefecte VST3 de cap a cap. L'SDK té llicència MIT i l'API C BSD-3-Clause, totes dues utilitzables en un amfitrió\nGPL-3.0-or-later.\u003C\u002Fli>\n\u003Cli>El cost: unes 2200 línies a la part del format, unes 6200 amb proves i peces de prova; unes tres setmanes de feina tallant\nprimer la costura, dues i mitja sense.\u003C\u002Fli>\n\u003Cli>La demanda és escassa: 64 paquets de plugins de codi obert dels repositoris de la distribució són només VST3 a Linux, cap\ndels quals és un que OpenMixer necessiti i 6 fabricants de codi tancat distribueixen VST3 per a Linux sense CLAP ni LV2.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Per tant: ara no. Els resultats es conserven perquè un adaptador futur en pugui partir.\u003C\u002Fp>\n\u003Ch2 id=\"la-costura\">La costura\u003C\u002Fh2>\n\u003Cp>Cada funció de l'adaptador es va llegir i classificar: \u003Cstrong>neutral\u003C\u002Fstrong> (un adaptador VST3 la faria servir sense canvis: només\ndepèn de CLAP, del contracte, de l'anell, dels límits o de C pla), \u003Cstrong>mixta\u003C\u002Fstrong> (lògica neutral al voltant d'unes quantes crides\nal format, cadascuna un ganxo que aportaria la part del format) o \u003Cstrong>pròpia\u003C\u002Fstrong> (només LV2, també el codi on només es comparteix\nla idea). Una eina d'omx-clap-core uneix la classificació amb la llista de lizard, falla si hi ha una funció que la taula no\nclassifica i n'imprimeix les sumes.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>part\u003C\u002Fth>\n\u003Cth style=\"text-align:right\">neutral\u003C\u002Fth>\n\u003Cth style=\"text-align:right\">mixta\u003C\u002Fth>\n\u003Cth style=\"text-align:right\">pròpia\u003C\u002Fth>\n\u003Cth style=\"text-align:right\">total\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>la capa (LV2 com a CLAP)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">347 (46)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">967 (44)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">5 (1)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">1319 (91)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>funcions LV2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">30 (3)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">30 (1)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">449 (31)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">509 (35)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>instància LV2\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">275 (29)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">501 (22)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">923 (44)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">1699 (95)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>dipòsit de memòria de temps real\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">169 (12)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">0 (0)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">12 (3)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">181 (15)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>món LV2 (descripcions a través de lilv)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">48 (6)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">201 (6)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">1072 (45)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">1321 (57)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>les capçaleres compartides de la biblioteca\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">725 (43)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">0 (0)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">0 (0)\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">725 (43)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>total\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">\u003Cstrong>1594 (139)\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">\u003Cstrong>1699 (73)\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">\u003Cstrong>2461 (124)\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">\u003Cstrong>5754 (336)\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Cada cel·la són línies de codi (funcions).\u003C\u002Fp>\n\u003Cp>Quan s'aprovi un segon adaptador, la capa es dividirà en dues: les 1161 línies reutilitzables aniran a una capa compartida\ndins d'omx-clap-core (la meitat del fil d'àudio \u003Ccode>static inline\u003C\u002Fcode> en una capçalera, la del fil principal en una biblioteca\nestàtica interna, sense ABI pública) i la resta LV2 es quedarà darrere d'uns 25 ganxos:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>grup\u003C\u002Fth>\n\u003Cth>ganxos\u003C\u002Fth>\n\u003Cth>equivalent VST3\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>cicle de vida\u003C\u002Ftd>\n\u003Ctd>carregar, alliberar, activar o conservar a una freqüència i un rang de blocs, desactivar, reiniciar, latència\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>createInstance\u003C\u002Fcode> i \u003Ccode>initialize\u003C\u002Fcode>, \u003Ccode>terminate\u003C\u002Fcode>, \u003Ccode>setupProcessing\u003C\u002Fcode> i \u003Ccode>setActive\u003C\u002Fcode>, \u003Ccode>setProcessing\u003C\u002Fcode>, \u003Ccode>getLatencySamples\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>paràmetres\u003C\u002Ftd>\n\u003Ctd>nombre, informació (rang, indicadors, passos, unitat), llegir i escriure, valor a text i a l'inrevés, símbol\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>getParameterCount\u002FInfo\u003C\u002Fcode>, valors normalitzats i reals, \u003Ccode>getParamStringByValue\u002FValueByString\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>ports\u003C\u002Ftd>\n\u003Ctd>una taula de ports (tipus, amplada, mapa de canals CLAP, principal o auxiliar), búfer d'entrada i de sortida per branca i canal\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>getBusInfo\u003C\u002Fcode>, \u003Ccode>SpeakerArrangement\u003C\u002Fcode>, \u003Ccode>AudioBusBuffers\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>procés\u003C\u002Ftd>\n\u003Ctd>executar, entrada MIDI, sortida MIDI, transport, comptatges\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>process(ProcessData)\u003C\u002Fcode>, \u003Ccode>IEventList\u003C\u002Fcode>, \u003Ccode>ProcessContext\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>estat i presets\u003C\u002Ftd>\n\u003Ctd>desar en un bloc, carregar-ne un, llistar presets, carregar-ne un\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>getState\u002FsetState\u003C\u002Fcode> (component i controlador), \u003Ccode>.vstpreset\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>descobriment\u003C\u002Ftd>\n\u003Ctd>obrir i tancar un paquet, llistar-ne els plugins, refusar abans d'obrir\u003C\u002Ftd>\n\u003Ctd>l'exploració de paquets, \u003Ccode>IPluginFactory\u003C\u002Fcode>, \u003Ccode>moduleinfo.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>VST3 necessita quatre coses que LV2 no va demanar mai: el controlador i el processador estan separats, amb missatges entre\ntots dos; els canvis de paràmetres tornen del processador al controlador; els indicadors de \u003Ccode>restartComponent\u003C\u002Fcode> s'han de\nconvertir en peticions CLAP; i l'estat són dos blocs, no un. És feina de la part del format i no eixampla la interfície.\u003C\u002Fp>\n\u003Cp>La regla de la capa compartida: la seva meitat del fil d'àudio es compila dins de la capa de cada format i els ganxos del\nformat són crides directes lligades en compilar, sense taula virtual. La prova és un recompte amb objdump: cap crida indirecta\nal camí d'àudio més enllà de les de l'amfitrió CLAP i del mateix plugin.\u003C\u002Fp>\n\u003Cp>Cap altra biblioteca d'OpenMixer no té codi que pugui substituir la capa compartida: la biblioteca de DSP té un encreuament\nque l'amfitrió ja fa servir i cap anell, worker ni taula de paràmetres; plugin-hostd distribueix els formats amb una taula de\nprefixos; la biblioteca dels plugins reflecteix el vocabulari del contracte de paràmetres.\u003C\u002Fp>\n\u003Ch2 id=\"l-sdk\">L'SDK\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Llicència.\u003C\u002Fstrong> El VST 3 SDK 3.8.1 té llicència MIT; el seu README diu que ja no s'ofereix la llicència GPLv3 ni la llicència\npropietària de Steinberg i que &quot;VST&quot; no es pot fer servir en noms d'empresa ni de producte. El codi MIT es combina en una\nobra GPL-3.0-or-later; l'única obligació és conservar l'avís amb qualsevol fitxer de l'SDK que es distribueixi.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Llenguatge.\u003C\u002Fstrong> L'SDK és C++ amb interfícies a l'estil COM i les seves funcions d'allotjament enllacen libstdc++. Steinberg\ntambé publica una API C generada a partir d'aquestes interfícies, amb la llicència BSD de tres clàusules: cada interfície és\nuna estructura amb una taula virtual, cada identificador una constant. Un adaptador VST3 pot ser, doncs, en C com la resta de\nla biblioteca. El preu és escriure a mà els objectes COM de l'amfitrió: 257 línies a la prova.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Què implementa un amfitrió\u003C\u002Fstrong>, estimat a partir de la prova i del codi LV2 que fa la mateixa feina:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>tasca\u003C\u002Fth>\n\u003Cth>què necessita VST3 de l'amfitrió\u003C\u002Fth>\n\u003Cth style=\"text-align:right\">línies (estimació)\u003C\u002Fth>\n\u003Cth>reutilitzat de la costura\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>instanciar i connectar un efecte estèreo\u003C\u002Ftd>\n\u003Ctd>explorar els paquets \u003Ccode>.vst3\u003C\u002Fcode>; l'entrada del mòdul i la fàbrica de plugins; inicialitzar el component amb un objecte d'aplicació amfitriona que també reserva missatges i llistes d'atributs; el controlador; un punt de connexió en tots dos sentits; els busos; la seqüència de preparació i activació; \u003Ccode>process\u003C\u002Fcode> amb búfers de bus\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">650\u003C\u002Ftd>\n\u003Ctd>la cara CLAP, la taula de ports, les còpies de branques, el registre de refusos\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>un instrument MIDI\u003C\u002Ftd>\n\u003Ctd>cap entrada MIDI directa: les notes arriben com a esdeveniments en una llista que l'amfitrió implementa i reserva per endavant; els controladors, la inflexió de to i la pressió esdevenen canvis de paràmetre a través d'una assignació MIDI\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">300\u003C\u002Ftd>\n\u003Ctd>els ports de notes i les funcions MIDI\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>fils\u003C\u002Ftd>\n\u003Ctd>cap worker: cada crida té el seu fil; les edicions del controlador arriben al fil principal i han d'arribar al \u003Ccode>process\u003C\u002Fcode> següent com a cues de paràmetres; els canvis de sortida tornen enrere\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">400\u003C\u002Ftd>\n\u003Ctd>l'anell de missatges, el buidatge de paràmetres, la vigilància de latència\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>estat\u003C\u002Ftd>\n\u003Ctd>un objecte de flux de bytes; un estat CLAP té dos blocs, component i controlador; restaurar només després de \u003Ccode>setupProcessing\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">200\u003C\u002Ftd>\n\u003Ctd>el lector d'estat i la restauració diferida\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>un canvi de freqüència\u003C\u002Ftd>\n\u003Ctd>desactivar, preparar amb la nova freqüència i el nou bloc, activar: sense tornar a instanciar\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">60\u003C\u002Ftd>\n\u003Ctd>la regla d'activar i conservar\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>busos auxiliars i de cadena lateral\u003C\u002Ftd>\n\u003Ctd>busos auxiliars després dels principals; les disposicions d'altaveus es corresponen amb tipus de port i mapes de canals CLAP\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">200\u003C\u002Ftd>\n\u003Ctd>la taula de ports, les extensions envolupant i ambisònica\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>paràmetres\u003C\u002Ftd>\n\u003Ctd>nombre i informació amb indicadors de bypass i de només lectura, valors normalitzats, conversió a text, cues precises a la mostra\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">250\u003C\u002Ftd>\n\u003Ctd>la cara de paràmetres i el contracte\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>descobriment i refusos\u003C\u002Ftd>\n\u003Ctd>un codi per refús i una exploració que no cal que obri el binari quan hi ha \u003Ccode>moduleinfo.json\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">150\u003C\u002Ftd>\n\u003Ctd>el vocabulari de refusos, la comptabilitat de la fàbrica\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>\u003Cstrong>part del format, total\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003Ctd style=\"text-align:right\">\u003Cstrong>unes 2200\u003C\u002Fstrong>\u003C\u002Ftd>\n\u003Ctd>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Ch2 id=\"la-prova\">La prova\u003C\u002Fh2>\n\u003Cp>Una sonda en C11 va obrir la versió VST3 per a Linux d'un compressor LSP del paquet de la distribució, en va llegir la\nfàbrica, va crear el plugin, en va llistar els busos i els paràmetres, en va fer anar i tornar l'estat i va processar un bloc\nde silenci i vuit de soroll.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>pas\u003C\u002Fth>\n\u003Cth>resultat\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>mòdul\u003C\u002Ftd>\n\u003Ctd>entrada correcta; 388 classes (194 mòduls d'àudio, 194 controladors)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>component i controlador\u003C\u002Ftd>\n\u003Ctd>un controlador separat; tots dos inicialitzats; connectats en tots dos sentits\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>busos\u003C\u002Ftd>\n\u003Ctd>una entrada i una sortida principals estèreo; la variant amb cadena lateral hi afegeix una entrada auxiliar i processa passant-li només el bus principal\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>paràmetres\u003C\u002Ftd>\n\u003Ctd>48, amb el bypass marcat com a tal; noms, unitats i text per defecte a través de la conversió a text\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>estat\u003C\u002Ftd>\n\u003Ctd>517 bytes; escriure i després llegir, idèntic byte a byte\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>procés\u003C\u002Ftd>\n\u003Ctd>silenci d'entrada, silenci de sortida; soroll d'entrada a -6,04 dBFS de pic, sortida a -6,57\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>C++ necessari\u003C\u002Ftd>\n\u003Ctd>cap: C11 i l'API C\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>mida\u003C\u002Ftd>\n\u003Ctd>477 línies de codi, 257 de les quals són els objectes COM de l'amfitrió\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>En van sortir tres regles, que l'adaptador hauria de portar:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\u003Cstrong>L'amfitrió ha de reservar els objectes de missatge.\u003C\u002Fstrong> El plugin va demanar un missatge a l'aplicació amfitriona durant\n\u003Ccode>setState\u003C\u002Fcode> i fallava si se li refusava; la biblioteca d'allotjament en C++ de l'SDK ho amaga i en C són 147 línies.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Restaurar l'estat només després de \u003Ccode>setupProcessing\u003C\u002Fcode>.\u003C\u002Fstrong> L'especificació permet \u003Ccode>setState\u003C\u002Fcode> abans, però el plugin hi feia\nservir la freqüència de mostratge, que encara valia zero.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Una instància que ha fallat pot enverinar la següent.\u003C\u002Fstrong> El plugin guarda un catàleg a la memòria compartida; una fallada\nva deixar aquell fitxer buit i totes les instàncies posteriors morien en llegir-lo, fins que es va esborrar el fitxer. Fer\ncórrer cada plugin en un procés worker propi, com fa plugin-hostd, conté una fallada així.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"el-pla-de-proves-si-es-fa\">El pla de proves, si es fa\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Una petita peça de prova VST3 per a cada comportament, escrita en C contra l'API C, com fan les proves LV2, perquè la CI\ncontinuï hermètica i cada refús es provi expressament.\u003C\u002Fli>\n\u003Cli>Les versions VST3 dels repositoris de la distribució com a plugins reals.\u003C\u002Fli>\n\u003Cli>Paritat: el mateix plugin com a VST3, LV2 i CLAP a través de l'amfitrió, alimentat amb el mateix soroll llavorat i el\nmateix escombratge, comparat mostra a mostra; passa si el residu és almenys 100 dB per sota o si la diferència té nom. La\ncorrespondència de paràmetres es compara de la mateixa manera.\u003C\u002Fli>\n\u003Cli>El testimoni de reserves al voltant del camí \u003Ccode>process\u003C\u002Fcode> de VST3.\u003C\u002Fli>\n\u003Cli>El catàleg enverinat com a prova de regressió: un refús amb un codi del worker, mai un motor mort.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"es-podria-allotjar\">Es podria allotjar\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>àrea\u003C\u002Fth>\n\u003Cth>es pot?\u003C\u002Fth>\n\u003Cth>per què\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>llicència\u003C\u002Ftd>\n\u003Ctd>sí\u003C\u002Ftd>\n\u003Ctd>MIT i BSD-3-Clause es combinen en GPL-3.0-or-later; &quot;VST&quot; no pot aparèixer en un nom de producte\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>C++\u003C\u002Ftd>\n\u003Ctd>sí, en C\u003C\u002Ftd>\n\u003Ctd>l'API C; la prova és C11 sense libstdc++\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>regles de temps real\u003C\u002Ftd>\n\u003Ctd>sí\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>process\u003C\u002Fcode> corre al fil de procés; l'amfitrió reserva per endavant les llistes de paràmetres i d'esdeveniments\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>fils\u003C\u002Ftd>\n\u003Ctd>sí\u003C\u002Ftd>\n\u003Ctd>les crides del &quot;fil d'interfície&quot; corresponen al fil principal de l'amfitrió; no hi ha worker\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>sense pantalla\u003C\u002Ftd>\n\u003Ctd>sí per al plugin provat, no per a tots\u003C\u002Ftd>\n\u003Ctd>la prova va córrer sense pantalla; el validador de Steinberg va fallar en el mateix contenidor sense pantalla\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>activació de codi tancat\u003C\u002Ftd>\n\u003Ctd>depèn del fabricant\u003C\u002Ftd>\n\u003Ctd>l'activació per número de sèrie o fitxer de clau funciona sense pantalla; l'activació dins de l'editor del plugin necessita una sessió gràfica una vegada; iLok no té client per a Linux\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>contenció de fallades\u003C\u002Ftd>\n\u003Ctd>sí\u003C\u002Ftd>\n\u003Ctd>plugin-hostd fa córrer cada plugin en un procés worker propi\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>Dels 14 fabricants de codi tancat que distribueixen versions VST3 per a Linux (una revisió de les pàgines dels fabricants,\nfeta per a aquesta nota), 8 també distribueixen CLAP o LV2, que l'amfitrió ja accepta. Els 6 que són només VST3 a Linux són\nToneBoosters, Loomer, Renoise (Redux), Tracktion (BioTek 3, F'em), Bertom Audio i DDMF.\u003C\u002Fp>\n\u003Ch2 id=\"per-que-ara-no-i-que-ho-faria-canviar\">Per què ara no i què ho faria canviar\u003C\u002Fh2>\n\u003Cp>La demanda és escassa, el cost és d'unes 6200 línies i escriure l'adaptador confirmaria la costura dibuixada abans més que\nno pas en descobriria una de nova: cada tasca VST3 correspon a un grup de funcions de la capa que ja existeix. Mentrestant, el\ncodi nou de la capa manté les funcions neutrals lliures de crides LV2, perquè tallar la costura continuï sent barat.\u003C\u002Fp>\n\u003Cp>Qualsevol d'aquestes coses torna a obrir la decisió:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Un plugin concret només VST3 que valgui la pena allotjar: una versió per a Linux x86-64, cap versió LV2 ni CLAP, una\nactivació que funcioni sense el seu editor i unes condicions que permetin un amfitrió de tercers. Tres peticions així\nn'argumenten la necessitat; una n'hi ha prou si cobreix un paper que no cobreix res del que s'allotja.\u003C\u002Fli>\n\u003Cli>Un segon adaptador que no sigui CLAP aprovat per un altre motiu: aleshores primer es talla la costura, sigui quin sigui el\nformat.\u003C\u002Fli>\n\u003Cli>Un fabricant que avui distribueix tots dos formats deixa CLAP i LV2 a Linux per a un plugin que s'allotja.\u003C\u002Fli>\n\u003C\u002Fol>\n",1793954996472]