Differenze tra le versioni di "Conoscere in tempo reale la quantità di frame audio processati dalla scheda audio"
(7 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 1: | Riga 1: | ||
− | 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''". | + | 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. | + | 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. | 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 " | + | <BR>Verrà mostrato anche il tempo trascorso calcolato sulla base dei frame audio processati, ma si presuppone nel codice che il file audio abbia una frequenza di campionamento di 44100 hertz oppure che sia un file MIDI. Pertanto, se il file audio ha una frequenza di campionamento diversa da 44100 hertz, andrà cambiato il valore presente nella routine "Tempus_Timer()". |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
Private tm As Timer | Private tm As Timer | ||
Private dis As String | Private dis As String | ||
− | + | Public Sub Main() | |
<FONT Color=gray>' ''Verifica quale dispositivo audio è attivo:''</font> | <FONT Color=gray>' ''Verifica quale dispositivo audio è attivo:''</font> | ||
Riga 76: | Riga 22: | ||
End With | End With | ||
− | + | End | |
− | + | Private Function DispositivoAttivo() As String | |
Dim per, ca, pc, su As String | Dim per, ca, pc, su As String | ||
Riga 98: | Riga 44: | ||
Return per &/ ca &/ pc &/ su &/ "status" | Return per &/ ca &/ pc &/ su &/ "status" | ||
− | + | End | |
− | + | Public Sub Tempus_Timer() | |
− | |||
− | |||
+ | Dim s, fr As String | ||
+ | |||
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: \e[31m" & fr & | ||
+ | "\e[0m Tempo trascorso: " & | ||
+ | Str(Time(0, 0, 0, (Val(fr) / <FONT Color=#B22222>44100</font>) * 1000)) <FONT Color=gray>' </font><SUP>[[[#Note|nota 1]]]</sup> | ||
Else | Else | ||
tm.Stop | tm.Stop | ||
Endif | Endif | ||
− | + | ||
− | + | 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 attuale delle 18:08, 17 giu 2024
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 anche il tempo trascorso calcolato sulla base dei frame audio processati, ma si presuppone nel codice che il file audio abbia una frequenza di campionamento di 44100 hertz oppure che sia un file MIDI. Pertanto, se il file audio ha una frequenza di campionamento diversa da 44100 hertz, andrà cambiato il valore presente nella routine "Tempus_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 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: \e[31m" & fr & "\e[0m 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