Differenze tra le versioni di "Conoscere in tempo reale la quantità di frame audio processati dalla scheda audio"
Riga 50: | Riga 50: | ||
s = File.Load(dis) | s = File.Load(dis) | ||
− | |||
If InStr(s, "RUNNING") > 0 Then | If InStr(s, "RUNNING") > 0 Then | ||
+ | fr = Scan(Split(s, gb.NewLine)[8], "*: *")[1] | ||
Write "\rFrame: " & fr & | Write "\rFrame: " & fr & | ||
" Tempo trascorso: " & Str(Time(0, 0, 0, (Val(fr) / 44100) * 1000)) <FONT Color=gray>' </font><SUP>[[[#Note|nota 1]]]</sup> | " Tempo trascorso: " & Str(Time(0, 0, 0, (Val(fr) / 44100) * 1000)) <FONT Color=gray>' </font><SUP>[[[#Note|nota 1]]]</sup> |
Versione delle 19:19, 22 set 2022
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.
In questo 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.
Verrà mostrato il tempo trascorso sulla base dei frame audio processati.
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 per, ca, pc, su 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 !") per = "/proc/asound" For Each ca In Dir(per, "card*", gb.Directory) For Each pc In Dir(per &/ ca, "pcm*p", gb.Directory) For Each su In Dir(per &/ ca &/ pc, "sub*", gb.Directory) If InStr(File.Load(per &/ ca &/ pc &/ su &/ "status"), "RUNNING") > 0 Then Break Next Next Next Return per &/ ca &/ pc &/ su &/ "status" End Public Sub Tempus_Timer() Dim s, fr As String s = File.Load(dis) If InStr(s, "RUNNING") > 0 Then fr = Scan(Split(s, gb.NewLine)[8], "*: *")[1] Write "\rFrame: " & fr & " Tempo trascorso: " & Str(Time(0, 0, 0, (Val(fr) / 44100) * 1000)) ' [nota 1] Else tm.Stop Endif End
Note
[1] Vedasi la 5a modalità mostrata in questa pagina: Calcolare la durata di un file audio WAV