Differenze tra le versioni di "Alsa e Gambas: Client e porte in Ricezione dei dati Midi"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Per la creazione del nostro ''Client'' e delle sue porte e per consentirne il collegamento ad ALSA, nella classe principale ''FMain.class'' sciveremo le seguenti righe: Publ...")
 
 
(4 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
Per la creazione del nostro ''Client'' e delle sue porte e per consentirne il collegamento ad ALSA, nella classe principale ''FMain.class'' sciveremo le seguenti righe:
+
Dopo la creazione del programma ''Client'' di ALSA e delle sue porte, per consentire di ricevere dati da un altro ''Client'' esterno, si dovrà utilizzare la funzione esterna di ALSA:
 +
snd_seq_connect_from()
 +
alla quale si dovranno passare il numero del ''Client'' esterno che invia i dati Midi e il numero della sua Porta.
  
Public alsa As CAlsa              <Font Color= #006400>' ''classe che incapsula le funzioni ALSA''</font>
+
Mostriamo un esempio pratico, nel quale poniamo il caso che il dispositivo esterno, che invia dati Midi ad ALSA (i quali dovranno essere intercettati poi dal nostro programma Client), sia connesso ad ALSA - come suo Client. Pertanto il nostro Client dovrà connettersi ad ALSA impostando nella predetta funzione esterna "snd_seq_connect_from()" il numero identificativo del sistema audio interno di ALSA: '''14'''.
+
  Library "libasound:2.0.0"
 
'''Public''' Sub Form_Open()
 
 
  Me.Center
 
 
  <Font Color=gray>' ''creare ("istanziare") la classe per poterla usare''</font>
 
  alsa = New CAlsa As "alsa"
 
 
 
  <Font Color=gray>' ''aprire alsa e assegnare un nome''</font>
 
  alsa.alsa_open("Applicativo in Ricezione dati")
 
 
 
'''End'''
 
 
 
 
 
<P>Nella classe secondaria CAlsa.class richiameremo e porremo sostanzialmente tutte le funzioni, la libreria e le necessarie dichiarazioni di variabili che abbiamo conosciuto nel precedente progetto per l'invio dei dati Midi:</p>
 
Public handle As Pointer
 
Private id As Integer
 
  Private inport As Integer
 
 
 
  Library "libasound:2"
 
 
   
 
   
 
  Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
 
  Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
Riga 50: Riga 32:
 
   
 
   
 
   
 
   
  '''Public''' Sub alsa_open(nome As String)
+
  Public Sub Main()
  Dim err As Integer
 
 
    
 
    
 +
  Dim handle As Pointer
 +
  Dim err, id As Integer
 +
  Dim inport As Integer
 +
 
   err = snd_seq_open(VarPtr(handle), "default", SND_SEQ_OPEN_DUPLEX, 0)
 
   err = snd_seq_open(VarPtr(handle), "default", SND_SEQ_OPEN_DUPLEX, 0)
  printerr("Apertura di Alsa regolare !", err)
+
   If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")
   If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")     <Font Color= #006400>' ''gestione dell'errore''</font>
+
   
+
   snd_seq_set_client_name(handle, "Esempio Client")
   snd_seq_set_client_name(handle, nome)
 
 
   id = snd_seq_client_id(handle)
 
   id = snd_seq_client_id(handle)
 
   Print "Alsa Client-ID = "; id
 
   Print "Alsa Client-ID = "; id
 
 
  <Font Color=gray>' ''per poter leggere la propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo''</font>
 
  err = snd_seq_create_simple_port(handle, "Porta applicativo", SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC + SND_SEQ_PORT_TYPE_APPLICATION)
 
  Print "Numero della porta input dell'applicazione = "; err
 
  If err < 0 Then error.Raise("Errore nella creazione della porta !")      <Font Color= #006400>' ''gestione dell'errore''</font>
 
  inport = err
 
   
 
<Font Color=gray>' ''si pongono: 14 (id del sistema ALSA) e 0 ( num. della sua porta)''</font>
 
<Font Color=gray>' '''''per connettere il nostro client ad Alsa e "ricevere" dati direttamente da essa.'''''</font>
 
  err = snd_seq_connect_from(handle, inport, 14, 0)     
 
  printerr("Subscribe inport", err)
 
  If err < 0 Then error.Raise("Error subscribe input device")      <Font Color= #006400>' ''gestione dell'errore''</font>
 
 
'''End'''
 
 
 
<P>Quindi inseriremo le funzioni per la gestione degli errori:</p>
 
 
<Font Color=gray>''' ###  GESTIONE DELL'ERRORE  ### ''</font>
 
 
   
 
   
Private Extern snd_strerror(err As Integer) As Pointer
+
  <Font Color=gray>' ''Per poter leggere i dati ricevuti dalla propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo Client che invia appunto i dati:''</font>
 +
  inport = snd_seq_create_simple_port(handle, "Porta applicativo", SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC + SND_SEQ_PORT_TYPE_APPLICATION)
 +
  Print "Numero della porta input dell'applicazione = "; inport
 +
  If inport < 0 Then error.Raise("Errore nella creazione della porta !")
 
   
 
   
  '''Public''' Sub errmsg(err As Integer) As String
+
  <Font Color=gray>' ''Si pongono: 14 (id del sistema audio interno ALSA) e 0 ( num. della sua porta) '''per connettere il nostro Client ad ALSA e "ricevere" dati direttamente da essa.'''''</font>
 +
  err = snd_seq_connect_from(handle, inport, <FONT Color=#B22222>'''14'''</font>, <FONT Color=#B22222>'''0'''</font>)
 +
  If err < 0 Then error.Raise("Error subscribe input device")     <Font Color= #006400>' ''gestione dell'errore''</font>
 
   
 
   
    Return String@(snd_strerror(err))
+
  End
   
 
'''End'''
 
 
 
'''Private''' Sub printerr(operation As String, err As Integer)
 
    If err < 0 Then Print operation; ": err="; err; " ("; errmsg(err); ")"
 
'''End'''
 
 
 
 
 
===Ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno===
 
Se si intende, invece, ricevere messaggi Midi da una tastiera o altro dispositivo Midi esterno, dopo averlo collegato alla porta USB, si verificherà in console mediante il comando ''cat /proc/asound/seq/clients'' il suo numero identificativo e la sua porta. Quindi, se, per esempio, il numero identificativo della nostra tastiera esterna è 24 ed il numero della la sua porta è 0, bisognerà sostituire i parametri relativi al dispositivo sorgente nell'apposita funzione:
 
  
  err = snd_seq_connect_from(handle, inport, '''24''', '''0''')
+
===Connettere il Client direttamente tramite il numero identificativo del dispositivo Midi esterno===
 +
Se si intende, invece, connettere il nostro programma Client direttamente tramite il numero identificativo di una tastiera o di altro dispositivo Midi esterno, dopo aver collegato tale dispositivo alla porta USB, si verificherà in console mediante il comando ''cat /proc/asound/seq/clients'' il suo numero identificativo di Client ALSA e la sua porta, e li si utilizzerà nella funzione esterna "snd_seq_connect_from()".
 +
<BR>Quindi, se, per esempio, il numero identificativo della tastiera esterna è 24 ed il numero della la sua porta è 0, bisognerà sostituire i parametri relativi al dispositivo sorgente nell'apposita funzione:
 +
  err = snd_seq_connect_from(handle, inport, <FONT Color=#B22222>'''24'''</font>, <FONT Color=#B22222>'''0'''</font>)

Versione attuale delle 04:59, 20 giu 2024

Dopo la creazione del programma Client di ALSA e delle sue porte, per consentire di ricevere dati da un altro Client esterno, si dovrà utilizzare la funzione esterna di ALSA:

snd_seq_connect_from()

alla quale si dovranno passare il numero del Client esterno che invia i dati Midi e il numero della sua Porta.

Mostriamo un esempio pratico, nel quale poniamo il caso che il dispositivo esterno, che invia dati Midi ad ALSA (i quali dovranno essere intercettati poi dal nostro programma Client), sia connesso ad ALSA - come suo Client. Pertanto il nostro Client dovrà connettersi ad ALSA impostando nella predetta funzione esterna "snd_seq_connect_from()" il numero identificativo del sistema audio interno di ALSA: 14.

Library "libasound:2.0.0"

Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
Private Const SND_SEQ_PORT_CAP_WRITE As Integer = 2
Private Const SND_SEQ_PORT_TYPE_MIDI_GENERIC As Integer = 2
Private Const SND_SEQ_PORT_TYPE_APPLICATION As Integer = 1048576
 
' int snd_seq_open(snd_seq_t **seqp, const char * name, Int streams, Int mode)
' Open the ALSA sequencer.
Private Extern snd_seq_open(Pseq As Pointer, name As String, streams As Integer, mode As Integer) As Integer

' int snd_seq_set_client_name(snd_seq_t* seq, const char* name)
' Set client name.
Private Extern snd_seq_set_client_name(seq As Pointer, name As String) As Integer

' int snd_seq_create_simple_port(snd_seq_t* seq, const char* name, unsigned int caps, unsigned int type)
' Create a port - simple version.
Private Extern snd_seq_create_simple_port(seq As Pointer, name As String, caps As Integer, type As Integer) As Integer

' int snd_seq_client_id(snd_seq_t * seq)
' Get the client id.
Private Extern snd_seq_client_id(seq As Pointer) As Integer

' int snd_seq_connect_from(seq as pointer, myport as integer, src_client as integer, src_port as integer)
' Simple subscription (w/o exclusive & time conversion).
Private Extern snd_seq_connect_from(seq As Pointer, myport As Integer, src_client As Integer, src_port As Integer) As Integer


Public Sub Main()
 
 Dim handle As Pointer
 Dim err, id As Integer
 Dim inport As Integer

 err = snd_seq_open(VarPtr(handle), "default", SND_SEQ_OPEN_DUPLEX, 0)
 If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !")

 snd_seq_set_client_name(handle, "Esempio Client")
 id = snd_seq_client_id(handle)
 Print "Alsa Client-ID = "; id

 ' Per poter leggere i dati ricevuti dalla propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo Client che invia appunto i dati:
 inport = snd_seq_create_simple_port(handle, "Porta applicativo", SND_SEQ_PORT_CAP_WRITE, SND_SEQ_PORT_TYPE_MIDI_GENERIC + SND_SEQ_PORT_TYPE_APPLICATION)
 Print "Numero della porta input dell'applicazione = "; inport
 If inport < 0 Then error.Raise("Errore nella creazione della porta !")

' Si pongono: 14 (id del sistema audio interno ALSA) e 0 ( num. della sua porta) per connettere il nostro Client ad ALSA e "ricevere" dati direttamente da essa.
 err = snd_seq_connect_from(handle, inport, 14, 0)
 If err < 0 Then error.Raise("Error subscribe input device")      ' gestione dell'errore

End

Connettere il Client direttamente tramite il numero identificativo del dispositivo Midi esterno

Se si intende, invece, connettere il nostro programma Client direttamente tramite il numero identificativo di una tastiera o di altro dispositivo Midi esterno, dopo aver collegato tale dispositivo alla porta USB, si verificherà in console mediante il comando cat /proc/asound/seq/clients il suo numero identificativo di Client ALSA e la sua porta, e li si utilizzerà nella funzione esterna "snd_seq_connect_from()".
Quindi, se, per esempio, il numero identificativo della tastiera esterna è 24 ed il numero della la sua porta è 0, bisognerà sostituire i parametri relativi al dispositivo sorgente nell'apposita funzione:

err = snd_seq_connect_from(handle, inport, 24, 0)