|
|
(4 versioni intermedie di uno stesso utente non sono mostrate) |
Riga 1: |
Riga 1: |
− | Il componente ''gb.openal'' utilizza le risorse dell'[http://it.wikipedia.org/wiki/Application_programming_interface API] di [http://connect.creativelabs.com/openal/default.aspx Openal].
| + | #REDIRECT [[La_gestione_dei_file_audio_mediante_il_componente_gb.openal]] |
− | | |
− | E' possibile eseguire un file audio sia mediante le risorse delle Classi ''Al'' ed ''Alure'' |[[#Note|1]]| del componente ''gb.openal'', sia solo con le Classi ''Alc'' e ''Al''.
| |
− | | |
− | | |
− | | |
− | ==Eseguire un file audio con le risorse della Classe ''Al'' e della Classe ''Alure''==
| |
− | Vi sono ''almeno'' tre modalità - sia in ambiente garfico che a ''riga di comando'' - per eseguire un file audio mediante le risorse della Classe ''Al'' e della Classe ''Alure'' del componente ''gb.openal''.
| |
− | <BR>E' possibile riprodurre file audio dei seguenti tipi:
| |
− | * WAV;
| |
− | * MP3;
| |
− | * OGG.
| |
− | | |
− | | |
− | ===1<SUP>a</sup> modalità===
| |
− | Private src As Integer[]
| |
− | Private ast As Alurestream
| |
− |
| |
− |
| |
− | '''Public''' Sub Form_Open()
| |
− |
| |
− | Dim err As Boolean
| |
− |
| |
− | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
| |
− | err = Alure.InitDevice(Null, Null)
| |
− | If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Button1_Click() <FONT color=gray>' ''Avvia l'esecuzione del file audio''</font>
| |
− |
| |
− | 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)
| |
− |
| |
− | <FONT color=gray>' ''Individua la lunghezza del file audio caricato da eseguire:''</font>
| |
− | lungh = Stat(fileAudio).Size
| |
− |
| |
− | <FONT color=gray>' ''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:''</font>
| |
− | If Lower(File.Ext(fileAudio)) <> "wav" Then l = 4
| |
− |
| |
− | ast = Alure.CreateStreamFromFile(fileAudio, lungh * l, 0)
| |
− |
| |
− | <FONT color=gray>' ''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.''</font>
| |
− | Alure.PlaySourceStream(src[0], ast, 3, 0)
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Button2_Click() <FONT color=gray>' ''Arresta l'esecuzione del file audio''</font>
| |
− |
| |
− | If IsNull(ast) Then Return
| |
− | Alure.StopSource(src[0])
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Button3_Click() <FONT color=gray>' ''Arresta l'esecuzione del file audio e chiude la finestra del programma''</font>
| |
− |
| |
− | If IsNull(ast) = False Then
| |
− | Alure.DestroyStream(ast)
| |
− | al.DeleteSources(src)
| |
− | Alure.StopSource(src[0])
| |
− | Endif
| |
− |
| |
− | Alure.ShutdownDevice()
| |
− |
| |
− | Me.Close
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | ===2<SUP>a</sup> modalità===
| |
− | Private source As Integer
| |
− |
| |
− |
| |
− | '''Public''' Sub Form_Open()
| |
− |
| |
− | Dim err As Boolean
| |
− |
| |
− | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
| |
− | err = Alure.InitDevice(Null, Null)
| |
− | If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Button1_Click() <FONT color=gray>' ''Avvia l'esecuzione del file audio''</font>
| |
− |
| |
− | Dim buffer As Integer
| |
− |
| |
− |
| |
− | buffer = alure.CreateBufferFromFile("''/percorso/del/file/audio''")
| |
− |
| |
− | <FONT color=gray>' ''Crea una sorgente sonora:''</font>
| |
− | source = al.GenSources(1)[0]
| |
− |
| |
− | <FONT color=gray>' ''Viene utilizzata la variabile "buffer" per riempire la sorgente.''
| |
− | ' ''Il secondo argomento indica al buffer di fornire campioni sonori:''</font></font>
| |
− | al.Sourcei(source, al.BUFFER, buffer)
| |
− |
| |
− | <FONT color=gray>' ''Esegue il flusso di dati audio.''</font>
| |
− | al.SourcePlay(source)
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub ToggleButton1_Click()
| |
− |
| |
− | If ToggleButton1.Value
| |
− | <FONT color=gray>' ''Mette in pausa l'esecuzione del file audio''</font>
| |
− | al.SourcePause(source)
| |
− | Else
| |
− | <FONT color=gray>' ''Fa proseguire l'esecuzione del file audio''</font>
| |
− | al.SourcePlay(source)
| |
− | Endif
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Button2_Click() <FONT color=gray>' ''Arresta l'esecuzione del file audio''</font>
| |
− |
| |
− | al.SourceStop(source)
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | ===3<SUP>a</sup> modalità===
| |
− | Private ags As Integer
| |
− |
| |
− |
| |
− | '''Public''' Sub Button1_Click() <FONT color=gray>' ''Avvia l'esecuzione del file audio''</font>
| |
− |
| |
− | Dim err As Boolean
| |
− | Dim fileAudio As String = "''/percorso/del/file/audio''"
| |
− | Dim agb As Integer
| |
− |
| |
− |
| |
− | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
| |
− | err = Alure.InitDevice(Null, Null)
| |
− | If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
| |
− |
| |
− | <FONT color=gray>' ''Genera le sorgenti sonore ed i buffer:''</font>
| |
− | 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)
| |
− |
| |
− | <FONT color=gray>' ''Esegue il file audio:''</font>
| |
− | al.SourcePlay(ags)
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub ToggleButton1_Click()
| |
− |
| |
− | If ToggleButton1.Value
| |
− | <FONT color=gray>' ''Mette in pausa l'esecuzione del file audio''</font>
| |
− | al.SourcePause(ags)
| |
− | Else
| |
− | <FONT color=gray>' ''Fa proseguire l'esecuzione del file audio''</font>
| |
− | al.SourcePlay(ags)
| |
− | Endif
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Button2_Click() <FONT color=gray>' ''Arresta l'esecuzione del file audio''</font>
| |
− |
| |
− | 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.
| |
− | | |
− | E' possibile porre in ''Pausa'' l'esecuzione immettendo nel Terminale o nell'apposito spazio della console il carattere "p" e quindi premendo il tasto ''Invio''. Per riprendere l'esecuzione basterà premere il solo tasto "''Invio''". E' altresì possibile arrestare l'esecuzione immettendo nel Terminale o nell'apposito spazio della console uno o più caratteri (ovviamente <SPAN Style="text-decoration:underline">diversi</span> dalla lettera "p"), quindi premendo il tasto ''Invio''.
| |
− | | |
− | | |
− | ====1<SUP>a</sup> modalità====
| |
− | Private s As String
| |
− |
| |
− |
| |
− | '''Public''' Sub <FONT color=#B22222>Main()</font>
| |
− |
| |
− | Dim err As Boolean
| |
− | Dim fileAudio As String
| |
− | Dim src, lungh As Integer
| |
− | Dim ast As Alurestream
| |
− | Dim l As Byte = 1
| |
− |
| |
− | fileAudio = "''/percorso/del/file/audio''"
| |
− |
| |
− | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
| |
− | 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)
| |
− |
| |
− | <FONT color=gray>' ''Inviando il carattere "p" dal Terminale o dalla console, l'esecuzione è posta in "Pausa",''
| |
− | ' ''inviando ogni altro carattere essa viene terminata:''</font>
| |
− | <FONT color=#B22222>Do</font>
| |
− | Input s
| |
− | If s = "p" Then Pausa(src)
| |
− | <FONT color=#B22222>Loop Until s <> Null</font>
| |
− |
| |
− | Alure.DestroyStream(ast)
| |
− | al.DeleteSources([src])
| |
− | Alure.StopSource(src)
| |
− | Alure.ShutdownDevice()
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Private''' Procedure Pausa(sAl As Integer)
| |
− |
| |
− | Dim ripresa As String
| |
− |
| |
− | al.SourcePause(sAl)
| |
− | Print "Pausa !"
| |
− |
| |
− | <FONT color=gray>' ''Per riprendere l'esecuzione, è sufficiente premere il tasto "Invio":''</font>
| |
− | Input ripresa
| |
− | al.SourcePlayv([sal])
| |
− |
| |
− | Print "Riprende esecuzione."
| |
− | s = Null
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | | |
− | ====2<SUP>a</sup> modalità====
| |
− | Private s As String
| |
− |
| |
− |
| |
− | '''Public''' Sub <FONT color=#B22222>Main()</font>
| |
− |
| |
− | Dim err As Boolean
| |
− | Dim buffer, source As Integer
| |
− |
| |
− | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
| |
− | err = Alure.InitDevice(Null, Null)
| |
− | If err = False Then Error.Raise("Impossibile inizializzare la libreria 'Alure' !")
| |
− |
| |
− | buffer = alure.CreateBufferFromFile("''/percorso/del/file/audio''")
| |
− |
| |
− | <FONT color=gray>' ''Crea una sorgente sonora:''</font>
| |
− | source = al.GenSources(1)[0]
| |
− |
| |
− | <FONT color=gray>' ''Viene utilizzata la variabile "buffer" per riempire la sorgente.''
| |
− | ' ''Il secondo argomento indica al buffer di fornire campioni sonori:''</font></font>
| |
− | al.Sourcei(source, al.BUFFER, buffer)
| |
− |
| |
− | <FONT color=gray>' ''Esegue il flusso di dati audio.''</font>
| |
− | al.SourcePlay(source)
| |
− |
| |
− | <FONT color=gray>' ''Inviando il carattere "p" dal Terminale o dalla console, l'esecuzione è posta in "Pausa",''
| |
− | ' ''inviando ogni altro carattere essa viene terminata:''</font>
| |
− | <FONT color=#B22222>Do</font>
| |
− | Input s
| |
− | If s = "p" Then Pausa(source)
| |
− | <FONT color=#B22222>Loop Until s <> Null</font>
| |
− |
| |
− | al.DeleteBuffers([buffer])
| |
− | al.DeleteSources([source])
| |
− | Alure.StopSource(source)
| |
− | Alure.ShutdownDevice()
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Private''' Procedure Pausa(sAl As Integer)
| |
− |
| |
− | Dim ripresa As String
| |
− |
| |
− | al.SourcePause(sAl)
| |
− | Print "Pausa !"
| |
− |
| |
− | <FONT color=gray>' ''Per riprendere l'esecuzione, è sufficiente premere il tasto "Invio":''</font>
| |
− | Input ripresa
| |
− | al.SourcePlay(sAl)
| |
− |
| |
− | Print "Riprende esecuzione."
| |
− | s = Null
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | | |
− | ====3<SUP>a</sup> modalità====
| |
− | Private s As String
| |
− |
| |
− |
| |
− | '''Public''' Sub <FONT color=#B22222>Main()</font>
| |
− |
| |
− | Dim err As Boolean
| |
− | Dim fileAudio As String
| |
− | Dim agb, ags As Integer
| |
− |
| |
− | fileAudio = "''/percorso/del/file/audio''"
| |
− |
| |
− | <FONT color=gray>' ''Inizializza la libreria "Alure":''</font>
| |
− | 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)
| |
− |
| |
− | <FONT color=gray>' ''Inviando il carattere "p" dal Terminale o dalla console, l'esecuzione è posta in "Pausa",''
| |
− | ' ''inviando ogni altro carattere essa viene terminata:''</font>
| |
− | <FONT color=#B22222>Do</font>
| |
− | Input s
| |
− | If s = "p" Then Pausa(ags)
| |
− | <FONT color=#B22222>Loop Until s <> Null</font>
| |
− |
| |
− | al.DeleteBuffers([agb])
| |
− | al.DeleteSources([ags])
| |
− | Alure.StopSource(ags)
| |
− | Alure.ShutdownDevice()
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Private''' Procedure Pausa(sAl As Integer)
| |
− |
| |
− | Dim ripresa As String
| |
− |
| |
− | al.SourcePause(sAl)
| |
− | Print "Pausa !"
| |
− |
| |
− | <FONT color=gray>' ''Per riprendere l'esecuzione, è sufficiente premere il tasto "Invio":''</font>
| |
− | Input ripresa
| |
− | al.SourcePlay(sAl)
| |
− |
| |
− | Print "Riprende esecuzione."
| |
− | s = Null
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | | |
− | ==Eseguire un file audio senza uso della Classe ''Alure'' e caricando direttamente i dati audio grezzi nel buffer audio==
| |
− | In quest'altra modalità non si farà uso della Classe ''Alure'' e si provvederà a caricare i dati audio grezzi del file audio nel Buffer audio impostato con la Classe ''Al''. Inoltre il dispositivo ed il contesto audio saranno impostati mediante la Classe ''Alc'' .
| |
− | | |
− | Mostriamo un esempio con un file di formato WAV:
| |
− | Public Struct InfoWAV
| |
− | fileWAV As String
| |
− | canali As Short
| |
− | frequenza As Integer
| |
− | bit As Short
| |
− | block_align As Short
| |
− | durata As Float
| |
− | sonora As Byte[]
| |
− | End Struct
| |
− |
| |
− |
| |
− | '''Public''' Sub Main()
| |
− |
| |
− | Dim dispositivo As AlcDevice
| |
− | Dim contesto As AlcContext
| |
− | Dim src As Integer[]
| |
− | Dim buffer As Integer[]
| |
− | Dim err As Boolean
| |
− | Dim iw As New InfoWAV
| |
− | Dim Formato_audio As Short
| |
− |
| |
− | <FONT Color=gray>' ''Imposta il dispositivo ed il contesto audio con la Classe "Alc":''</font>
| |
− | dispositivo = Alc.OpenDevice(Null)
| |
− | contesto = Alc.CreateContext(dispositivo)
| |
− |
| |
− | err = contesto.MakeCurrent()
| |
− | If err = False Then Error.Raise("Impossibile creare il contesto audio !")
| |
− |
| |
− | src = Al.GenSources(1)
| |
− |
| |
− | <FONT Color=gray>' ''Imposta il buffer audio:''</font>
| |
− | buffer = Al.GenBuffers(1)
| |
− |
| |
− | iw.fileWAV = "''/percorso/del/file.wav''"
| |
− |
| |
− | datiAudio(iw)
| |
− |
| |
− | Select Case iw.canali + iw.bit
| |
− | Case 9
| |
− | Formato_audio = 4352
| |
− | Case 10
| |
− | Formato_audio = 4354
| |
− | Case 17
| |
− | Formato_audio = 4353
| |
− | Case 18
| |
− | Formato_audio = 4355
| |
− | End Select
| |
− |
| |
− | <FONT Color=gray>' ''I dati audio grezzi del file wav sono caricati nel buffer audio:''</font>
| |
− | Al.BufferData(buffer[0], Formato_audio, iw.sonora.ToString(0, iw.sonora.Count), iw.sonora.Count, iw.frequenza)
| |
− |
| |
− | <FONT Color=gray>' ''Connette il buffer audio al sorgente audio:''</font>
| |
− | Al.Sourcei(src[0], Al.BUFFER, buffer[0])
| |
− |
| |
− | <FONT Color=gray>' ''Esegue il sorgente audio:''</font>
| |
− | Al.SourcePlay(src[0])
| |
− |
| |
− | <FONT Color=gray>' ''Consente l'esecuzione per l'intera durata del brano:''</font>
| |
− | Sleep iw.durata
| |
− |
| |
− | <FONT Color=gray>' ''Va in chiusura:''</font>
| |
− | Al.DeleteBuffers(buffer)
| |
− | Al.DeleteSources(src)
| |
− | Alc.DestroyContext(contesto)
| |
− | Alc.CloseDevice(dispositivo)
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Private''' Function datiAudio(iwav As InfoWAV)
| |
− |
| |
− | Dim fl As File
| |
− | Dim d As Short
| |
− |
| |
− | Print "File wav caricato:";; iwav.fileWAV
| |
− |
| |
− | <FONT Color=gray>' ''Carica il file audio Wav:''</font>
| |
− | fl = Open iwav.fileWAV For Read
| |
− |
| |
− | d = InStr(File.Load(iwav.fileWAV), "data")
| |
− |
| |
− | iwav.sonora = New Byte[Lof(fl) - (d + 7)]
| |
− |
| |
− | <FONT Color=gray>' ''Spostiamo il puntatore all'interno del flusso del file sul primo byte successivo all'header del file wav,''
| |
− | ' ''per caricare tutti i dati audio grezzi:''</font>
| |
− | Seek #fl, d + 7
| |
− | iwav.sonora.Read(fl, 0, Lof(fl) - (d + 7))
| |
− |
| |
− | <FONT Color=gray>' ''Leggiamo il numero dei canali:''</font>
| |
− | Seek #fl, 22
| |
− | iwav.canali = Read #fl As Short
| |
− | Print "Numero canali:";; iwav.canali
| |
− |
| |
− | <FONT Color=gray>' ''Leggiamo la frequenza di campionamento dei dati audio:''</font>
| |
− | Seek #fl, 24
| |
− | iwav.frequenza = Read #fl As Integer
| |
− | Print "Frequenza di campionamento: hz";; iwav.frequenza
| |
− |
| |
− | <FONT Color=gray>' ''Leggiamo il valore del "block align":''</font>
| |
− | Seek #fl, 32
| |
− | iwav.block_align = Read #fl As Short
| |
− |
| |
− | <FONT Color=gray>' ''Leggiamo la risoluzione bit del campionamento:''</font>
| |
− | Seek #fl, 34
| |
− | iwav.bit = Read #fl As Short
| |
− | Print "Risoluzione:";; iwav.bit;; "bit"
| |
− |
| |
− | <FONT Color=gray>' ''Calcoliamo la durata del brano audio:''</font>
| |
− | iwav.durata = (iwav.sonora.Count / iwav.block_align) / iwav.frequenza
| |
− | Print "Durata esecuzione:";; CStr(Date(0, 0, 0, 0, 0, 0, iwav.durata * 1000))
| |
− |
| |
− | fl.Close
| |
− |
| |
− | '''End'''
| |
− | | |
− | | |
− | | |
− | | |
− | =Note=
| |
− | [1] La Classe ''Alure'' del componente ''gb.openal'' consente di gestire le funzioni di [http://kcat.strangesoft.net/alure.html ALURE], che è una libreria di supporto di ''Openal''.
| |