Audio ed Alsa: apertura del subsistema PCM

Da Gambas-it.org - Wikipedia.

Dichiarazione della Libreria di Alsa

Poiché bisognerà utilizzare delle funzioni esterne a Gambas, appartenenti alle API di ALSA, bisognerà innanzitutto individuare la specifica libreria condivisa .so ove tali funzioni sono contenute.

Si dichiarera all'inizio della Classe specifica la libreria di ALSA:

Library "libasound:2"


Apertura del subsistema PCM

L'apertura del sub-sistema PCM nella modalità di Riproduzione audio avviene medinete la specifica delle API di ALSA, così espressa in C:

int snd_pcm_open(snd_pcm_t **pcm, const char *name, snd_pcm_stream_t stream, int mode)

laddove:

  • snd_pcm_t **pcm è un puntatore ad un puntatore che rappresenta, quest'ultimo, l'handle necessario per l'apertura del dispositivo PCM.

In Gambas detto handle sarà dichiarato come una variabile di tipo Pointer:

Private handle As Pointer
  • const char * name è una stringa che rappresenta il nome identificativo dell'handle del dispositivo PCM, e che potrà essere inizialmente "default":
Private device As String = "default"
  • snd_pcm_stream_t stream è un intero che specifica la modalità scelta della direzione del flusso dei dati, in tal caso sarà in modalità Riproduzione audio, ossia valore pari a zero:
Private Const SND_PCM_STREAM_PLAYBACK As Byte = 0
  • int mode è la modalità di apertura del sub-sitema PCM. L'impostazione standard del valore mode è zero. Altre modalità sono Non blocking e Async notification.


La funzione restituisce un intero che, se è uguale, a zero significa che l'operazione della funzione ha avuto successo.


Dichiarazione della funzione esterna snd_pcm_open

In Gambas la funzione snd_pcm_open per l'apertura del sub-sistema PCM dovrà essere innanzitutto dichiarata preventivamente con Extern:

Private Extern snd_pcm_open(handleP As Pointer, nome As String, flusso As Integer, 0) As Integer

e potremo, quindi, in subroutine richiamarla per l'uso (i nomi dei parametri sono quelli indicati nel paragrafo precedente):

  err = snd_pcm_open(handle, device, SND_PCM_STREAM_PLAYBACK, 0)


Riassunto esemplificativo

Il codice sin qui esposto sarà il seguente:

Library "libasound:2"

Private handle As Pointer
Private device As String = "default"
Private Const SND_PCM_STREAM_PLAYBACK As Byte = 0

Private Extern snd_pcm_open(handleP As Pointer, nome As String, flusso As Integer, mode As Integer) As Integer


Public apre_alsa()

 Dim err As Integer

  err = snd_pcm_open(VarPtr(handle), device, SND_PCM_STREAM_PLAYBACK, 0)

End