Differenze tra le versioni di "Rilevare in tempo reale la quantità di frame audio processati dalla scheda audio"
Da Gambas-it.org - Wikipedia.
Riga 3: | Riga 3: | ||
In particolare il driver ALSA aggiorna "''hw_ptr''" dopo aver copiato un frame nel framework ALSA. | In particolare il driver ALSA aggiorna "''hw_ptr''" dopo aver copiato un frame nel framework ALSA. | ||
− | Mentre un qualunque programma sta eseguendo un file audio o Midi, è possibile lanciare il codice sottostante (il valore del tempo trascorso mostrato in | + | Mentre un qualunque programma sta eseguendo un file audio o Midi, è possibile lanciare il semplice codice sottostante facendo uso di un Oggetto ''Timer'': |
+ | Private tm As Timer | ||
+ | Private dis As String | ||
+ | |||
+ | |||
+ | '''Public''' Sub Main() | ||
+ | |||
+ | <FONT Color=gray>' ''Verifica quale dispositivo audio è attivo:''</font> | ||
+ | dis = DispositivoAttivo() | ||
+ | |||
+ | With tm = New Timer As "Tempus" | ||
+ | .Delay = 1 | ||
+ | .Start | ||
+ | End With | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Private''' Function DispositivoAttivo() As String | ||
+ | |||
+ | Dim b, c As Byte | ||
+ | Dim s As String | ||
+ | |||
+ | <FONT Color=gray>' ''Verifica se qualche dispositivo audio è presente nel sistema:''</font> | ||
+ | If Dir("/proc/asound", "card*", gb.Directory).Count == 0 Then Error.Raise("Dispositivo audio assente !") | ||
+ | |||
+ | Repeat | ||
+ | For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory) | ||
+ | If InStr(File.Load("/proc/asound/card" & CStr(b) &/ s &/ "sub0/status"), "RUNNING") > 0 Then c = 1 | ||
+ | Next | ||
+ | Inc b | ||
+ | Until c == 1 | ||
+ | |||
+ | Return CStr(b - 1) &/ s | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | '''Public''' Sub Tempus_Timer() | ||
+ | |||
+ | Dim s As String | ||
+ | |||
+ | s = File.Load("/proc/asound/card" & dis &/ "sub0/status") | ||
+ | |||
+ | If InStr(s, "RUNNING") > 0 Then Write "\r" & Split(s, gb.NewLine)[8] | ||
+ | |||
+ | '''End''' | ||
+ | |||
+ | |||
+ | In questo secondo esempio viene mostrato anche il tempo trascorso sulla base dei frame audio processati (per ora il valore del tempo trascorso mostrato in console è valido eseguendo un file di formato WAV o un file Midi): | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Riga 65: | Riga 114: | ||
Repeat | Repeat | ||
For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory) | For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory) | ||
− | If File.Load("/proc/asound/card" & CStr(b) &/ s & " | + | If InStr(File.Load("/proc/asound/card" & CStr(b) &/ s &/ "sub0/status"), "RUNNING") > 0 Then c = 1 |
Next | Next | ||
Inc b | Inc b |
Versione delle 15:27, 6 ago 2020
Per rilevare in tempo reale la quantità di frame audio processati dalla scheda audio, si verificherà in continuazione il valore associato all'elemento "hw_ptr" nel file "/proc/asound/card.../pcm...p/sub0/status".
In particolare il driver ALSA aggiorna "hw_ptr" dopo aver copiato un frame nel framework ALSA.
Mentre un qualunque programma sta eseguendo un file audio o Midi, è possibile lanciare il semplice codice sottostante facendo uso di un Oggetto Timer:
Private tm As Timer Private dis As String Public Sub Main() ' Verifica quale dispositivo audio è attivo: dis = DispositivoAttivo() With tm = New Timer As "Tempus" .Delay = 1 .Start End With End Private Function DispositivoAttivo() As String Dim b, c As Byte Dim s As String ' Verifica se qualche dispositivo audio è presente nel sistema: If Dir("/proc/asound", "card*", gb.Directory).Count == 0 Then Error.Raise("Dispositivo audio assente !") Repeat For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory) If InStr(File.Load("/proc/asound/card" & CStr(b) &/ s &/ "sub0/status"), "RUNNING") > 0 Then c = 1 Next Inc b Until c == 1 Return CStr(b - 1) &/ s End Public Sub Tempus_Timer() Dim s As String s = File.Load("/proc/asound/card" & dis &/ "sub0/status") If InStr(s, "RUNNING") > 0 Then Write "\r" & Split(s, gb.NewLine)[8] End
In questo secondo esempio viene mostrato anche il tempo trascorso sulla base dei frame audio processati (per ora il valore del tempo trascorso mostrato in console è valido eseguendo un file di formato WAV o un file Midi):
Public Sub Main() Dim s, pr, dis As String Dim fl As File Dim i, hz, fr, mid As Integer Dim can, bla, bit As Short s = "/percorso/del/file" Print "File audio: "; s fl = Open s For Read i = Lof(fl) Read #fl, mid If mid == 1684558925 Then Print "Dimensione: "; i; " byte" i = 2147483647 can = 2 hz = 44100 bla = 4 bit = 16 Else i -= 44 Print "Dati audio: "; i; " byte" Seek fl, InStr(fl.Load(s), "fmt ") + 9 Read #fl, can Print "Canali: "; can Read #fl, hz Print "Frequenza: "; hz Seek #fl, 32 Read #fl, bla i /= bla pr = CStr(i) Read #fl, bit Print "Risoluzione: "; bit; " bit" Endif fl.Close dis = DispositivoAttivo() Print Repeat s = File.Load("/proc/asound/card" & dis &/ "sub0/status") If s == "closed\n" Then Break fr = Val(Scan(s, "*hw_ptr*: *\n*")[2]) Write "\r\e[0mFrame da processare: " & pr & " | Frame processati: \e[34m\e[1m" & CStr(fr) & "\e[0m | Tempo trascorso: \e[35m" & CStr(Date(0, 0, 0, 0, 0, 0, ((fr * 8 * bla) / (hz * can * bit)) * 1000)) Until fr >= i End Private Function DispositivoAttivo() As String ' Verifica quale dispositivo audio è attivo Dim b, c As Byte Dim s As String ' Verifica se qualche dispositivo audio è presente nel sistema: If Dir("/proc/asound", "card*", gb.Directory).Count == 0 Then Error.Raise("Dispositivo audio assente !") Repeat For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory) If InStr(File.Load("/proc/asound/card" & CStr(b) &/ s &/ "sub0/status"), "RUNNING") > 0 Then c = 1 Next Inc b Until c == 1 Return CStr(b - 1) &/ s End
Pagina in costruzione !