Differenze tra le versioni di "Rilevare in tempo reale la quantità di frame audio processati dalla scheda audio"
Riga 50: | Riga 50: | ||
s = File.Load("/proc/asound/card" & dis &/ "sub0/status") | s = File.Load("/proc/asound/card" & dis &/ "sub0/status") | ||
− | If InStr(s, "RUNNING") > 0 Then Write "\r" & Split(s, gb.NewLine)[8] | + | If InStr(s, "RUNNING") > 0 Then |
+ | Write "\r" & Split(s, gb.NewLine)[8] | ||
+ | Else | ||
+ | fl.Close | ||
+ | Endif | ||
'''End''' | '''End''' | ||
Riga 100: | Riga 104: | ||
s = File.Load("/proc/asound/card" & dis &/ "sub0/status") | s = File.Load("/proc/asound/card" & dis &/ "sub0/status") | ||
− | If InStr(s, "RUNNING") > 0 Then Write "\r" & Split(s, gb.NewLine)[8] | + | If InStr(s, "RUNNING") > 0 Then |
+ | Write "\r" & Split(s, gb.NewLine)[8] | ||
+ | Else | ||
+ | tm.Stop | ||
+ | Endif | ||
'''End''' | '''End''' | ||
Riga 106: | Riga 114: | ||
===Usando un ciclo e mostrando anche il tempo trascorso=== | ===Usando un ciclo e mostrando anche il tempo trascorso=== | ||
− | In questo esempio viene utilizzato un ciclo e 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) | + | In questo esempio viene utilizzato un ciclo e 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). |
+ | <BR>Va chiarito che il file audio o Midi da caricare nella variabile "s" di tipo Stringa, sarà il medesimo che si sta facendo eseguire con un qualsiasi programma di lettura audio/Midi. | ||
'''Public''' Sub Main() | '''Public''' Sub Main() | ||
Versione delle 17:41, 18 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 uno dei seguenti codici.
Aprire in osservazione il file "...sub0/status"
In questo primo codice nella routine principale apriremo il file "...sub0/status" del dispositivo audio attivo, ponendolo sotto osservazione al solo fine di far sollevare l'Evento di lettura "File_Read( )", e così di leggere con una nuova e diversa apertura del medesimo file i dati utili, ogni qual volta vi sono dati appunto da leggere.
Una lettura diretta del file nella routine "File_Read( )" mediante la variabile di tipo File, ottenuta con l'istruzione "Open" della routine principale "Sub Main( )", non risulta possibile: seppure assenti errori, non vengono restituiti dati.
Private fl As File Private dis As String Public Sub Main() ' Verifica quale dispositivo audio è attivo: dis = DispositivoAttivo() ' Apriamo il file solo per far sollevare l'evento di lettura ogni qual volta v'è qualcosa di nuovo da leggervi: fl = Open "/proc/asound/card" & dis &/ "sub0/status" For Read Watch 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 File_Read() 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] Else fl.Close Endif End
Facendo uso del Timer
In qust'altro codice si fa 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] Else tm.Stop Endif End
Usando un ciclo e mostrando anche il tempo trascorso
In questo esempio viene utilizzato un ciclo e 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).
Va chiarito che il file audio o Midi da caricare nella variabile "s" di tipo Stringa, sarà il medesimo che si sta facendo eseguire con un qualsiasi programma di lettura audio/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 !