Differenze tra le versioni di "La gestione mediante il componente gb.openal"

Da Gambas-it.org - Wikipedia.
Riga 194: Riga 194:
 
  '''Public''' Sub <FONT color=#B22222>Main()</font>
 
  '''Public''' Sub <FONT color=#B22222>Main()</font>
 
   
 
   
  Dim err As Boolean
+
  Dim err As Boolean
  Dim fileAudio As String = "''/percorso/del/file/audio''"
+
  Dim fileAudio, s As String
   Dim src, lungh As Integer
+
  Dim src, lungh As Integer
   Dim ast As Alurestream
+
  Dim ast As Alurestream
   Dim l As Byte = 1
+
  Dim l As Byte = 1
 +
   
 +
  fileAudio = "''/percorso/del/file/audio''"
 +
 
 +
   err = Alure.InitDevice(Null, Null)
 +
  If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
 +
    
 +
   src = Al.GenSources(1)[0]
 +
 
 +
  lungh = Stat(fileAudio).Size
 
   
 
   
 +
  If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4
 
   
 
   
    err = Alure.InitDevice(Null, Null)
+
  ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)
    If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
 
 
   
 
   
    src = Al.GenSources(1)[0]
+
  Alure.PlaySourceStream(src, ast, 3, 0)
+
 
    lungh = Stat(fileAudio).Size
+
  <FONT color=gray>Arresta l'esecuzione del file audio:''</font>
+
  <FONT color=#B22222>Do</font>
    If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4
+
    Input s
+
  <FONT color=#B22222>Loop Until s <> Null</font>
    ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)
 
 
    Alure.PlaySourceStream(src, ast, 3, 0)
 
   
 
    <FONT color=#B22222>While True</font>
 
      Sleep 0.01
 
    <FONT color=#B22222>Wend</font>
 
 
   
 
   
 +
  Alure.DestroyStream(ast)
 +
  al.DeleteSources([src])
 +
  Alure.StopSource(src)
 +
  Alure.ShutdownDevice()
 +
 
 
  '''End'''
 
  '''End'''
  
Riga 225: Riga 232:
 
   
 
   
 
   Dim err As Boolean
 
   Dim err As Boolean
   Dim fileAudio As String = "''/percorso/del/file/audio''"
+
   Dim fileAudio, s As String
 
   Dim agb, ags As Integer
 
   Dim agb, ags As Integer
+
 
 +
  fileAudio = "''/percorso/del/file/audio''"
 
    
 
    
 
   err = Alure.InitDevice(Null, Null)
 
   err = Alure.InitDevice(Null, Null)
Riga 243: Riga 251:
 
   al.SourcePlay(ags)
 
   al.SourcePlay(ags)
 
   
 
   
   <FONT color=#B22222>While True</font>
+
 
     Sleep 0.01
+
<FONT color=gray>Arresta l'esecuzione del file audio:''</font>
   <FONT color=#B22222>Wend</font>
+
   <FONT color=#B22222>Do</font>
+
     Input s
 +
   <FONT color=#B22222>Loop Until s <> Null</font>
 +
 
 +
  al.DeleteBuffers([agb])
 +
  al.DeleteSources([ags])
 +
  Alure.StopSource(ags)
 +
  Alure.ShutdownDevice()
 +
     
 
  '''End'''
 
  '''End'''
 +
  
  

Versione delle 06:57, 21 ago 2015

Con la revisione 5753 di Gambas-3 è stato aggiunto il componente: gb.openal che utilizza le risorse dell'API di Openal.

E' possibile eseguire un file audio mediante le risorse delle Classi Al ed Alure |1| del componente gb.openal.


Eseguire un file audio con le risorse della Classe Al e della Classe Alure

Vi sono almeno tre modalità per eseguire un file audio mediante le risorse della Classe Al e della Classe Alure del componente gb.openal.
E' possibile riprodurre file audio dei seguenti tipi:

  • WAV;
  • MP3;
  • OGG.


1a modalità

Private src As Integer[]
Private ast As Alurestream


Public Sub Form_Open()

  Dim err As Boolean

' Inizializza la libreria "Alure":
   err = Alure.InitDevice(Null, Null)
   If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")

End


Public Sub Button1_Click()    ' Avvia l'esecuzione del file audio

  Dim fileAudio As String = "/percorso/del/file/audio"
  Dim lungh As Integer
  Dim l As Byte = 1

   If IsNull(src) = False Then al.DeleteSources(src)
   
   src = Al.GenSources(1)

' Individua la lunghezza del file audio caricato da eseguire:
   lungh = Stat(fileAudio).Size

' Se il file audio è un "mp3" o un "ogg", allora il valore della variabile "lungh"
' deve essere moltiplicato almeno per 4, altrimenti l'esecuzione audio terminerà anticipatamente:
   If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4

   ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)

' Esegue il flusso di dati audio.
' Il terzo parametro della funzione rappresenta il numero dei buffer utilizzati da accodare alla fonte di "OpenAL".
' Ogni buffer verrà riempito con la lunghezza del "chunk" specificato quando il flusso è stato creato.
' Tale valore nell'esecuzione di un file audio deve essere di almeno 2.
   Alure.PlaySourceStream(src[0], ast, 3, 0)

End


Public Sub Button2_Click()    ' Arresta l'esecuzione del file audio

  If IsNull(ast) Then Return
  Alure.StopSource(src[0])
    
End


Public Sub Button3_Click()    ' Arresta l'esecuzione del file audio e chiude la finestra del programma
      
  If IsNull(ast) = False Then
    Alure.DestroyStream(ast)
    al.DeleteSources(src)
    Alure.StopSource(src[0])
  Endif
   
  Alure.ShutdownDevice()
 
  Me.Close
 
End


2a modalità

Private source As Integer


Public Sub Form_Open()

  Dim err As Boolean

' Inizializza la libreria "Alure":
   err = Alure.InitDevice(Null, Null)
   If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")

End


Public Sub Button1_Click()    ' Avvia l'esecuzione del file audio

 Dim buffer As Integer

 
  buffer = alure.CreateBufferFromFile("/percorso/del/file/audio")
 
' Crea una sorgente sonora:
  source = al.GenSources(1)[0]
 
' Viene utilizzata la variabile "buffer" per riempire la sorgente.
' Il secondo argomento indica  al buffer di fornire campioni sonori:</font>
  al.Sourcei(source, al.BUFFER, buffer)
 
' Esegue il flusso di dati audio.
  al.SourcePlay(source)

End


Public Sub ToggleButton1_Click()

   If ToggleButton1.Value
' Mette in pausa l'esecuzione del file audio
     al.SourcePause(source)
   Else
' Fa proseguire l'esecuzione del file audio
     al.SourcePlay(source)
   Endif

End


Public Sub Button2_Click()    ' Arresta l'esecuzione del file audio

   al.SourceStop(source)

End


3a modalità

Private ags As Integer
 

Public Sub Button1_Click()    ' Avvia l'esecuzione del file audio
 
 Dim err As Boolean
 Dim fileAudio As String = "/percorso/del/file/audio"
 Dim agb As Integer


' Inizializza la libreria "Alure":
  err = Alure.InitDevice(Null, Null)
  If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")

' Genera le sorgenti sonore ed i buffer:
  ags = al.GenSources(1)[0]

  agb = al.GenBuffers(ags)[0]

  err = alure.BufferDataFromFile(fileAudio, agb)
  If err = False Then Error.Raise("Impossibile creare un buffer-data dal file audio !")

  al.Sourcei(ags, al.BUFFER, agb)

' Esegue il file audio:
  al.SourcePlay(ags)

End


Public Sub ToggleButton1_Click()

  If ToggleButton1.Value
' Mette in pausa l'esecuzione del file audio
    al.SourcePause(ags)
  Else
' Fa proseguire l'esecuzione del file audio
    al.SourcePlay(ags)
  Endif

End


Public Sub Button2_Click()    ' Arresta l'esecuzione del file audio

  al.SourceStop(ags)

End


Caso di applicazione a riga di comando

Nel caso in cui l'applicazione per l'esecuzione di file audio sia stata realizzata senza componenti grafici, e dunque a riga di comando, al termine del codice sarà assolutamente necessario prevedere un ciclo. Attualmente si è constatato che questa soluzione è possibile solo per la 1a e la 3a modalità.


1a modalità

Public Sub Main()

 Dim err As Boolean
 Dim fileAudio, s As String
 Dim src, lungh As Integer
 Dim ast As Alurestream
 Dim l As Byte = 1
   
  fileAudio = "/percorso/del/file/audio"
 
  err = Alure.InitDevice(Null, Null)
  If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
  
  src = Al.GenSources(1)[0]
  
  lungh = Stat(fileAudio).Size

  If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4

  ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)

  Alure.PlaySourceStream(src, ast, 3, 0)
  
Arresta l'esecuzione del file audio:
  Do
    Input s
  Loop Until s <> Null

  Alure.DestroyStream(ast)
  al.DeleteSources([src])
  Alure.StopSource(src)
  Alure.ShutdownDevice()
  
End


2a modalità

Public Sub Main()

 Dim err As Boolean
 Dim fileAudio, s As String
 Dim agb, ags As Integer
 
  fileAudio = "/percorso/del/file/audio" 
  
  err = Alure.InitDevice(Null, Null)
  If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")

  ags = al.GenSources(1)[0]

  agb = al.GenBuffers(ags)[0]

  err = alure.BufferDataFromFile(fileAudio, agb)
  If err = False Then Error.Raise("Impossibile creare un buffer-data dal file audio !")

  al.Sourcei(ags, al.BUFFER, agb)

  al.SourcePlay(ags)

  
Arresta l'esecuzione del file audio:
  Do
    Input s
  Loop Until s <> Null
  
  al.DeleteBuffers([agb])
  al.DeleteSources([ags])
  Alure.StopSource(ags)
  Alure.ShutdownDevice()
      
End



Note

[1] La Classe Alure del componente gb.openal consente di gestire le funzioni di ALURE, che è una libreria di supporto di Openal.