Differenze tra le versioni di "Alsa e Gambas: Client e porte in Ricezione"
Da Gambas-it.org - Wikipedia.
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: | 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: | ||
− | Public alsa As CAlsa ' ''classe che incapsula le funzioni ALSA'' | + | Public alsa As CAlsa <Font Color= #006400>' ''classe che incapsula le funzioni ALSA''</font> |
Riga 8: | Riga 8: | ||
Me.Center | Me.Center | ||
− | ' ''creare ("istanziare") la classe per poterla usare'' | + | <Font Color= #006400>' ''creare ("istanziare") la classe per poterla usare''</font> |
alsa = New CAlsa As "alsa" | alsa = New CAlsa As "alsa" | ||
− | ' ''aprire alsa e assegnare un nome'' | + | <Font Color= #006400>' ''aprire alsa e assegnare un nome''</font> |
alsa.alsa_open("Applicativo in Ricezione dati") | alsa.alsa_open("Applicativo in Ricezione dati") | ||
Riga 19: | Riga 19: | ||
<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> | <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> | ||
− | ' ''Gambas-3 class file'' | + | <Font Color= #006400>' ''Gambas-3 class file''</font> |
Export | Export | ||
Riga 31: | Riga 31: | ||
Const SND_SEQ_OPEN_DUPLEX As Integer = 3 | Const SND_SEQ_OPEN_DUPLEX As Integer = 3 | ||
− | ' ''#define SND_SEQ_PORT_CAP_WRITE (1<<1)'' | + | <Font Color= #006400>' ''#define SND_SEQ_PORT_CAP_WRITE (1<<1)''</font> |
Const SND_SEQ_PORT_CAP_WRITE As Integer = 2 | Const SND_SEQ_PORT_CAP_WRITE As Integer = 2 | ||
− | ' ''#define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1)'' | + | <Font Color= #006400>' ''#define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1)''</font> |
Const SND_SEQ_PORT_TYPE_MIDI_GENERIC As Integer = 2 | Const SND_SEQ_PORT_TYPE_MIDI_GENERIC As Integer = 2 | ||
− | ' ''#define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<20)'' | + | <Font Color= #006400>' ''#define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<20)''</font> |
Const SND_SEQ_PORT_TYPE_APPLICATION As Integer = 1048576 | Const SND_SEQ_PORT_TYPE_APPLICATION As Integer = 1048576 | ||
− | ' ''int snd_seq_open(snd_seq_t **seqp, const char * name, Int streams, Int mode) | + | <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 | 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)'' | + | <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 | 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)'' | + | <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 | 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)'' | + | <Font Color= #006400>' ''int snd_seq_client_id(snd_seq_t * seq)''</font> |
Private Extern snd_seq_client_id(seq As Pointer) As Integer | 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)'' | + | <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 | Private Extern snd_seq_connect_from(seq As Pointer, myport As Integer, src_client As Integer, src_port As Integer) As Integer | ||
Riga 62: | Riga 62: | ||
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) | printerr("Apertura di Alsa regolare !", err) | ||
− | If err < 0 Then error.RAISE("Errore nell'apertura di ALSA !") ' ''gestione dell'errore'' | + | 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) | snd_seq_set_client_name(handle, myname) | ||
Riga 68: | Riga 68: | ||
Print "Alsa Client-ID = "; id | Print "Alsa Client-ID = "; id | ||
− | ' ''per poter leggere la propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo'' | + | <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) | 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 | Print "Numero della porta input dell'applicazione = "; err | ||
− | If err < 0 Then error.Raise("Errore nella creazione della porta !") ' ''gestione dell'errore'' | + | If err < 0 Then error.Raise("Errore nella creazione della porta !") <Font Color= #006400>' ''gestione dell'errore''</font> |
inport = err | inport = err | ||
err = snd_seq_connect_from(handle, inport, id, 0) | err = snd_seq_connect_from(handle, inport, id, 0) | ||
printerr("Subscribe inport", err) | printerr("Subscribe inport", err) | ||
− | If err < 0 Then error.Raise("Error subscribe input device") ' ''gestione dell'errore'' | + | If err < 0 Then error.Raise("Error subscribe input device") <Font Color= #006400>' ''gestione dell'errore''</font> |
'''End''' | '''End''' | ||
Riga 83: | Riga 83: | ||
<P>Quindi inseriremo le funzioni per la gestione degli errori:</p> | <P>Quindi inseriremo le funzioni per la gestione degli errori:</p> | ||
− | '' ### GESTIONE DELL'ERRORE ### '' | + | <Font Color= #006400>'' ### GESTIONE DELL'ERRORE ### ''</font> |
Private Extern snd_strerror(err As Integer) As Pointer | Private Extern snd_strerror(err As Integer) As Pointer |
Versione delle 15:49, 30 ago 2011
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:
Public alsa As CAlsa ' classe che incapsula le funzioni ALSA Public Sub Form_Open() Me.Center ' creare ("istanziare") la classe per poterla usare alsa = New CAlsa As "alsa" ' aprire alsa e assegnare un nome alsa.alsa_open("Applicativo in Ricezione dati") End
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:
' Gambas-3 class file Export Public handle As Pointer Private id As Integer Private inport As Integer Library "libasound:2" Const SND_SEQ_OPEN_DUPLEX As Integer = 3 ' #define SND_SEQ_PORT_CAP_WRITE (1<<1) Const SND_SEQ_PORT_CAP_WRITE As Integer = 2 ' #define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<1) Const SND_SEQ_PORT_TYPE_MIDI_GENERIC As Integer = 2 ' #define SND_SEQ_PORT_TYPE_MIDI_GENERIC (1<<20) Const SND_SEQ_PORT_TYPE_APPLICATION As Integer = 1048576 ' int snd_seq_open(snd_seq_t **seqp, const char * name, Int streams, Int mode) 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) 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) 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) 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) 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 !") ' gestione dell'errore snd_seq_set_client_name(handle, myname) id = snd_seq_client_id(handle) Print "Alsa Client-ID = "; id ' per poter leggere la propria porta, essa viene posta con capacità "Write", ossia "scrivibile" da parte dell'Altro dispositivo 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 !") ' gestione dell'errore inport = err err = snd_seq_connect_from(handle, inport, id, 0) printerr("Subscribe inport", err) If err < 0 Then error.Raise("Error subscribe input device") ' gestione dell'errore End
Quindi inseriremo le funzioni per la gestione degli errori:
### GESTIONE DELL'ERRORE ### 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