Differenze tra le versioni di "Alsa e Gambas: Accodamento di eventi"

Da Gambas-it.org - Wikipedia.
 
(2 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
ALSA, per processare uno o più eventi, ha bisogno che sia creata una ''coda'' di eventi temporizzati. Come sappiamo, la temporizzazione degli eventi avviene mediante l'assegnazione per ciascun evento da parte dell'applicazione Midi di una <span style= "text-decoration:underline">marcatura temporale</span>: il ''Timestamp''. Una coda di eventi riceverà messaggi di temporizzazione, con i quali cercherà di adattare l'invio degli eventi Midi a questa temporizzazione.
+
#REDIRECT [[ALSA_e_Gambas_-_L'accodamento_degli_eventi]]
<BR>L'evento, temporizzato con il proprio valore ''timestamp'', viene innanzitutto inserito nella coda di priorità, ed indirizzato al proprio client di destinazione subito o successivamente a seconda di quanto stabilito dal ''timestamp''.
 
<P>Per creare una coda bisognerà utilizzare la funzione di ALSA: ''int snd_seq_alloc_queue(snd_seq_t * seq)''. La funzione ritorna il valore identificativo della coda, che potrà essere uguale o superiore a zero. Se la funzione, però, ritorna un valore minore di zero, riporterà un errore. L'identificativo della coda sarà utilizzato nella successiva funzione per far partire la coda medesima.</p>
 
<P>Questa funzione, come ormai ben sappiamo, andrà richiamata in Gambas con la consueta voce ''Extern''. Tenendo conto delle dichiarazioni assunte nel nostro codice nei capitoli iniziali di questa guida, inseriremo detta funzione nella routine ''alsa_open()'' presente in CAlsa.class, e così scriveremo:</p>
 
 
 
PRIVATE Extern snd_seq_alloc_queue(seq As Pointer) As Integer
 
 
'''Public''' Sub alsa_open(myname As string)
 
  Dim err As Integer
 
......
 
 
err = snd_seq_alloc_queue(handle)
 
printerr("Creazione della coda", err)
 
IF err < 0 then error.Raise("Errore nella creazione di una coda")
 
outqueue = err
 
 
......
 
 
 
E' possibile dare anche un nome alla coda sostituendo la funzione di prima con la seguente: ''err = snd_seq_alloc_queue(snd_seq_t * seq, const char * name)'', che sarà così richiamata con Extern ed utilizzata:
 
 
 
PRIVATE Extern snd_seq_alloc_queue(seq as Pointer, nome_coda As String) As Integer
 
 
...... ''<Font Color= #006400>' ''come sopra''</font>
 
err = snd_seq_alloc_queue(handle, "coda_eventi")
 
...... ''<Font Color= #006400>' ''come sopra''</font>
 
 
 
Dopo aver allocato la coda di eventi temporizzati, sarà necessario avviarla. Ciò sarà compiuto mediante la funzione: ''snd_seq_control_queue(seq, q, SND_SEQ_EVENT_START, 0, ev).
 
<BR>Laddove:
 
* ''seq'' è l'handle del sequencer ALSA;
 
* ''q'' è l'identificativo della coda da avviare (o da fermare);
 
* ''type'' è il tipo di evento (''Start'', ''Stop'' oppure ''Continue'');
 
* ''value'' valore relativo all'evento;
 
* ''ev'' è un istanza dell'evento.
 
 
 
Se, invece, intendiamo fermare la coda utilizzeremo aggiungeremo la medesima funzione cambiando, però il terzo parametro nella costante: SND_SEQ_EVENT_STOP.
 
 
 
Nel codice se poniamo due button, con i quali poter scatenare queste funzioni, avremo in CAlsa.class:
 
 
 
Const SND_SEQ_EVENT_START As Integer = 30
 
Const SND_SEQ_EVENT_STOP As Integer = 32
 
 
PRIVATE Extern snd_seq_control_queue(seq As Pointer, id_queue As integer, type_queue As Integer, val_queue As Integer, ev_queue As Integer) As Integer
 
 
'''Public''' Sub start_queue()
 
Dim err As Integer
 
 
err = snd_seq_control_queue(handle, outqueue, SND_SEQ_EVENT_START, 0, 0)
 
printerr("Avvio della coda"), err)
 
 
'''End'''
 
 
 
'''Public''' Sub stop_queue()
 
Dim err As Integer
 
 
err = snd_seq_control_queue(handle, outqueue, SND_SEQ_EVENT_STOP, 0, 0)
 
printerr("Arresto della coda"), err)
 
 
'''End'''
 
 
 
Queste funzioni di per sé, però, non sono sufficienti, bisognerà sempre accompagnarle con la funzione di ALSA, che già conosciamo, ''snd_seq_drai_output()''.
 

Versione attuale delle 17:34, 12 gen 2022