Differenze tra le versioni di "ALSA e Gambas - Invio dei dati ad Alsa mediante una specifica funzione esterna"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità <SUP>[[[#Note|note 1]]]</sup> <BR>Una...")
 
Riga 1: Riga 1:
 
Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità <SUP>&#091;[[#Note|note 1]]&#093;</sup>
 
Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità <SUP>&#091;[[#Note|note 1]]&#093;</sup>
 
<BR>Una di queste è l'uso di una funzione propria del sistema Alsa:
 
<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)
+
  int snd_seq_sync_output_queue(snd_seq_t *seq, size_t size)
 
che in Gambas richiameremo con:
 
che in Gambas richiameremo con:
 
  Private Extern snd_seq_sync_output_queue(seq As Pointer, size As Long) As Integer
 
  Private Extern snd_seq_sync_output_queue(seq As Pointer, size As Long) As Integer
ed utilizzeremo poi nella classe del nostro sequencer, dedicata alle funzioni Alsa:
+
e utilizzeremo poi così nella ''Classe'' dedicata alle funzioni ALSA:
'''Public''' Sub wait()
 
 
Dim err As Integer
 
 
 
   err = snd_seq_sync_output_queue(handle, 0)
 
   err = snd_seq_sync_output_queue(handle, 0)
   
+
  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.
'''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>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.
 
<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, 27 gen 2022

Come abbiamo accennato nel precedente paragrafo, per inviare i dati ad Alsa, perché li processi, sono possibili tre modalità [note 1]
Una di queste è l'uso di una funzione propria del sistema Alsa:

int 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, size As Long) As Integer

e utilizzeremo poi così nella Classe dedicata alle funzioni ALSA:

 err = snd_seq_sync_output_queue(handle, 0)
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.