Alsa e Gambas: L'evento Eco

Da Gambas-it.org - Wikipedia.
Versione del 14 ott 2011 alle 08:00 di Vuott (Discussione | contributi) (Scrittura in Gambas)

Nella progettazione del nostro sequencer può risultare utile verificare il punto di esecuzione dell'applicativo, come ad esempio conoscere quando il programma sta eseguendo degli eventi Midi. Per sapere ciò che in quel momento sta facendo il nostro client-sequencer, dobbiamo inviare un particolare tipo di evento: l'Eco.
Il sequencer riceve l'evento eco anch'esso temporizzato, e ce lo restituirà nel momento stabilito dal proprio timestamp. Quando il programma ci ritorna l'eco, che noi abbiamo precedentemente inviato, siamo in grado di individuare il punto del processo in cui si trova il sequencer.

Scrittura in Gambas

Poiché l'Eco è un evento come qualsiasi altro, e tale è definito e riconosciuto da ALSA, in Gambas lo invieremo utilizzando le medesime modalità (Memory Stream oppure Strutture) che noi conosciamo per inviare un qualsiasi tipo di evento. Avremo solo l'accortezza di indicare il sequencer stesso come destinatario dell'evento Eco. Per fare ciò, dopo aver individuato il numero identificativo e la porta del nostro sequencer-applicativo, dovremo inserire tali valori nella funzione esterna di ALSA: err = snd_seq_connect_to(handle, outport, dclient, dport).

Dunque, tenendo conto del modello di codice riportato agli inizi della nostra guida, scriveremo così:


Const SND_SEQ_EVENT_ECHO As Integer = 50      ' Questa costante di ALSA individua il "tipo" di evento: un'Eco.

  Dim err As Integer

Public Sub invioEco(timestamp As Integer)

prepareev(SND_SEQ_EVENT_ECHO, timestamp)    ' chiama la routine di preparazione di un evento.

Seek #pStream, 16
 WRITE #pStream, 254 as Byte     ' Identificativo del destinatario: il sequencer invia l'Eco a se stesso.

  WRITE #pStream, 253 as Byte      ' Porta del destinatario.

err = snd_seq_event_output_buffer(handle, ev)

  printerr("Eco", err)    ' Consueta gestione dell'errore.

End

L'evento Eco verrà, poi, intercettato come qualsiasi altro evento con le funzioni che già conosciamo per ricevere gli eventi Midi.