Alsa e Gambas - Dereferenziazione mediante una Struttura

Da Gambas-it.org - Wikipedia.
Versione del 20 gen 2022 alle 14:32 di Vuott (Discussione | contributi) (Creata pagina con "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 ''Pointer'', presente come su...")

(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)

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 Pointer, 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 Pointer, per estrarne i dati Midi utili, mediante una variabile di tipo Struttura. Questo argomento è descritto in via generale ed astratta in questa pagina della WIKI.

Ne sviluppiamo di seguito un esempio essenziale astratto:

' All'inizio della Classe dichiariamo una "Struttura" avente i propri elementi organizzati esattamente come l'evento Midi prescritto da Alsa nella Struttura snd_seq_event_t:
 Public Struct MidiStruttura
   type As Byte                ' byte indice 0
   flag As Byte
   tag As Byte
   queue As Byte
   tick_o_tv_sec As Integer
   tv_nsec As Integer
   source_Client As Byte
   source_port As Byte
   dest_Client As Byte
   dest_port As Byte           ' byte indice 15
   channel As Byte             ' byte indice 16
   note As Byte                ' byte indice 17
   velocity As Byte            ' byte indice 18
   off_velocity As Byte
   param As Integer            ' byte indice 20
   value As Integer            ' byte indice 24
 End Struct

......
......


 Dim i As Integer
 Dim p As Pointer           ' La variabile da dereferenziare per raccogliere i dati degli Eventi Midi Alsa
 Dim midi As MidiStruttura  ' La variabile del tipo della Struttura "MidiStruttura"

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

' Dereferenziamo senza "Memory-Stream" il Puntatore, passato dalla funzione esterna di Alsa "snd_seq_event_input()", assegnando detto "Puntatore" alla variabile dichiarata di tipo "MidiStruttura":
 midi = p

' Filtra i tipi di Eventi Midi di ALSA che non interessano:
 If midi.type > 14 Then Return

 With midi
   Print .channel,
   Print .note,
   Print .velocity
 End With