|
|
(9 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:
| + | #REDIRECT [[Alsa_e_Gambas:_Client_e_porte_in_Ricezione_dei_dati_Midi]] |
− | | |
− | Public alsa As CAlsa <Font Color= #006400>' ''classe che incapsula le funzioni ALSA''</font>
| |
− |
| |
− |
| |
− | '''Public''' Sub Form_Open()
| |
− |
| |
− | Me.Center
| |
− |
| |
− | <Font Color= #006400>' ''creare ("istanziare") la classe per poterla usare''</font>
| |
− | alsa = New CAlsa As "alsa"
| |
− |
| |
− | <Font Color= #006400>' ''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>
| |
− | | |
− | <Font Color= #006400>' ''Gambas-3 class file''</font>
| |
− |
| |
− | Export
| |
− |
| |
− | Public handle As Pointer
| |
− | Private id As Integer
| |
− | Private inport As Integer
| |
− |
| |
− | Library "libasound:2"
| |
− |
| |
− | Const SND_SEQ_OPEN_DUPLEX As Integer = 3
| |
− |
| |
− | <Font Color= #006400>' ''#define SND_SEQ_PORT_CAP_WRITE (1<<1)''</font>
| |
− | Const SND_SEQ_PORT_CAP_WRITE As Integer = 2
| |
− |
| |
− | <Font Color= #006400>' ''#define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1)''</font>
| |
− | Const SND_SEQ_PORT_TYPE_MIDI_GENERIC As Integer = 2
| |
− |
| |
− | <Font Color= #006400>' ''#define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<20)''</font>
| |
− | Const SND_SEQ_PORT_TYPE_APPLICATION As Integer = 1048576
| |
− |
| |
− |
| |
− | <Font Color= #006400>' ''int snd_seq_open(snd_seq_t **seqp, const char * name, Int streams, Int mode)''</font>
| |
− | Private Extern snd_seq_open(Pseq As Pointer, name As String, streams As Integer, mode As Integer) As Integer
| |
− |
| |
− | <Font Color= #006400>' ''int snd_seq_set_client_name(snd_seq_t* seq, const char* name)''</font>
| |
− | Private Extern snd_seq_set_client_name(seq As Pointer, name As String) As Integer
| |
− |
| |
− | <Font Color= #006400>' ''int snd_seq_create_simple_port(snd_seq_t* seq, const char* name, unsigned int caps, unsigned int type)''</font>
| |
− | Private Extern snd_seq_create_simple_port(seq As Pointer, name As String, caps As Integer, type As Integer) As Integer
| |
− |
| |
− | <Font Color= #006400>' ''int snd_seq_client_id(snd_seq_t * seq)''</font>
| |
− | Private Extern snd_seq_client_id(seq As Pointer) As Integer
| |
− |
| |
− | <Font Color= #006400>' ''int snd_seq_connect_from(seq as pointer, myport as integer, src_client as integer, src_port as integer)''</font>
| |
− | Private Extern snd_seq_connect_from(seq As Pointer, myport As Integer, src_client As Integer, src_port As Integer) As Integer
| |
− |
| |
− |
| |
− | '''Public''' Sub alsa_open(myname As String)
| |
− | Dim err As Integer
| |
− |
| |
− | 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 !") <Font Color= #006400>' ''gestione dell'errore''</font>
| |
− |
| |
− | snd_seq_set_client_name(handle, myname)
| |
− | id = snd_seq_client_id(handle)
| |
− | Print "Alsa Client-ID = "; id
| |
− |
| |
− | <Font Color= #006400>' ''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
| |
− |
| |
− | err = snd_seq_connect_from(handle, inport, 14, 0) <Font Color= #006400>' ''si pongono: 14 (id del sistema ALSA) e 0 ( num. della sua porta) per connettere il nostro client ad Alsa''</font>
| |
− | 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= #006400>'' ### GESTIONE DELL'ERRORE ### ''</font>
| |
− |
| |
− | Private Extern snd_strerror(err As Integer) As Pointer
| |
− |
| |
− | '''Public''' Sub errmsg(err As Integer) As String
| |
− |
| |
− | Return String@(snd_strerror(err))
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Private''' Sub printerr(operation As String, err As Integer)
| |
− | If err < 0 Then Print operation; ": err="; err; " ("; errmsg(err); ")"
| |
− | '''End'''
| |
− | | |
− | <p>In fine in console mediante il comando ''cat /proc/asound/seq/clients'', dopo aver collegato la nostra tastiera Midi esterna, si prenderà nota del suo numero identificativo e della sua porta. Successivamente mediante il comando ''aconnect'' si connetterà la tastiera al sistema AlSA.</p>
| |
− | <P>Se, per esempio, il numero identificativo della notra tastiera esterna è 24 ed il numero della la sua porta è 0, si procederà così:</p>
| |
− | | |
− | aconnect 24:0 14:0
| |