Alsa e Gambas: Gestione dei dati Midi in Ricezione

Da Gambas-it.org - Wikipedia.

Nei capitoli precedenti abbiamo considerato l'argomento dell'Invio dei dati Midi con Gambas 3 ad ALSA; ora prendiamo in considerazione la gestione dei dati in Ricezione da un device esterno al nostro applicativo.

Introduzione

La situazione è la seguente:
Il dispositivo esterno invia un dato alla porta del nostro applicativo, la quale dovrà essere posta dunque in modalità Write (tenuto conto che la si deve pensare "dal punto di vista dell'altro device"). Il dato, giunto alla porta dell'applicativo, non sarà però accolto automaticamente dal programma, ma questo - per poterlo acquisire - dovrà andare a leggere la porta.
Il problema più grosso è che però l'applicativo - ovviamente - non conosce il momento esatto in cui il dato sarà scritto, cioè inviato alla sua porta; e pertanto non sa quando deve leggere la propria porta per acquisire il dato inviato.

Questa circostanza renderà necessario l'uso della funzione Timer che provvederà a scatenare una routine, nella quale avverrà la lettura della porta. Si potrebbe esperire anche un ciclo WHILE continuo, in mezzo al quale si porrebbe un Wait per dare modo a Gambas di fare anche altro. Tale seconda soluzione, pur probabilmente avendo meno latenza, impegnerebbe eccessivamente la CPU, impedendo così di fatto al programma di compiere fluidamente altre operazioni. Fra le due soluzioni è dunque preferibile il Timer.

Purtroppo l'approccio del timer non è del tutto opportuno. Anche pensando a un timer con scadenza molto stretta, per esempio un millisecondo, l'idea non è conveniente, anche se più o meno può funzionare. La soluzione più corretta sarebbe operare mediante un Callback (che in Gambas dovrebbe essere stato finalmente supportato), quando arriva un evento. La funzione Callback dovrebbe semplicemente alzare un evento (RAISE xxx), che poi esegue la lettura da ALSA e gestisce quanto ricevuto. Tale soluzione ottimale non è perseguibile, poiché ALSA purtroppo non è in grado invocare un Callback.