Differenze tra le versioni di "Conoscere in tempo reale la quantità di frame audio processati dalla scheda audio"
Riga 5: | Riga 5: | ||
Mentre un qualunque programma sta eseguendo un file audio o Midi, è possibile lanciare uno dei seguenti codici. | 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. | |
− | In questo | ||
<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. | <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. | ||
− | + | <BR>Verrà mostrato il tempo trascorso sulla base dei frame audio processati. | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Private tm As Timer | Private tm As Timer | ||
Private dis As String | Private dis As String | ||
Riga 99: | Riga 47: | ||
'''Public''' Sub Tempus_Timer() | '''Public''' Sub Tempus_Timer() | ||
− | Dim s As String | + | Dim s, fr As String |
− | + | ||
s = File.Load(dis) | s = File.Load(dis) | ||
− | + | fr = Scan(Split(s, gb.NewLine)[8], "*: *")[1] | |
− | If InStr(s, "RUNNING") > 0 Then | + | |
− | + | If InStr(s, "RUNNING") > 0 Then | |
+ | Write "\rFrame: " & fr & | ||
+ | " Tempo trascorso: " & Str(Time(0, 0, 0, (Val(fr) / 44100) * 1000)) <SUP>[[[#Note|nota 1]]]</sup> | ||
Else | Else | ||
tm.Stop | tm.Stop | ||
Endif | Endif | ||
− | + | ||
'''End''' | '''End''' | ||
− | = | + | |
− | + | =Note= | |
− | + | [1] Vedasi la 5<SUP>a</sup> modalità mostrata in questa pagina: [https://www.gambas-it.org/wiki/index.php/Calcolare_la_durata_di_un_file_audio_WAV#5a_modalit.C3.A0 Calcolare la durata di un file audio WAV] | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− |
Versione delle 19:13, 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) fr = Scan(Split(s, gb.NewLine)[8], "*: *")[1] If InStr(s, "RUNNING") > 0 Then 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