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 mediante 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. Per ottenere una variabile di tipo Puntatore di un Puntatore si utilizzerà in Gambas la funzione VarPtr( ).

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"

Il nome è legato e condiziona il tipo di interfaccia al sub-sistema PCM di ALSA, che potrà essere individuato tra quelli compresi nella enumerazione _snd_pcm_type. |1|

  • 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(VarPtr(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


Note

[1] ALSA fornisce una serie di nomi dei dispositivi PCM. Quando si specifica una sorgente o un dispositivo audio, ALSA consente di specificare i dispositivi alternativi, non solo le schede audio. L'elenco dei nomi per i dispositivi è il seguente:

  • dispositivo standard: default

- è quello predefinito;
- corrisponde al dispositivo plughw predefinito;
- non prevede parametri.

  • dispositivo nullo: null

- è un dispositivo nullo (buco nero);
- in lettura è muto;
- in scrittura non scrive;
- non prevede parametri.

  • dispositivo hardware: hw

- consente l'accesso diretto ai driver della scheda installati sul computer;
prevede i seguenti parametri:

  1. CARD: Tipo di scheda audio (numero o nome);
  2. DEV: Numero del dispostivo;
  3. SUBDEV: numero di porta all'interno della scheda audio (solo per le schede con più porte di uscita).

Se si pone il valore -1 in DEV ed in SUBDEV, viene indicato rispettivamente qualunque dispositivo o porta immediatamente disponibile.
- la sintassi è:

hw: <dispositivo> <dispositivo> <dispositivo>

esempio: hw:0,0

  • dispositivo hardware con conversioni automatiche: plughw.

- consente l'accesso diretto al controllo finale con un plugin di conversione automatica.

  • dispositivo di conversione automatica: plug

- passa i dati mediante un plugin di conversione prima di ridirigere il flusso a un plugin specificato come parametro.

  • dispositivo di memoria condivisa: shm

- si usa per connettersi con dispositivi remoti.

  • dispositivo di biforcazione: tee
  • dispositivo di file: file.