Alsa e Gambas - Dereferenziazione mediante un vettore di tipo Byte

Da Gambas-it.org - Wikipedia.

Come è ormai noto, la funzione esterna di Alsa:

int  snd_seq_event_input(snd_seq_t * seq, snd_seq_event_t ** ev)

assegna alla variabile di tipo Puntatore, presente come suo secondo parametro, l'indirizzo di memoria che punta ad una Struttura (esterna) contenente i dati Midi passati da Alsa.

Possiamo dereferenziare tale variabile di tipo Puntatore, per estrarne i dati utili degli Eventi Midi di ALSA, usando un array di tipo "Byte".

In particolare si assegneranno i valori contenuti nell'area di memoria, puntata dal Puntatore passato dalla predetta funzione esterna di ALSA, all'area di memoria del vettore di tipo "Byte" aprendo in Scrittura la sua Proprietà ".Data" con i Memory Stream.
Si scriveranno nell'area di memoria del vettore, così aperta e puntata dalla variabile di tipo Stream, 28 byte (quanti sono i byte che costituiscono un Evento Midi di ALSA secondo la Struttura snd_seq_event_t. [nota 1]

V'è da dire, però, che questa soluzione non è ottimale: può andare bene soltanto per raccogliere i valori dai membri della predetta area degli Eventi Midi di ALSA, corrispondenti al tipo di dato "BYTE" di Gambas o comunque, se superiore ("Integer"), valori ovviamente compresi comunque tra 0 e 255.

Mostriamo un esempio essenziale:

 Dim i As Integer
 Dim p As Pointer         ' La variabile da dereferenziare per raccogliere i singoli dati degli Eventi Midi Alsa
 Dim bb As New Byte[28]

 Do

   i = snd_seq_event_input(handle, VarPtr(p))
   If i < 0 Then Return

' Legge il 1° byte ("Type"), ossia quello puntato dall'indirizzo di memoria contenuto dal "Puntatore" e elimina i tipi di Eventi Midi di ALSA che qui non interessano:
   If Byte@(po) > 14 Then Return

' Apre in "Scrittura" con i "Memory Stream" la Proprietà ".Data" del vettore:
   st = Memory bb.Data For Write

' Scrive nel flusso dell'area di memoria, puntata dalla Proprietà ".Data" del vettore, una quantità di byte, presi dall'area di memoria puntata dal Puntatore passato dalla funzione esterna di ALSA, pari alla dimensione della Struttura degli Eventi Midi di ALSA:
   Write #st, p, 28

' Legge il risultato (ad esempio ".channel", ".note" e ".velocity"):
   Print bb[16], bb[17], bb[18]   

   st.Close

 Loop


Note

[1] Vedere anche questa pagina: Uso dei Memory Stream aprendo in Scrittura la Proprietà ".Data" del vettore