Differenze tra le versioni di "Alsa e Gambas - Dereferenziazione mediante una Struttura"

Da Gambas-it.org - Wikipedia.
(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...")
 
 
(Una versione intermedia di uno stesso utente non è mostrata)
Riga 4: Riga 4:
  
  
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 [[Dereferenziare_senza_Memory-Stream_un_pointer_ad_una_Struttura%2C_passato_da_una_funzione_esterna|questa pagina]] della WIKI.
+
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 nella pagina "[[Dereferenziare senza Memory-Stream un Puntatore ad una Struttura, passato da una funzione esterna]]" della WIKI.
  
 
Ne sviluppiamo di seguito un esempio essenziale astratto:
 
Ne sviluppiamo di seguito un esempio essenziale astratto:
 
  <FONT color=gray>' ''All'inizio della Classe dichiariamo una "Struttura" avente i propri elementi organizzati esattamente come l'evento Midi prescritto da Alsa nella Struttura ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html snd_seq_event_t]:''</font>
 
  <FONT color=gray>' ''All'inizio della Classe dichiariamo una "Struttura" avente i propri elementi organizzati esattamente come l'evento Midi prescritto da Alsa nella Struttura ''[https://www.alsa-project.org/alsa-doc/alsa-lib/structsnd__seq__event__t.html snd_seq_event_t]:''</font>
   '''Public''' Struct MidiStruttura
+
   Public Struct MidiStruttura
 
     type As Byte                <FONT color=gray>' ''byte indice 0''</font>
 
     type As Byte                <FONT color=gray>' ''byte indice 0''</font>
 
     flag As Byte
 
     flag As Byte
Riga 15: Riga 15:
 
     tick_o_tv_sec As Integer
 
     tick_o_tv_sec As Integer
 
     tv_nsec As Integer
 
     tv_nsec As Integer
     source_Client As Byte
+
     source_client As Byte
 
     source_port As Byte
 
     source_port As Byte
     dest_Client As Byte
+
     dest_client As Byte
 
     dest_port As Byte          <FONT color=gray>' ''byte indice 15''</font>
 
     dest_port As Byte          <FONT color=gray>' ''byte indice 15''</font>
 
     channel As Byte            <FONT color=gray>' ''byte indice 16''</font>
 
     channel As Byte            <FONT color=gray>' ''byte indice 16''</font>
Riga 25: Riga 25:
 
     param As Integer            <FONT color=gray>' ''byte indice 20''</font>
 
     param As Integer            <FONT color=gray>' ''byte indice 20''</font>
 
     value As Integer            <FONT color=gray>' ''byte indice 24''</font>
 
     value As Integer            <FONT color=gray>' ''byte indice 24''</font>
   '''End''' Struct
+
   End Struct
 
   
 
   
 
  ......
 
  ......
Riga 35: Riga 35:
 
   Dim midi As MidiStruttura  <FONT color=gray>' ''La variabile del tipo della Struttura "MidiStruttura"''</font>
 
   Dim midi As MidiStruttura  <FONT color=gray>' ''La variabile del tipo della Struttura "MidiStruttura"''</font>
 
   
 
   
   i = snd_seq_event_input(handle, VarPtr(p))
+
   Do
  If i < 0 Then Return
+
    i = snd_seq_event_input(handle, VarPtr(p))
 +
    If i < 0 Then Return
 
   
 
   
 
  <FONT color=gray>' ''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":''</font>
 
  <FONT color=gray>' ''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":''</font>
  <FONT color=#B22222>midi = p</font>
+
    <FONT color=#B22222>midi = p</font>
 
   
 
   
 
  <FONT color=gray>' ''Filtra i tipi di Eventi Midi di ALSA che non interessano:''</font>
 
  <FONT color=gray>' ''Filtra i tipi di Eventi Midi di ALSA che non interessano:''</font>
  If midi.type > 14 Then Return
+
    If midi.type > 14 Then Return
 
   
 
   
  With midi
+
  With midi
    Print .channel,
+
    Print .channel,
    Print .note,
+
    Print .note,
    Print .velocity
+
    Print .velocity
  End With
+
  End With
 +
 +
  Loop

Versione attuale delle 09:48, 5 ago 2023

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 nella pagina "Dereferenziare senza Memory-Stream un Puntatore ad una Struttura, passato da una funzione esterna" 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"

 Do
   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

 Loop