Differenze tra le versioni di "Rilevare in tempo reale la quantità di frame audio processati dalla scheda audio"

Da Gambas-it.org - Wikipedia.
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 codice sottostante (il valore del tempo trascorso mostrato in consol è valido eseguendo un file di formato WAV o un file Midi):
+
Mentre un qualunque programma sta eseguendo un file audio o Midi, è possibile lanciare il semplice codice sottostante facendo uso di un Oggetto ''Timer'':
 +
Private tm As Timer
 +
Private dis As String
 +
 +
 +
'''Public''' Sub Main()
 +
 
 +
<FONT Color=gray>' ''Verifica quale dispositivo audio è attivo:''</font>
 +
  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
 +
 
 +
<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 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'''
 +
 
 +
 
 +
In questo secondo esempio viene 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()
 
    
 
    
Riga 65: Riga 114:
 
   Repeat
 
   Repeat
 
     For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory)
 
     For Each s In Dir("/proc/asound/card" & CStr(b), "pcm*p", gb.Directory)
       If File.Load("/proc/asound/card" & CStr(b) &/ s & "/sub0/status") Like "*RUNNING*" Then c = 1
+
       If InStr(File.Load("/proc/asound/card" & CStr(b) &/ s &/ "sub0/status"), "RUNNING") > 0 Then c = 1
 
     Next
 
     Next
 
     Inc b
 
     Inc b

Versione delle 15:27, 6 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 il semplice codice sottostante facendo 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


In questo secondo esempio viene 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 !