Differenze tra le versioni di "Rilevare in tempo reale la quantità di frame audio processati dalla scheda audio"
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 | + | 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. | ||
+ | <BR>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() | ||
+ | |||
+ | <FONT Color=gray>' ''Verifica quale dispositivo audio è attivo:''</font> | ||
+ | dis = DispositivoAttivo() | ||
+ | |||
+ | <FONT Color=gray>' ''Apriamo il file solo per far sollevare l'evento di lettura ogni qual volta v'è qualcosa di nuovo da leggervi:''</font> | ||
+ | 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 | ||
+ | |||
+ | <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 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 tm As Timer | ||
Private dis As String | Private dis As String | ||
Riga 52: | Riga 105: | ||
− | In questo | + | ===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() | '''Public''' Sub Main() | ||
Versione delle 16:47, 8 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 "/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 !