La gestione dei file audio mediante le funzioni esterne del API di Canberra
Canberra è una libreria che mette a disposizione funzioni e risorse utilizzate principalmente per l'esecuzione di suoni nel caso vengano sollevati eventi (click, avvio di programma, chiusura di finestre ed applicazioni, etc). Per questa ragione è progettata per eseguire file non eccessivamente grandi, aventi dimensioni non superiori a circa 65 Mbyte.
Un suono-evento viene attivato tramite libcanberra chiamando la funzione esterna "ca_context_play()" su un Oggetto ca_context creato in precedenza.
I formati di file audio supportati sono soltanto WAV e OGG.
Per utilizzare le risorse di Canberra nella propria applicazione Gambas, si dovrà richiamare la libreria condivisa: "libcanberra.so.0.2.5 ".
Esempio in ambiente grafico
Mostriamo di seguito un semplice codice in ambiente grafico:
Private ca As Pointer
Library "libcanberra:0.2.5"
Private Const CA_PROP_MEDIA_FILENAME As String = "media.filename"
' int ca_context_create (ca_context **c)
' Create an (unconnected) context object.
Private Extern ca_context_create(c As Pointer) As Integer
' const char * ca_strerror (int code)
' Converts a numerical error code as returned by most libcanberra API functions into a human readable error string.
Private Extern ca_strerror(code As Integer) As String
' int ca_context_set_driver (ca_context *c, const char *driver)
' Specify the backend driver used. "driver": the backend driver to use (e.g."alsa", "pulse", "null", ...)
Private Extern ca_context_set_driver(c As Pointer, driver As String) As Integer
' int ca_context_open (ca_context *c)
' Connect the context to the sound system.
Private Extern ca_context_open(c As Pointer) As Integer
' int ca_context_play (ca_context *c, uint32_t id, ...)
' Play one event sound
Private Extern ca_context_play(c As Pointer, id As Integer, cpmf As String, sfile As String, nl As String) As Integer
' int ca_context_destroy (ca_context *c)
' Destroy a (connected or unconnected) context object.
Private Extern ca_context_destroy(c As Pointer) As Integer
Public Sub Button1_Click()
Dim err As Integer
Dim nomefile As String
nomefile = "/percorso/del/file/audio"
err = ca_context_create(VarPtr(ca))
If err < 0 Then Error.Raise("Impossibile creare un contesto media: " & ca_strerror(err))
err = ca_context_set_driver(ca, "alsa")
If err < 0 Then Error.Raise("Impossibile impostare il driver audio da utilizzare: " & ca_strerror(err))
err = ca_context_open(ca)
If err < 0 Then Error.Raise("Impossibile aprire un contesto media: " & ca_strerror(err))
err = ca_context_play(ca, 0, CA_PROP_MEDIA_FILENAME, nomefile, Null)
If err < 0 Then Error.Raise("Impossibile eseguire il file audio: " & ca_strerror(err))
End
Public Sub Button2_Click()
Dim err As Integer
' Arresta l'esecuzione del file audio e cancella il contesto media:
err = ca_context_destroy(ca)
If err < 0 Then Error.Raise("Impossibile arrestare il file audio: " & ca_strerror(err))
End
Esempio con applicazione a riga di comando
Mostriamo di seguito un semplice codice con un'applicazione a riga di comando:
Library "libcanberra:0.2.5"
Private Const CA_PROP_MEDIA_FILENAME As String = "media.filename"
' int ca_context_create (ca_context **c)
' Create an (unconnected) context object.
Private Extern ca_context_create(c As Pointer) As Integer
' const char * ca_strerror (int code)
' Converts a numerical error code as returned by most libcanberra API functions into a human readable error string.
Private Extern ca_strerror(code As Integer) As String
' int ca_context_set_driver (ca_context *c, const char *driver)
' Specify the backend driver used. "driver": the backend driver to use (e.g."alsa", "pulse", "null", ...)
Private Extern ca_context_set_driver(c As Pointer, driver As String) As Integer
' int ca_context_open (ca_context *c)
' Connect the context to the sound system.
Private Extern ca_context_open(c As Pointer) As Integer
' int ca_context_play (ca_context *c, uint32_t id, ...)
' Play one event sound
Private Extern ca_context_play(c As Pointer, id As Integer, cpmf As String, sfile As String, nl As String) As Integer
' int ca_context_playing(ca_context *c, uint32_t id, int *playing)
' Check if at least one sound with the specified id is still playing.
Private Extern ca_context_playing(c As Pointer, id As Integer, playing As Pointer) As Integer
' int ca_context_destroy (ca_context *c)
' Destroy a (connected or unconnected) context object.
Private Extern ca_context_destroy(c As Pointer) As Integer
Public Sub Main()
Dim err, esegue As Integer
Dim nomefile As String
Dim ca As Pointer
Dim tm As Date
nomefile = "/percorso/del/file/audio"
err = ca_context_create(VarPtr(ca))
If err < 0 Then Error.Raise("Impossibile creare un contesto media: " & ca_strerror(err))
err = ca_context_set_driver(ca, "alsa")
If err < 0 Then Error.Raise("Impossibile impostare il driver audio da utilizzare: " & ca_strerror(err))
err = ca_context_open(ca)
If err < 0 Then Error.Raise("Impossibile aprire un contesto media: " & ca_strerror(err))
err = ca_context_play(ca, 0, CA_PROP_MEDIA_FILENAME, nomefile, Null)
If err < 0 Then Error.Raise("Impossibile eseguire il file audio: " & ca_strerror(err))
tm = Now
' Il ciclo consente l'esecuzione del file audio. Si esce dal ciclo, quando l'esecuzione è terminata.
Repeat
ca_context_playing(ca, 0, VarPtr(esegue))
' Mostra in console il tempo trascorso dall'inizio dell'esecuzione del file audio:
Write "\r" & Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
Until Int(esegue) == 0
ca_context_destroy(ca)
End