Eseguire un file WAV mediante le funzioni esterne del API di Sndio
Vai alla navigazione
Vai alla ricerca
La libreria libsndio consente di eseguire un file WAV.
E' necessario avere installata nel sistema e richiamare in Gambas la libreria condivisa: "libsndio.so.7.3 ".
Mostriamo un esempio pratico:
Library "libsndio:7.3"
Public Struct sio_par
bits As Integer
bps As Integer
sig As Integer
le As Integer
msb As Integer
rchan As Integer
pchan As Integer
rate As Integer
bufsz As Integer
xrun As Integer
round As Integer
appbufsz As Integer
__pad[3] As Integer
__magic As Integer
End Struct
Private Const SIO_DEVANY As String = "default"
Private Const SIO_PLAY As Integer = 1
' void sio_initpar(struct sio_par *par)
Private Extern sio_initpar(par As Sio_par)
' struct sio_hdl *sio_open(const char *name, unsigned int mode, int nbio_flag)
Private Extern sio_open(name As String, mode As Integer, nbio_flag As Integer) As Pointer
' int sio_setpar(struct sio_hdl *hdl, struct sio_par *par)
Private Extern sio_setpar(hdl As Pointer, par As Sio_par) As Integer
' int sio_getpar(struct sio_hdl *hdl, struct sio_par *par)
Private Extern sio_getpar(hdl As Pointer, par As Sio_par) As Integer
' int sio_start(struct sio_hdl *hdl)
Private Extern sio_start(hdl As Pointer) As Integer
' size_t sio_write(struct sio_hdl *hdl, const void *addr, size_t nbytes)
Private Extern sio_write(hdl As Pointer, addr As Pointer, nbytes As Long) As Long
' void sio_close(struct sio_hdl *hdl)
Private Extern sio_close(hdl As Pointer)
Public Sub Main()
Dim sp As New Sio_par
Dim wav As String
Dim sh As Pointer
Dim lun, i, obr, pos As Integer
Dim bufsz As Long
Dim fl As File
Dim buf As Byte[]
wav = "/percorso/del/file.wav"
If Not Exist(wav) Then Error.Raise("Errore: file inesistente !")
fl = Open wav For Read
lun = Lof(fl)
sio_initpar(sp)
sh = sio_open(SIO_DEVANY, SIO_PLAY, 0)
If sh == 0 Then Error.Raise("Errore !")
' Estrae dal file wav il numero dei canali, la frequenza di campionamento e la risoluzione:
Seek #fl, 22
sp.pchan = Read #fl As Short
sp.rate = Read #fl As Integer
Seek #fl, 34
sp.bits = Read #fl As Short
i = sio_setpar(sh, sp)
If i = 0 Then Error.Raise("Errore !")
i = sio_getpar(sh, sp)
If i = 0 Then Error.Raise("Errore !")
bufsz = 1024
obr = sp.rate * sp.bits * sp.pchan
Print "File audio: "; wav
Print "Canali: "; sp.pchan
Print "Frequenza: "; sp.rate; " hertz"
Print "Risoluzione: "; sp.bits; " bit"
Print "Durata: "; Time(0, 0, 0, ((lun * 8) / obr) * 1000)
Print
i = sio_start(sh)
If i = 0 Then Error.Raise("Errore !")
buf = New Byte[bufsz]
Repeat
buf.Read(fl, 0, bufsz)
i = sio_write(sh, buf.Data, bufsz)
If i < 0 Then Error.Raise("Errore !")
Write "\rTempo trascorso: \e[40m\e[32m " & Time(0, 0, 0, ((pos * 8) / obr) * 1000) & " \e[0m"
pos += bufsz
If (lun - pos) < 1024 Then bufsz = lun - Seek(fl)
Until Seek(fl) = lun
sio_close(sh)
End