Differenze tra le versioni di "Alsa e Gambas: Invio dati con una funzione Alsa"
(Nuova pagina: Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità |1| ==Note== [1] Ricordiamo che esse sono: * ...) |
|||
Riga 1: | Riga 1: | ||
− | Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità |[[#Note|1]]| | + | Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità |[[#Note|1]]|. |
+ | <BR>Una di queste è l'uso di una funzione propria del sistema Alsa: | ||
+ | snd_seq_sync_output_queue(snd_seq_t *seq, size_t size) | ||
+ | che in Gambas richiameremo con: | ||
+ | Private Extern snd_seq_sync_output_queue(seq As Pointer, 0) As Integer | ||
+ | ed utilizzeremo poi nella classe del nostro sequencer, dedicata alle funzioni Alsa: | ||
+ | '''Public''' Sub wait() | ||
+ | |||
+ | snd_seq_sync_output_queue(handle, 0) | ||
+ | |||
+ | '''End''' | ||
+ | Il funzionamento tra la fase di invio dei dati e l'azione di detta funzione esterna è un semplice ciclo. Si avrà cura di porre nella routine che prevede l'inivio dei dati, costitutivi di ciascun Messaggio Midi, la chiamata a quella routine, contenente la funzione esterna, <SPAN style="text-decoration:underline">dopo</span> la funzione di invio dei dati. | ||
+ | <BR>La funzione esterna di Alsa provvederà essa stessa - automaticamente - a ricevere il numero di dati necessari per formare la "''coda''" di eventi da sequenziare ogni qual volta si libera il buffer, impedendo così ogni cattivo funzionamento del ciclo. | ||
+ | <BR>Si è avuto modo di constatare che, utilizzando questa funzione esterna di Alsa, anche in questo caso non è possibile inviare una grande quantità di dati per volta. L'uso di questa funzione, però, consente l'invio anche di un solo evento alla volta per ogni ciclo. | ||
Versione delle 17:41, 16 lug 2012
Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità |1|.
Una di queste è l'uso di una funzione propria del sistema Alsa:
snd_seq_sync_output_queue(snd_seq_t *seq, size_t size)
che in Gambas richiameremo con:
Private Extern snd_seq_sync_output_queue(seq As Pointer, 0) As Integer
ed utilizzeremo poi nella classe del nostro sequencer, dedicata alle funzioni Alsa:
Public Sub wait() snd_seq_sync_output_queue(handle, 0) End
Il funzionamento tra la fase di invio dei dati e l'azione di detta funzione esterna è un semplice ciclo. Si avrà cura di porre nella routine che prevede l'inivio dei dati, costitutivi di ciascun Messaggio Midi, la chiamata a quella routine, contenente la funzione esterna, dopo la funzione di invio dei dati.
La funzione esterna di Alsa provvederà essa stessa - automaticamente - a ricevere il numero di dati necessari per formare la "coda" di eventi da sequenziare ogni qual volta si libera il buffer, impedendo così ogni cattivo funzionamento del ciclo.
Si è avuto modo di constatare che, utilizzando questa funzione esterna di Alsa, anche in questo caso non è possibile inviare una grande quantità di dati per volta. L'uso di questa funzione, però, consente l'invio anche di un solo evento alla volta per ogni ciclo.
Note
[1] Ricordiamo che esse sono:
- inviare ad Alsa un evento Eco, ed attendere che esso torni al sequencer;
- attendere un avviso di EVENT_STOP per la coda degli eventi che viene inviato dalla porta Timer di sistema (questa richiederebbe una sottoscrizione);
- attendere che il pool di uscita sia vuoto (in questo caso si utilizzerebbe la funzione: snd_seq_sync_output_queue(snd_seq_t *seq, size_t size), la quale attende sino a che tutti gli eventi sono stati processati.