Differenze tra le versioni di "Connettere due Client mediante la sottoscrizione delle porte"

Da Gambas-it.org - Wikipedia.
(Creata pagina con 'Mostriamo di seguito un esempio di applicativo che consente la sottoscrizione della connessione delle porte di due Client di Alsa, nonché la successiva disconnessione. Priva...')
 
 
Riga 1: Riga 1:
Mostriamo di seguito un esempio di applicativo che consente la sottoscrizione della connessione delle porte di due Client di Alsa, nonché la successiva disconnessione.
+
#REDIRECT [[ALSA_e_Gambas:_Connettere_due_Client_mediante_la_sottoscrizione_delle_porte]]
Private seq As Pointer
 
 
 
Library "libasound:2"
 
 
Private Const SND_SEQ_OPEN_DUPLEX As Integer = 3
 
Private Const SND_SEQ_PORT_CAP_READ As Integer = 1
 
Private Const SND_SEQ_PORT_CAP_SUBS_READ As Integer = 32
 
 
 
<FONT color=gray>' ''int snd_seq_open (snd_seq_t **handle, const char *name, int streams, int mode)''
 
' ''Open the ALSA sequencer.''</font>
 
Private Extern snd_seq_open(handle As Pointer, name As String, streams As Integer, mode As Integer) As Integer
 
 
<FONT color=gray>' ''int snd_seq_set_client_name(snd_seq_t * seq, const char * name)''
 
' ''Set client name.''</font>
 
Private Extern snd_seq_set_client_name(handle As Pointer, name As String) As Integer
 
 
<FONT color=gray>' ''int snd_seq_client_id(snd_seq_t * seq)''
 
' ''Get the client id.''</font>
 
Private Extern snd_seq_client_id(handle As Pointer) As Integer
 
 
<FONT color=gray>' ''int snd_seq_parse_address (snd_seq_t *seq, snd_seq_addr_t *addr, const char *str)''
 
' ''Parse the given string and get the sequencer address.''</font>
 
Private Extern snd_seq_parse_address(handle As Pointer, addr As Pointer, charstr As String) As Integer
 
 
<FONT color=gray>' ''int snd_seq_port_subscribe_malloc (snd_seq_port_subscribe_t **ptr)''
 
' ''Allocate an empty snd_seq_port_subscribe_t using standard malloc.''</font>
 
Private Extern snd_seq_port_subscribe_malloc(ptr As Pointer) As Integer
 
 
<FONT color=gray>' ''void snd_seq_port_subscribe_set_sender (snd_seq_port_subscribe_t *info, const snd_seq_addr_t *addr)''
 
' ''Set sender address of a port_subscribe container.''</font>
 
Private Extern snd_seq_port_subscribe_set_sender(pinfo As Pointer, addr As Pointer)
 
 
<FONT color=gray>' ''void snd_seq_port_subscribe_set_dest (snd_seq_port_subscribe_t *info, const snd_seq_addr_t *addr)
 
' ''Set destination address of a port_subscribe container.''</font>
 
Private Extern snd_seq_port_subscribe_set_dest(pinfo As Pointer, addr As Pointer)
 
 
<FONT color=gray>' ''void snd_seq_port_subscribe_set_queue (snd_seq_port_subscribe_t *info, int q)''
 
' ''Set the queue id of a port_subscribe container.''</font>
 
Private Extern snd_seq_port_subscribe_set_queue(pinfo As Pointer, qI As Integer)
 
 
<FONT color=gray>' ''void snd_seq_port_subscribe_set_exclusive (snd_seq_port_subscribe_t *info, int val)''
 
' ''Set the exclusive mode of a port_subscribe container.''</font>
 
Private Extern snd_seq_port_subscribe_set_exclusive(pinfo As Pointer, vI As Integer)
 
 
<FONT color=gray>' ''void snd_seq_port_subscribe_set_time_update (snd_seq_port_subscribe_t *info, int val)''
 
' ''Set the time-update mode of a port_subscribe container.''</font>
 
Private Extern snd_seq_port_subscribe_set_time_update(pinfo As Pointer, vI As Integer)
 
 
<FONT color=gray>' ''void snd_seq_port_subscribe_set_time_real (snd_seq_port_subscribe_t *info, int val)''
 
' ''Set the real-time mode of a port_subscribe container.''</font>
 
Private Extern snd_seq_port_subscribe_set_time_real(pinfo As Pointer, vI As Integer)
 
 
<FONT color=gray>' ''int snd_seq_get_port_subscription (snd_seq_t *handle, snd_seq_port_subscribe_t *sub)''
 
' ''Obtain subscription information.''</font>
 
Private Extern snd_seq_get_port_subscription(handle As Pointer, subP As Pointer) As Integer
 
 
<FONT color=gray>' ''int snd_seq_subscribe_port (snd_seq_t *handle, snd_seq_port_subscribe_t *sub)''
 
' ''Subscribe a port connection.''</font>
 
Private Extern snd_seq_subscribe_port(handle As Pointer, subP As Pointer) As Integer
 
 
<FONT color=gray>' ''int snd_seq_unsubscribe_port (snd_seq_t *handle, snd_seq_port_subscribe_t *sub)''
 
' ''Unsubscribe a connection between ports.''</font>
 
Private Extern snd_seq_unsubscribe_port(handle As Pointer, subP As Pointer) As Integer
 
 
<FONT color=gray>' ''const char * snd_strerror (int errnum)''
 
' ''Returns the message for an error code.''</font>
 
Private Extern snd_strerror(err As Integer) As Pointer
 
 
<FONT color=gray>' ''int snd_seq_close (snd_seq_t *handle)''
 
' ''Close the sequencer.''</font>
 
Private Extern snd_seq_close(handle As Pointer)
 
 
 
'''Public''' Sub Main()
 
 
  inizializza_Alsa()
 
 
 
  sottoscrizione_Porte()
 
 
 
  chiude_Alsa()
 
 
'''End'''
 
 
 
'''Private''' Procedure inizializza_Alsa()
 
 
  Dim err, id As Integer
 
 
 
  err = snd_seq_open(VarPtr(seq), "default", SND_SEQ_OPEN_DUPLEX, 0)
 
  If err < 0 Then Error.Raise("Errore nell'apertura di Alsa: " & snd_strerror(err))
 
 
 
  err = snd_seq_set_client_name(seq, "Connessione Porte Client ALSA")
 
  If err < 0 Then Error.Raise("Imposibile attribuire un nome al programma: " & snd_strerror(err))
 
 
 
  id = snd_seq_client_id(seq)
 
  If id < 0 Then Error.Raise("Imposibile ottenere un ID del programma: " & snd_strerror(err))
 
 
'''End'''
 
 
 
'''Private''' Procedure sottoscrizione_Porte()
 
 
  Dim err, queue, exclusive As Integer
 
  Dim sender, dest, convert_time, convert_real As Integer
 
  Dim subs As Pointer
 
 
 
<FONT color=gray>' ''Imposta la sottoscrizione delle porte:''</font>
 
  err = snd_seq_parse_address(seq, VarPtr(sender), Application.Args[Application.Args.Count - 2])
 
  If err < 0 Then Error.Raise("Indirizzo non vaido del mittente: " & snd_strerror(err))
 
 
 
  err = snd_seq_parse_address(seq, VarPtr(dest), Application.Args[Application.Args.Count - 1])
 
  If err < 0 Then Error.Raise("Indirizzo non vaido del Client destinatario: " & snd_strerror(err))
 
 
 
  snd_seq_port_subscribe_malloc(VarPtr(subs))
 
  snd_seq_port_subscribe_set_sender(subs, VarPtr(sender))
 
  snd_seq_port_subscribe_set_dest(subs, VarPtr(dest))
 
  snd_seq_port_subscribe_set_queue(subs, queue)
 
  snd_seq_port_subscribe_set_exclusive(subs, exclusive)
 
  snd_seq_port_subscribe_set_time_update(subs, convert_time)
 
  snd_seq_port_subscribe_set_time_real(subs, convert_real)
 
 
 
 
<FONT color=gray>' ''Sottoscrizione e cancellazione della sottoscrizione:''</font>
 
 
  If Application.Args[1] = "d" Then
 
    err = snd_seq_get_port_subscription(seq, subs)
 
    If err < 0 Then Error.Raise("Nessuna sottoscrizione trovata: " & snd_strerror(err))
 
     
 
    err = snd_seq_unsubscribe_port(seq, subs)
 
    If err < 0 Then Error.Raise("Tentativo di disconnessione fallito: " & snd_strerror(err))
 
    Print "Disconnessione avvenuta !"
 
  Else
 
    err = snd_seq_get_port_subscription(seq, subs)
 
    If err = 0 Then Error.Raise("La connessione è già sottoscritta: " & snd_strerror(err))
 
 
 
    err = snd_seq_subscribe_port(seq, subs)
 
    If err < 0 Then Error.Raise("Tentativo di connessione fallito: " & snd_strerror(err))
 
    Print "Connessione avvenuta !"
 
  Endif
 
 
'''End'''
 
 
 
 
'''Private''' Procedure chiude_Alsa()
 
 
  snd_seq_close(seq)
 
 
 
'''End'''
 
Per eseguire il suddetto codice, bisognerà creare il relativo eseguibile "''a riga di comando''". L'eseguibile andrà lanciato da Terminale:
 
* per connettere due porte: indicare il numero identificativo del Client che invia i dati Midi e quello della sua porta di uscita, e di seguito il numero identificativo del Client ricevente e quello della sua porta di entrata. Esempio:
 
connettore.gambas 14:0 128:0
 
* per disconnettere due Client: come il precedente punto premettendo la lettera "d". Esempio:
 
connettore.gambas d 14:0 128:0
 

Versione attuale delle 17:52, 11 gen 2022