|
|
(Una versione intermedia di uno stesso utente non è mostrata) |
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à====
| |
− | Nel seguente esempio il percorso del file audio va inserito nell'apposito spazio sottostante della console (ovvero nel Terminale, ma in questo caso il percorso deve essere privo di apici). Alla fine dell'esecuzione o anche durante l'esecuzione medesima di un file audio è possibile - sempre con la modalità prima descritta inserire il percorso di un altro file audio ed eseguirlo.
| |
− | Private s As String
| |
− |
| |
− |
| |
− | '''Public''' Sub <FONT color=#B22222>Main()</font>
| |
− |
| |
− | Dim err As Boolean
| |
− | Dim src, lungh As Integer
| |
− | Dim ast As Alurestream
| |
− | Dim l As Byte = 1
| |
− |
| |
− | <FONT Color=gray>' ''Il ciclo dura fino a che non viene inserito nell'apposito spazio della console (o nel Terminale, ma senza apici) il percorso di un file audio:''</font>
| |
− | Do
| |
− | Wait 0.01
| |
− | Loop Until s Begins "/"
| |
− |
| |
− | <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(s).Size
| |
− |
| |
− | If Lower(File.Ext(s)) <> "wav" Then l = 4
| |
− |
| |
− | ast = Alure.CreateStreamFromFile(s, lungh * l, 0)
| |
− |
| |
− | Alure.PlaySourceStream(src, ast, 3, 0)
| |
− |
| |
− | s = Null
| |
− |
| |
− | <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()
| |
− |
| |
− | If s Begins "/" Then
| |
− | Main()
| |
− | Else
| |
− | Quit
| |
− | Endif
| |
− |
| |
− | '''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'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Application_Read()
| |
− |
| |
− | Input s
| |
− |
| |
− | '''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 con l'uso delle Classi ''Alc'' e ''Al'' e caricando direttamente i dati audio grezzi nel buffer audio==
| |
− | In quest'altra modalità non si farà uso della Classe ''Alure'', bensì le risorse delle Classi ''Al'' ed ''Alc'' (con la quale saranno impostati il dispositivo ed il contesto audio). Inoltre si provvederà a caricare direttamente i soli dati audio grezzi del file audio nel Buffer audio impostato con la Classe ''Al''.
| |
− | | |
− | 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'''
| |
− | | |
− | | |
− | | |
− | Il seguente codice è come il precedente con la differenza che esso consente di vedere il tempo trascorso dall'inizio dell'esecuzione, ed è possibile terminare l'esecuzione del file wav, scrivendo nell'apposito spazio inferiore della console uno o più caratteri qualsiasi e premendo il tasto "Invio" della tastiera.
| |
− | 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
| |
− |
| |
− | Private s As String
| |
− |
| |
− |
| |
− | '''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
| |
− | Dim t As Date
| |
− |
| |
− | <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>
| |
− | While DateDiff(t, Time, gb.Millisecond) < iw.durata * 1000
| |
− | <FONT Color=gray>' ''La funzione "Wait" è necessaria per consentire al programma di ricevere il carattere inviato dalla console con il tasto "Invio" della tastiera:''</font>
| |
− | Wait 0.01
| |
− | <FONT Color=gray>' ''Scrive nello "standard output" il tempo trascorso dall'inizio dell'esecuzione del file wav:''</font>
| |
− | Write #File.Out, CStr(Date(0, 0, 0, 0, 0, 0, DateDiff(t, Time, gb.Millisecond))) & "\r"
| |
− | <FONT Color=gray>' ''Se riceve dallo "standard input" uno o più caratteri qualsiasi, esce dal ciclo:''</font>
| |
− | If s <> Null Then Exit
| |
− | Wend
| |
− |
| |
− | <FONT Color=gray>' ''Va in chiusura:''</font>
| |
− | Al.DeleteBuffers(buffer)
| |
− | Al.DeleteSources(src)
| |
− | Alc.DestroyContext(contesto)
| |
− | Alc.CloseDevice(dispositivo)
| |
− | Quit
| |
− |
| |
− | '''End'''
| |
− |
| |
− |
| |
− | '''Public''' Sub Application_Read() <FONT Color=gray>' ''Arresta l'esecuzione''</font>
| |
− |
| |
− | Input s
| |
− |
| |
− | '''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''.
| |