Rilevare in tempo reale la quantità di frame audio processati dalla scheda audio

Da Gambas-it.org - Wikipedia.

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 !