Rilevare in tempo reale la quantità di frame audio processati dalla scheda audio
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 "/proc/uptime"
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] 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] 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):
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 !