Differenze tra le versioni di "Eseguire un file WAV con le funzioni esterne del API di LibAo"

Da Gambas-it.org - Wikipedia.
Riga 47: Riga 47:
 
   
 
   
 
   Dim device As Pointer
 
   Dim device As Pointer
   Dim default_driver, buf_size, i, err As Integer
+
   Dim default_driver, i, err As Integer
 
   Dim buffer As Byte[]
 
   Dim buffer As Byte[]
 
   Dim fileWAV As String
 
   Dim fileWAV As String

Versione delle 17:59, 4 feb 2014

Libao è una libreria multi-piattaforma che permette ai programmi di inviare dati audio PCM ai dispositivi audio nativi su una vasta gamma di piattaforme.

Per l'uso delle risorse della libreria libao bisognerà richiamare nel proprio applicativo Gambas la libreria attualmente alla versione: "libao.so.4.0.0" .

Di seguito un possibile codice per eseguire un file audio WAV con le risorse della libreria libao. Nell'esempio si supporrà che il file wav abbia una frequenza di campionamento a 44100 hertz, una risoluzione a 16bit e due canali:

Public Struct ao_sample_format
  bits As Integer             ' bits per sample
  rate As Integer             ' samples per second (in a single channel)
  channels As Integer         ' number of audio channels
  byte_format As Integer      ' Byte ordering in sample, see constants below
  matrix As Pointer           ' input channel location/ordering
End Struct

Private ao_sf As Struct Ao_sample_format


Library "libao:4.0.0"

Private Const AO_FMT_LITTLE As Integer = 1

' void ao_initialize(void)
' library setup
Private Extern ao_initialize()

' int ao_default_driver_id(void)
' driver information
Private Extern ao_default_driver_id() As Integer

' ao_device * ao_open_live(int driver_id, ao_sample_format *format, ao_option *option)
' driver information
Private Extern ao_open_live(driver_id As Integer, fmt As Ao_sample_format, option As Pointer) As Pointer

' int ao_play(ao_device *device, char *output_samples, uint_32 num_bytes)
' Write samples to the device. Channels are interleaved. 1 indicates success.
Private Extern ao_play(device As Pointer, output_samples As Byte[], num_bytes As Integer) As Integer

' int ao_close(ao_device *device)
' Chiude il dispositivo audio
Private Extern ao_close(device As Pointer) As Integer

' void ao_shutdown(void)
' library teardown
Private Extern ao_shutdown()


Public Sub Main()

  Dim device As Pointer
  Dim default_driver, i, err As Integer
  Dim buffer As Byte[]
  Dim fileWAV As String
  Dim fl As File


   fileWAV = "/percorso/del/file.wav"

   fl = Open fileWAV For Read
 

' Inizializza la libreria 'libao':
   ao_initialize()
   
' Imposta il driver audio come predefinito:
   default_driver = ao_default_driver_id()

' Imposta le caratteristiche del file wav caricato:
   With ao_sf
     .bits = 16
     .channels = 2
     .rate = 44100
     .byte_format = AO_FMT_LITTLE
   End With  
  
' Apre il driver:
   device = ao_open_live(default_driver, VarPtr(ao_sf), Null)
   If IsNull(device) Then Error.Raise("Errore nell'apertura del dispositivo audio !")
   
    buffer = New Byte[Stat(fileWAV).Size]
   
' Ciclo per l'elaborazione dell'audio:
   For i = 1 To (buffer.Count) / 1024

' Carica i dati audio nel vettore di tipo "Byte[]":
     buffer.Read(fl, 0, 1024)

' Esegue i dati audio:
     err = ao_play(device, buffer, 1024)
     If err < 1 Then Error.Raise("Errore nell'esecuzione dei dati audio !")
     
   Next

  
' Va in chiusura:
   fl.Close
   buffer.Clear()
   ao_close(device)
   ao_shutdown()

End


Riferimenti

[1] L'API di LibAo