Differenze tra le versioni di "Conoscere in tempo reale con "proc...fdinfo" la quantità dei dati elaborati di un file audio"

Da Gambas-it.org - Wikipedia.
 
(12 versioni intermedie di uno stesso utente non sono mostrate)
Riga 1: Riga 1:
 
===Introduzione===
 
===Introduzione===
 
La sottodirectory "''/fdinfo/''", posta sotto la gerarchia "''/proc/[pid]/fdinfo/''", contiene un riferimento per ogni file che il processo ha aperto, chiamato dal suo descrittore di file. Il contenuto di ogni file può essere letto per ottenerne le informazioni sul descrittore di file corrispondente.
 
La sottodirectory "''/fdinfo/''", posta sotto la gerarchia "''/proc/[pid]/fdinfo/''", contiene un riferimento per ogni file che il processo ha aperto, chiamato dal suo descrittore di file. Il contenuto di ogni file può essere letto per ottenerne le informazioni sul descrittore di file corrispondente.
<BR>Ovviamente la cartella "'''[pid]'''" del percorso "''/proc/[pid]/fdinfo/''" rappresenta il numero identificativo del processo del programma gambas che sta elaborando il file audio.
+
<BR>Ovviamente la cartella "'''[pid]'''" del percorso "''/proc/[pid]/fdinfo/''" rappresenta il numero identificativo del processo del programma Gambas che sta elaborando il file audio.
  
 
In particolare, se un programma Gambas oppure un multimediale esegue un file audio, viene generato nella sottodirectory  "''/proc/[pid]/fd/''" un collegamento al file audio in esecuzione. Così nella sottodirectory "''/proc/[pid]/fdinfo/''" viene generato un file che fa riferimento al ''file-descriptor'', posto in "''/proc/[pid]/fd/''", collegato con il file audio eseguito.
 
In particolare, se un programma Gambas oppure un multimediale esegue un file audio, viene generato nella sottodirectory  "''/proc/[pid]/fd/''" un collegamento al file audio in esecuzione. Così nella sottodirectory "''/proc/[pid]/fdinfo/''" viene generato un file che fa riferimento al ''file-descriptor'', posto in "''/proc/[pid]/fd/''", collegato con il file audio eseguito.
Riga 8: Riga 8:
  
 
Tale risorsa, rappresentata dalla sottodirectory "''/proc/[pid]/fdinfo/''", può essere utilizzata anche in Gambas per conoscere in tempo reale la quantità di dati elaborati di un file audio da un'applicazione Gambas con le specifiche risorse di un apposto Componente, oppure da un programma esterno multimediale, lanciato dall'applicazione Gambas mediante ''Shell'' e gestito con le risorse della Classe ''Process''.
 
Tale risorsa, rappresentata dalla sottodirectory "''/proc/[pid]/fdinfo/''", può essere utilizzata anche in Gambas per conoscere in tempo reale la quantità di dati elaborati di un file audio da un'applicazione Gambas con le specifiche risorse di un apposto Componente, oppure da un programma esterno multimediale, lanciato dall'applicazione Gambas mediante ''Shell'' e gestito con le risorse della Classe ''Process''.
 
  
 
==Caso in cui il file audio è eseguito con le risorse native di Gambas==
 
==Caso in cui il file audio è eseguito con le risorse native di Gambas==
Il seguente esempio in ambiente grafico mostra come conoscere la quantità di byte audio processati da una risorsa Gambas (in tal caso il Componente ''gb.media''), adatta a eseguire un file audio.
+
Mostriamo un esempio con un'applicazione a ''riga di comando'' usando le risorse del Componente "gb.media", che dunque dovrà essere preliminarmente attivato:
'''Public''' Sub Button1_Click()
 
 
 
  Dim pl As MediaPipeline
 
  Dim med, prc, s, dati As String
 
  Dim byte, i As Integer
 
  Dim fl As File
 
 
 
  med = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
 
  byte = Stat(med).Size
 
  Me.Caption = "File audio: " & File.Name(med) & " - dimensione: " & CStr(byte) & " byte"
 
   
 
  pl = New MediaPipeline(Null, "playbin")
 
  pl["uri"] = Media.URL(med)
 
  pl.Play()
 
 
 
  prc = "/proc" &/ CStr(Application.Handle)
 
 
 
  Repeat
 
    Inc i
 
    s = Dir(prc &/ "fd", "*", gb.Device)[i]
 
  Until Stat(prc &/ "fd" &/ s).Link == med  <FONT Color=gray>' ''Se il file descriptor è un link al file audio eseguito,...''</font>
 
 
 
<FONT Color=gray>' ''...allora viene eseguito il ciclo per leggere il corrispondente file nella sottodirectory "/proc/[pid]/fdinfo/":''</font>
 
  Repeat
 
    fl = Open prc &/ "fdinfo" &/ s For Read
 
    Line Input #fl, dati
 
<FONT Color=gray>' ''Estrapola la parte della stringa afferente ai byte processati:''</font>
 
    ProgressBar1.Value = Val(Scan(dati, "*\t*")[1]) / byte
 
    fl.Close
 
    Wait 0.01
 
<FONT Color=gray>' ''Il ciclo di norma dura sino a quando non sono stati elaborati tutti i dati del file audio:''</font>
 
  Until ProgressBar1.Value = 1.00
 
 
 
  pl.Stop
 
  pl.Close
 
 
 
'''End'''
 
 
 
In quest'altro esempio invece si utilizzerà un'applicazione a ''riga di comando'':
 
 
  '''Public''' Sub Main()
 
  '''Public''' Sub Main()
 
    
 
    
 
   Dim pl As MediaPipeline
 
   Dim pl As MediaPipeline
 
   Dim med, prc, s, dati, dt As String
 
   Dim med, prc, s, dati, dt As String
   Dim byte, i As Integer
+
   Dim i As Integer
 +
  Dim tm As Date
 +
  Dim dur As Float
 
   Dim fl As File
 
   Dim fl As File
 
    
 
    
 
   med = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
 
   med = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
  byte = Stat(med).Size
 
 
   Print "File audio: "; File.Name(med)
 
   Print "File audio: "; File.Name(med)
   Print "Dimensione: "; byte; " byte\n"
+
   Print "Dimensione: "; Stat(med).Size; " byte\n"
 
    
 
    
 
   pl = New MediaPipeline(Null, "playbin")
 
   pl = New MediaPipeline(Null, "playbin")
 
   pl["uri"] = Media.URL(med)
 
   pl["uri"] = Media.URL(med)
 
   pl.Play()
 
   pl.Play()
 
+
 
 +
  tm = Now
 +
 
 +
  Repeat
 +
    dur = pl.Duration
 +
  Until dur > 0
 +
 
 
   prc = "/proc" &/ CStr(Application.Handle)
 
   prc = "/proc" &/ CStr(Application.Handle)
 
 
 
   Repeat
 
   Repeat
 
     Inc i
 
     Inc i
Riga 80: Riga 46:
 
  <FONT Color=gray>' ''Estrapola la parte della stringa afferente ai byte processati:''</font>
 
  <FONT Color=gray>' ''Estrapola la parte della stringa afferente ai byte processati:''</font>
 
     dt = Scan(dati, "*\t*")[1]
 
     dt = Scan(dati, "*\t*")[1]
     Write "\r  \e[31m" & dt & "\e[0m byte processati = " & Format((100 * CLong(dt)) / byte, "0.00") & "%"
+
     Write "\r  \e[0mByte processati: \e[31m" & dt
 +
    Flush
 
     fl.Close
 
     fl.Close
 
     Wait 0.01
 
     Wait 0.01
  <FONT Color=gray>' ''Il ciclo di norma dura sino a quando non sono stati elaborati tutti i dati del file audio:''</font>
+
  <FONT Color=gray>' ''Quando il tempo trascorso dall'inizio dell'esecuzione audio è uguale alla durata del file audio, si esce dal ciclo:''</font>
   Until Val(dt) >= byte
+
   Until DateDiff(tm, Now, gb.Second) >= dur
 
 
  pl.Stop
 
  pl.Close
 
 
 
'''End'''
 
 
 
In questo terzo esempio nuovamente in ambiente grafico useremo invece le risorse della Classe "''Music''" del Componente ''gb.sdl2.audio:
 
'''Public''' Sub Button1_Click()
 
 
    
 
    
   Dim med, prc, s, dati As String
+
   Print "\n\n\e[0mEsecuzione terminata !"
  Dim byte, i As Integer
+
   pl.Stop
  Dim fl As File
+
   pl.Close
 
 
  med = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
 
   byte = Stat(med).Size
 
  Me.Caption = "File audio: " & File.Name(med) & " - dimensione: " & CStr(byte) & " byte"
 
   
 
  Music.Load(med)
 
   Music.Play
 
 
    
 
    
  prc = "/proc" &/ CStr(Application.Handle)
 
 
 
  Repeat
 
    Inc i
 
    s = Dir(prc &/ "fd", "*", gb.Device)[i]
 
  Until Stat(prc &/ "fd" &/ s).Link == med  <FONT Color=gray>' ''Se il file descriptor è un link al file audio eseguito,...''</font>
 
   
 
<FONT Color=gray>' ''...allora viene eseguito il ciclo per leggere il corrispondente file nella sottodirectory "/proc/[pid]/fdinfo/":''</font>
 
  Repeat
 
    fl = Open prc &/ "fdinfo" &/ s For Read
 
    Line Input #fl, dati
 
<FONT Color=gray>' ''Estrapola la parte della stringa afferente ai byte processati:''</font>
 
    ProgressBar1.Value = Val(Scan(dati, "*\t*")[1]) / byte
 
    fl.Close
 
    Wait 0.01
 
<FONT Color=gray>' ''Il ciclo di norma dura sino a quando non sono stati elaborati tutti i dati del file audio:''</font>
 
  Until ProgressBar1.Value = 1.00
 
 
 
 
  '''End'''
 
  '''End'''
 
  
 
==Caso in cui il file audio è eseguito da un programma lanciato con Gambas mediante Shell==
 
==Caso in cui il file audio è eseguito da un programma lanciato con Gambas mediante Shell==
Mostriamo un esempio in ambiente grafico, nel quale si lancerà il programma multimediale VLC, passandogli un file audio da eseguire, e si mostrerà in una ''ProgressBar'' la percentuale corrente dei dati di un file audio eseguiti.
+
Mostriamo un esempio in ambiente grafico, nel quale si lancerà il programma multimediale VLC, passandogli un file audio da eseguire, e si mostrerà nell'intestazione della finestra del "Form" la quantità corrente dei dati del file audio eseguiti.
 
  '''Public''' Sub Button1_Click()
 
  '''Public''' Sub Button1_Click()
 
    
 
    
Riga 133: Riga 66:
 
   Dim fl As File
 
   Dim fl As File
 
   Dim media, prc, s, dati As String
 
   Dim media, prc, s, dati As String
   Dim byte, i As Integer
+
   Dim i As Integer
 
    
 
    
 
   media = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
 
   media = "<FONT Color=gray>''/percorso/del/file/audio''</font>"
  byte = Stat(media).Size
+
     
  Me.Caption = "File media: " & media & " - dimensione: " & CStr(byte) & " byte"
 
   
 
 
  <FONT Color=gray>' ''Lancia il programma VLC passandogli il percorso del file audio da eseguire:''</font>
 
  <FONT Color=gray>' ''Lancia il programma VLC passandogli il percorso del file audio da eseguire:''</font>
 
   pr = Shell "cvlc " & media
 
   pr = Shell "cvlc " & media
Riga 144: Riga 75:
 
   prc = "/proc" &/ CStr(pr.Handle + 1)
 
   prc = "/proc" &/ CStr(pr.Handle + 1)
 
    
 
    
   Wait 0.3
+
   Wait 0.5
 
   Repeat
 
   Repeat
 
     Inc i
 
     Inc i
Riga 150: Riga 81:
 
   Until Stat(prc &/ "fd" &/ s).Link == media  <FONT Color=gray>' ''Se il file descriptor è un link al file audio eseguito,...''</font>
 
   Until Stat(prc &/ "fd" &/ s).Link == media  <FONT Color=gray>' ''Se il file descriptor è un link al file audio eseguito,...''</font>
 
    
 
    
  Wait 0.3
 
 
  <FONT Color=gray>' ''...allora viene eseguito il ciclo per leggere il corrispondente file nella sottodirectory "/proc/[pid]/fdinfo/":''</font>
 
  <FONT Color=gray>' ''...allora viene eseguito il ciclo per leggere il corrispondente file nella sottodirectory "/proc/[pid]/fdinfo/":''</font>
   Repeat
+
   While Exist(prc &/ "fdinfo" &/ s)
 
     fl = Open prc &/ "fdinfo" &/ s For Read
 
     fl = Open prc &/ "fdinfo" &/ s For Read
 
     Line Input #fl, dati
 
     Line Input #fl, dati
  <FONT Color=gray>' ''Aggiorna la proprietà ".value" della "ProgressBar":''</font>
+
  <FONT Color=gray>' ''Mostra i dati audio sino a questo momento processati:''</font>
     ProgressBar1.Value = Val(Scan(dati, "*\t*")[1]) / byte
+
     Me.Text = "Dati audio processati: " & Scan(dati, "*\t*")[1]
 
     fl.Close
 
     fl.Close
     Wait 0.01
+
     Wait 0.1
  <FONT Color=gray>' ''Se è stato chiuso manualmente il Form, allora si esce dal ciclo "Repeat...Until":''</font>
+
  Wend  
    If Object.IsValid(Me) = False Then Break
+
 
<FONT Color=gray>' ''Il ciclo di norma dura sino a quando non sono stati elaborati tutti i dati del file audio:''</font>
+
   Print "termine"
   Until ProgressBar1.Value = 1.00
 
 
   pr.Close
 
   pr.Close
 +
  pr.Kill
 
    
 
    
 
  '''End'''
 
  '''End'''
Riga 170: Riga 100:
 
  '''Public''' Sub Form_Close()
 
  '''Public''' Sub Form_Close()
 
    
 
    
  <FONT Color=gray>' ''Se è stato comunque chiuso il Form, allora viene terminato il processo del programma multimediale:''</font>
+
  <FONT Color=gray>' ''Se viene comunque chiuso il "Form", allora viene terminato il processo del programma multimediale:''</font>
 
   Shell "killall vlc"
 
   Shell "killall vlc"
 
    
 
    

Versione attuale delle 17:02, 30 giu 2021

Introduzione

La sottodirectory "/fdinfo/", posta sotto la gerarchia "/proc/[pid]/fdinfo/", contiene un riferimento per ogni file che il processo ha aperto, chiamato dal suo descrittore di file. Il contenuto di ogni file può essere letto per ottenerne le informazioni sul descrittore di file corrispondente.
Ovviamente la cartella "[pid]" del percorso "/proc/[pid]/fdinfo/" rappresenta il numero identificativo del processo del programma Gambas che sta elaborando il file audio.

In particolare, se un programma Gambas oppure un multimediale esegue un file audio, viene generato nella sottodirectory "/proc/[pid]/fd/" un collegamento al file audio in esecuzione. Così nella sottodirectory "/proc/[pid]/fdinfo/" viene generato un file che fa riferimento al file-descriptor, posto in "/proc/[pid]/fd/", collegato con il file audio eseguito.

Il file di riferimento, posto in "/proc/[pid]/fdinfo/", fornisce tre righe (campi) di informazioni. La riga che per l'argomento, trattato in questa pagina, ci interessa, è la prima. Tale primo campo di informazioni è chiamato "pos", e rappresenta un numero intero decimale che mostra l'offset del file in esecuzione, ossia la quantità di byte del file audio sino a quel momento elaborati dal programma lanciato.

Tale risorsa, rappresentata dalla sottodirectory "/proc/[pid]/fdinfo/", può essere utilizzata anche in Gambas per conoscere in tempo reale la quantità di dati elaborati di un file audio da un'applicazione Gambas con le specifiche risorse di un apposto Componente, oppure da un programma esterno multimediale, lanciato dall'applicazione Gambas mediante Shell e gestito con le risorse della Classe Process.

Caso in cui il file audio è eseguito con le risorse native di Gambas

Mostriamo un esempio con un'applicazione a riga di comando usando le risorse del Componente "gb.media", che dunque dovrà essere preliminarmente attivato:

Public Sub Main()
 
 Dim pl As MediaPipeline
 Dim med, prc, s, dati, dt As String
 Dim i As Integer
 Dim tm As Date
 Dim dur As Float
 Dim fl As File
  
 med = "/percorso/del/file/audio"
 Print "File audio: "; File.Name(med)
 Print "Dimensione: "; Stat(med).Size; " byte\n"
  
 pl = New MediaPipeline(Null, "playbin")
 pl["uri"] = Media.URL(med)
 pl.Play()
 
 tm = Now
 
 Repeat 
   dur = pl.Duration
 Until dur > 0
 
 prc = "/proc" &/ CStr(Application.Handle)
 Repeat
   Inc i
   s = Dir(prc &/ "fd", "*", gb.Device)[i]
 Until Stat(prc &/ "fd" &/ s).Link == med   ' Se il file descriptor è un link al file audio eseguito,...
   
' ...allora viene eseguito il ciclo per leggere il corrispondente file nella sottodirectory "/proc/[pid]/fdinfo/":
 Repeat
   fl = Open prc &/ "fdinfo" &/ s For Read
   Line Input #fl, dati
' Estrapola la parte della stringa afferente ai byte processati:
   dt = Scan(dati, "*\t*")[1]
   Write "\r  \e[0mByte processati: \e[31m" & dt
   Flush
   fl.Close
   Wait 0.01
' Quando il tempo trascorso dall'inizio dell'esecuzione audio è uguale alla durata del file audio, si esce dal ciclo:
 Until DateDiff(tm, Now, gb.Second) >= dur
 
 Print "\n\n\e[0mEsecuzione terminata !"
 pl.Stop
 pl.Close
  
End

Caso in cui il file audio è eseguito da un programma lanciato con Gambas mediante Shell

Mostriamo un esempio in ambiente grafico, nel quale si lancerà il programma multimediale VLC, passandogli un file audio da eseguire, e si mostrerà nell'intestazione della finestra del "Form" la quantità corrente dei dati del file audio eseguiti.

Public Sub Button1_Click()
 
 Dim pr As Process
 Dim fl As File
 Dim media, prc, s, dati As String
 Dim i As Integer
 
 media = "/percorso/del/file/audio"
      
' Lancia il programma VLC passandogli il percorso del file audio da eseguire:
 pr = Shell "cvlc " & media
' Individua con precisione il numero del processo del programma VLC dalla proprietà ".Handle" della variabile "Process", aumentato di un'unità:
 prc = "/proc" &/ CStr(pr.Handle + 1)
 
 Wait 0.5
 Repeat
   Inc i
   s = Dir(prc &/ "fd", "*", gb.Device)[i]
 Until Stat(prc &/ "fd" &/ s).Link == media   ' Se il file descriptor è un link al file audio eseguito,...
 
' ...allora viene eseguito il ciclo per leggere il corrispondente file nella sottodirectory "/proc/[pid]/fdinfo/":
 While Exist(prc &/ "fdinfo" &/ s)
   fl = Open prc &/ "fdinfo" &/ s For Read
   Line Input #fl, dati
' Mostra i dati audio sino a questo momento processati:
   Me.Text = "Dati audio processati: " & Scan(dati, "*\t*")[1]
   fl.Close
   Wait 0.1
 Wend  
 
 Print "termine"
 pr.Close
 pr.Kill
 
End


Public Sub Form_Close()
 
' Se viene comunque chiuso il "Form", allora viene terminato il processo del programma multimediale:
 Shell "killall vlc"
 
End


Riferimenti