Differenze tra le versioni di "Riproduzione e contemporanea registrazione dell'audio di radio WEB mediante il Componente gb.media"

Da Gambas-it.org - Wikipedia.
 
(17 versioni intermedie di uno stesso utente non sono mostrate)
Riga 2: Riga 2:
  
 
===Uso del plugin "uridecodebin" di GStreamer per decodificare l'audio in entrata===  
 
===Uso del plugin "uridecodebin" di GStreamer per decodificare l'audio in entrata===  
Nell'esempio in ambiente grafico, che segue, si utilizzerà il plugin "''uridecodebin'' " per decodificare i dati audio ricevuti, che saranno riprodotti e anche salvati in un file di formato OGG.
+
Nell'esempio in ambiente grafico, che segue, si utilizzerà il plugin ''uridecodebin'' per decodificare i dati audio ricevuti, che saranno riprodotti e anche salvati in un file di formato OGG.
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
   
+
Private temporaneo As String
   
+
  '''Public''' Sub ToggleButton1_Click()
+
 
+
  Public Sub ToggleButton1_Click()
 +
 
   Dim src, tee, que As MediaControl
 
   Dim src, tee, que As MediaControl
 
   Dim cnv1, snk1 As MediaControl
 
   Dim cnv1, snk1 As MediaControl
 
   Dim cnv2, ven, omu, snk2 As MediaControl
 
   Dim cnv2, ven, omu, snk2 As MediaControl
  Dim tm As Date
+
   
 
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
     pl = New MediaPipeline
+
    temporaneo = Temp
 +
 +
     pl = New MediaPipeline As "PLine"
 
          
 
          
 
     src = New MediaControl(pl, "uridecodebin")
 
     src = New MediaControl(pl, "uridecodebin")
     src["uri"] = <FONT Color=gray>''"http&#058;//Indirizzo/web/del/flusso/dei/dati/audio/della/radio''</font>"
+
     src["uri"] = <FONT Color=darkgreen>''"http&#058;//Indirizzo/web/del/flusso/dei/dati/audio/della/radio''</font>"
 
      
 
      
 
     tee = New MediaControl(pl, "tee")
 
     tee = New MediaControl(pl, "tee")
Riga 31: Riga 33:
 
     omu = New MediaControl(pl, "oggmux")
 
     omu = New MediaControl(pl, "oggmux")
 
     snk2 = New MediaControl(pl, "filesink")
 
     snk2 = New MediaControl(pl, "filesink")
     snk2["location"] = "/tmp/primoaudio.ogg"        <FONT Color=gray>' ''Cartella dove sarà salvato il file audio di formato OGG:''</font>
+
     snk2["location"] = temporaneo
 
      
 
      
 
  <FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font>
 
  <FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font>
Riga 46: Riga 48:
 
     ven.LinkTo(omu)
 
     ven.LinkTo(omu)
 
     omu.LinkTo(snk2)
 
     omu.LinkTo(snk2)
       
+
   
 
     pl.Play()
 
     pl.Play()
       
+
     Repeat
+
     While pl.Position < 1
 
       Wait 0.01
 
       Wait 0.01
     Until pl.State == Media.Playing
+
     Wend
   
 
    tm = Now
 
   
 
 
     Repeat
 
     Repeat
      Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
 
 
       Wait 0.01
 
       Wait 0.01
     Until pl.State == Media.Ready
+
     Until Not ToggleButton1.Value
 
   Else
 
   Else
 
     pl.Stop
 
     pl.Stop
 
     pl.Close
 
     pl.Close
 +
    If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg"
 +
    Copy temporaneo To "/tmp/audio.ogg"
 
   Endif
 
   Endif
   
+
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Close()
+
  Public Sub PLine_Position()
 
   
 
   
   ToggleButton1.Value = False
+
   Me.Title = Time(0, 0, 0, pl.Position * 1000)
 
 
<FONT Color=gray>' ''Poiché, chiudendo il "Form", i dati salvati nel file audio vengono inspiegabilmente perduti, è necessario copiare il file audio creato in un altro nuovo file audio identico:</font>
 
  Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg"
 
 
   
 
   
  '''End'''
+
  End
  
  
 
===Uso dei plugin "souphttpsrc" e "decodebin" di GStreamer per decodificare l'audio in entrata===  
 
===Uso dei plugin "souphttpsrc" e "decodebin" di GStreamer per decodificare l'audio in entrata===  
 
In quest'altro esempio si farà uso dei plugin "''souphttpsrc'' " e "''decodebin'' " di GStreamer.
 
In quest'altro esempio si farà uso dei plugin "''souphttpsrc'' " e "''decodebin'' " di GStreamer.
  Private pl As MediaPipeline
+
  Public Sub ToggleButton1_Click()
 
 
'''Public''' Sub ToggleButton1_Click()
 
 
    
 
    
   Dim src, tee, que, dcd, dcd2 As MediaControl
+
  Dim pl As MediaPipeline
  Dim cnv1, snk1 As MediaControl
+
   Dim src, tee, que, dcd, cnv1, snk1 As MediaControl
   Dim cnv2, ven, omu, snk2 As MediaControl
+
   Dim dcd2, cnv2, vor, ogg, snk2 As MediaControl
 +
  Dim temporaneo As String
 
   Dim tm As Date
 
   Dim tm As Date
 
      
 
      
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
 +
    temporaneo = Temp
 +
 
     pl = New MediaPipeline
 
     pl = New MediaPipeline
 
          
 
          
 
     src = New MediaControl(pl, "souphttpsrc")
 
     src = New MediaControl(pl, "souphttpsrc")
     src["location"] = <FONT Color=gray>''"http&#058;//Indirizzo/web/del/flusso/dei/dati/audio/della/radio''</font>"
+
     src["location"] = "https&#058;//uk2.streamingpulse.com/ssl/vcr2"
 
      
 
      
 
     tee = New MediaControl(pl, "tee")
 
     tee = New MediaControl(pl, "tee")
 
     que = New MediaControl(pl, "queue")
 
     que = New MediaControl(pl, "queue")
   
+
 
  <FONT Color=gray>' ''Per ascoltare l'audio della radio web:''</font>
 
  <FONT Color=gray>' ''Per ascoltare l'audio della radio web:''</font>
 
     dcd = New MediaControl(pl, "decodebin")
 
     dcd = New MediaControl(pl, "decodebin")
 
     cnv1 = New MediaControl(pl, "audioconvert")
 
     cnv1 = New MediaControl(pl, "audioconvert")
 
     snk1 = New MediaControl(pl, "autoaudiosink")
 
     snk1 = New MediaControl(pl, "autoaudiosink")
   
+
 
  <FONT Color=gray>' ''Per salvare i dati del flusso audio della radio web in un file di formato OGG:''</font>
 
  <FONT Color=gray>' ''Per salvare i dati del flusso audio della radio web in un file di formato OGG:''</font>
 
     dcd2 = New MediaControl(pl, "decodebin")
 
     dcd2 = New MediaControl(pl, "decodebin")
 
     cnv2 = New MediaControl(pl, "audioconvert")
 
     cnv2 = New MediaControl(pl, "audioconvert")
     ven = New MediaControl(pl, "vorbisenc")
+
     vor = New MediaControl(pl, "vorbisenc")
     omu = New MediaControl(pl, "oggmux")
+
     ogg = New MediaControl(pl, "oggmux")
 
     snk2 = New MediaControl(pl, "filesink")
 
     snk2 = New MediaControl(pl, "filesink")
     snk2["location"] = "/tmp/primoaudio.ogg"        <FONT Color=gray>' ''Cartella dove sarà salvato il file audio di formato OGG:''</font>
+
     snk2["location"] = temporaneo
   
+
 
  <FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font>
 
  <FONT Color=gray>' ''Divide il flusso dei dati audio in due rami identici:''</font>
 
     src.LinkTo(tee)
 
     src.LinkTo(tee)
   
+
 
  <FONT Color=gray>' ''1° ramo dei dati audio (per la riproduzione sonora):''</font>
 
  <FONT Color=gray>' ''1° ramo dei dati audio (per la riproduzione sonora):''</font>
 
     tee.LinkTo(que)
 
     tee.LinkTo(que)
Riga 119: Riga 116:
 
     dcd.LinkLaterTo(cnv1)
 
     dcd.LinkLaterTo(cnv1)
 
     cnv1.LinkTo(snk1)
 
     cnv1.LinkTo(snk1)
   
+
 
  <FONT Color=gray>' ''2° ramo dei dati audio (per salvare i dati in un file OGG):''</font>
 
  <FONT Color=gray>' ''2° ramo dei dati audio (per salvare i dati in un file OGG):''</font>
 
     tee.LinkTo(dcd2)
 
     tee.LinkTo(dcd2)
 
     dcd2.LinkLaterTo(cnv2)
 
     dcd2.LinkLaterTo(cnv2)
     cnv2.LinkTo(ven)
+
     cnv2.LinkTo(vor)
     ven.LinkTo(omu)
+
     vor.LinkTo(ogg)
     omu.LinkTo(snk2)
+
     ogg.LinkTo(snk2)
   
+
 
     pl.Play()
 
     pl.Play()
       
+
    Repeat
 
      Wait 0.01
 
    Until pl.State == Media.Playing
 
   
 
 
     tm = Now
 
     tm = Now
   
+
 
     Repeat
 
     Repeat
       Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
+
       Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
       Wait 0.01
+
       Wait 0.1
     Until pl.State == Media.Ready
+
     Until Not ToggleButton1.Value
 
   Else
 
   Else
 
     pl.Stop
 
     pl.Stop
 
     pl.Close
 
     pl.Close
 +
    If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg"
 +
    Copy temporaneo To "/tmp/audio.ogg"
 
   Endif
 
   Endif
   
 
'''End'''
 
 
   
 
   
   
+
  End
'''Public''' Sub Form_Close()
+
 
 
  ToggleButton1.Value = False
 
 
 
<FONT Color=gray>' ''Poiché, chiudendo il "Form", i dati salvati nel file audio vengono inspiegabilmente perduti, è necessario copiare il file audio creato in un altro nuovo file audio identico:</font>
 
  Copy "/tmp/primoaudio.ogg" To "/tmp/audiofinale.ogg"
 
 
'''End'''
 
  
 
==Ascoltare e contemporaneamente riprodurre soltanto alcune parti a scelta dell'audio trasmesso da una radio web==
 
==Ascoltare e contemporaneamente riprodurre soltanto alcune parti a scelta dell'audio trasmesso da una radio web==
 
Se, mentre si ascolta una radio web, si intende solo ogni tanto e a scelta registrare l'audio trasmesso, si può adottare il seguente codice (sarà usato il plugin "''uridecodebin'' "):
 
Se, mentre si ascolta una radio web, si intende solo ogni tanto e a scelta registrare l'audio trasmesso, si può adottare il seguente codice (sarà usato il plugin "''uridecodebin'' "):
 
  Private pl As MediaPipeline
 
  Private pl As MediaPipeline
  Private tee As MediaControl
+
  Private temporaneo As String
Private cnv2 As MediaControl
 
Private ven As MediaControl
 
Private omu As MediaControl
 
Private snk2 As MediaControl
 
 
  Private i As Integer = -1
 
  Private i As Integer = -1
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
      
 
      
   ToggleButton1.Text = "Escucha radio"
+
   ToggleButton1.Text = "Avvia ascolto della radio"
   Button1.Enabled = False
+
   ToggleButton2.Text = "Registra l'audio"
  Button2.Enabled = False
 
 
   
 
   
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub ToggleButton1_Click()
+
  Public Sub ToggleButton1_Click()
 
      
 
      
 
   If ToggleButton1.Value Then
 
   If ToggleButton1.Value Then
 +
    temporaneo = Temp
 
     ToggleButton1.Text = "Chiudere il programma"
 
     ToggleButton1.Text = "Chiudere il programma"
    Button1.Enabled = True
 
    Button1.Text = "Registra l'audio"
 
    Button2.Enabled = True
 
    Button2.Text = "Arresta la registrazione\ne salva in un file OGG"
 
 
     Audio()
 
     Audio()
 
   Else
 
   Else
Riga 191: Riga 169:
 
   Endif
 
   Endif
 
   
 
   
  '''End'''
+
  End
 +
 +
 +
Public Sub ToggleButton2_Click()
 +
 +
  If ToggleButton2.Value Then
 +
    ToggleButton2.Text = "Arresta la registrazione\ne salva in un file OGG"
 +
    Audio()
 +
  Else
 +
    If Exist("/tmp/audio" & CStr(i) & ".ogg") Then Kill "/tmp/audio" & CStr(i) & ".ogg"
 +
    Copy temporaneo To "/tmp/audio" & CStr(i) & ".ogg"
 +
    ToggleButton2.Text = "Registra l'audio"
 +
  Endif
 
   
 
   
 +
End
 
   
 
   
'''Public''' Sub Button1_Click()
 
   
 
  Audio()
 
 
   
 
   
  '''End'''
+
  Private Procedure Audio()
 
   
 
   
'''Private''' Procedure Audio()
+
   Dim src, tee, que As MediaControl
   
 
   Dim src, que As MediaControl
 
 
   Dim cnv1, snk1 As MediaControl
 
   Dim cnv1, snk1 As MediaControl
 +
  Dim cnv2, ven, omu, snk2 As MediaControl
 
   Dim tm As Date
 
   Dim tm As Date
   
+
 
   pl = New MediaPipeline
 
   pl = New MediaPipeline
   
+
 
   src = New MediaControl(pl, "uridecodebin")
 
   src = New MediaControl(pl, "uridecodebin")
   src["uri"] = <FONT Color=gray>''"http&#058;//Indirizzo/web/del/flusso/dei/dati/audio/della/radio''</font>"
+
   src["uri"] = "https&#058;//mambo.newradio.it/stream"
   
+
 
   tee = New MediaControl(pl, "tee")
 
   tee = New MediaControl(pl, "tee")
 
   que = New MediaControl(pl, "queue")
 
   que = New MediaControl(pl, "queue")
 
+
 
  <FONT Color=gray>' ''Per ascoltare il flusso di dati audio della radio web:''</font>
 
  <FONT Color=gray>' ''Per ascoltare il flusso di dati audio della radio web:''</font>
 
   cnv1 = New MediaControl(pl, "audioconvert")
 
   cnv1 = New MediaControl(pl, "audioconvert")
 
   snk1 = New MediaControl(pl, "autoaudiosink")
 
   snk1 = New MediaControl(pl, "autoaudiosink")
 
+
 
  <FONT Color=gray>' ''Per registrare i dati audio e salvare il relativo file audio in formato OGG:''</font>
 
  <FONT Color=gray>' ''Per registrare i dati audio e salvare il relativo file audio in formato OGG:''</font>
 
   cnv2 = New MediaControl(pl, "audioconvert")
 
   cnv2 = New MediaControl(pl, "audioconvert")
 
   ven = New MediaControl(pl, "vorbisenc")
 
   ven = New MediaControl(pl, "vorbisenc")
 
   omu = New MediaControl(pl, "oggmux")
 
   omu = New MediaControl(pl, "oggmux")
 
+
 
  <FONT Color=gray>' ''Divide il flusso dei dati audio in due ramificazioni:''</font>
 
  <FONT Color=gray>' ''Divide il flusso dei dati audio in due ramificazioni:''</font>
 
   src.LinkLaterTo(tee)
 
   src.LinkLaterTo(tee)
 
+
 
  <FONT Color=gray>' ''1° ramo dei dati audio (per l'ascolto):''</font>
 
  <FONT Color=gray>' ''1° ramo dei dati audio (per l'ascolto):''</font>
 
   tee.LinkTo(que)
 
   tee.LinkTo(que)
 
   que.LinkTo(cnv1)
 
   que.LinkTo(cnv1)
 
   cnv1.LinkTo(snk1)
 
   cnv1.LinkTo(snk1)
 
+
 
  <FONT Color=gray>' ''2° ramo dei dati audio (per registrare):''</font>
 
  <FONT Color=gray>' ''2° ramo dei dati audio (per registrare):''</font>
 
   tee.LinkTo(cnv2)
 
   tee.LinkTo(cnv2)
Riga 236: Riga 223:
 
   ven.LinkTo(omu)
 
   ven.LinkTo(omu)
 
   snk2 = New MediaControl(pl, "filesink")
 
   snk2 = New MediaControl(pl, "filesink")
  Inc i
+
   snk2["location"] = temporaneo
   snk2["location"] = "/tmp/audio" & CStr(i) & ".ogg"
 
 
   omu.LinkTo(snk2)
 
   omu.LinkTo(snk2)
  If Exist("/tmp/audio0.ogg") Then Kill "/tmp/audio0.ogg"
+
         
 
 
   pl.Play()
 
   pl.Play()
           
+
  Button2.Enabled = True
 
           
 
 
   Repeat
 
   Repeat
 
     Wait 0.01
 
     Wait 0.01
 
   Until pl.State == Media.Playing
 
   Until pl.State == Media.Playing
       
+
 
   tm = Now
 
   tm = Now
       
+
 
   Repeat
 
   Repeat
     Me.Caption = Format(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)), "hh:nn:ss")
+
     Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
     Wait 0.01
+
     Wait 0.1
 
   Until pl.State == Media.Ready
 
   Until pl.State == Media.Ready
 
+
   
'''End'''
+
  End
   
 
   
 
  '''Public''' Sub Button2_Click()
 
 
 
  Move "/tmp/audio" & CStr(i) & ".ogg" To "/tmp/audiofinal" & CStr(i) & ".ogg"  <FONT Color=gray>' ''Qual è e dov'è il file audio salvato''</font>
 
  Button1.Enabled = True
 
  Button2.Enabled = False
 
 
 
  '''End'''
 

Versione attuale delle 08:59, 17 gen 2024

Per riprodurre e contemporaneamente registrare i dati audio di una radio web mediante le Classi "MediaPipeline" e "MediaControl" del Componente gb.media, è necessario dividere mediante il plugin "tee" di GStreamer il flusso di dati audio, sostanzialmente duplicandolo: un ramo servirà per l'uscita in riproduzione sonora, l'altro per l'uscita da salvare in un file audio.

Uso del plugin "uridecodebin" di GStreamer per decodificare l'audio in entrata

Nell'esempio in ambiente grafico, che segue, si utilizzerà il plugin uridecodebin per decodificare i dati audio ricevuti, che saranno riprodotti e anche salvati in un file di formato OGG.

Private pl As MediaPipeline
Private temporaneo As String


Public Sub ToggleButton1_Click()

 Dim src, tee, que As MediaControl
 Dim cnv1, snk1 As MediaControl
 Dim cnv2, ven, omu, snk2 As MediaControl

 If ToggleButton1.Value Then
   temporaneo = Temp

   pl = New MediaPipeline As "PLine"
       
   src = New MediaControl(pl, "uridecodebin")
   src["uri"] = "http://Indirizzo/web/del/flusso/dei/dati/audio/della/radio"
   
   tee = New MediaControl(pl, "tee")
   que = New MediaControl(pl, "queue")
    
' Per ascoltare l'audio della radio web:
   cnv1 = New MediaControl(pl, "audioconvert")
   snk1 = New MediaControl(pl, "autoaudiosink")
   
' Per salvare i dati del flusso audio della radio web in un file di formato OGG:
   cnv2 = New MediaControl(pl, "audioconvert")
   ven = New MediaControl(pl, "vorbisenc")
   omu = New MediaControl(pl, "oggmux")
   snk2 = New MediaControl(pl, "filesink")
   snk2["location"] = temporaneo
    
' Divide il flusso dei dati audio in due rami identici:
   src.LinkLaterTo(tee)
    
' 1° ramo dei dati audio (per la riproduzione sonora):
   tee.LinkTo(que)
   que.LinkTo(cnv1)
   cnv1.LinkTo(snk1)
    
' 2° ramo dei dati audio (per salvare i dati in un file OGG):
   tee.LinkTo(cnv2)
   cnv2.LinkTo(ven)
   ven.LinkTo(omu)
   omu.LinkTo(snk2)
    
   pl.Play()

   While pl.Position < 1
     Wait 0.01
   Wend
   Repeat
     Wait 0.01
   Until Not ToggleButton1.Value
 Else
   pl.Stop
   pl.Close
   If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg"
   Copy temporaneo To "/tmp/audio.ogg"
 Endif

End


Public Sub PLine_Position()

 Me.Title = Time(0, 0, 0, pl.Position * 1000)

End


Uso dei plugin "souphttpsrc" e "decodebin" di GStreamer per decodificare l'audio in entrata

In quest'altro esempio si farà uso dei plugin "souphttpsrc " e "decodebin " di GStreamer.

Public Sub ToggleButton1_Click()
 
 Dim pl As MediaPipeline
 Dim src, tee, que, dcd, cnv1, snk1 As MediaControl
 Dim dcd2, cnv2, vor, ogg, snk2 As MediaControl
 Dim temporaneo As String
 Dim tm As Date
    
 If ToggleButton1.Value Then
   temporaneo = Temp

   pl = New MediaPipeline
       
   src = New MediaControl(pl, "souphttpsrc")
   src["location"] = "https://uk2.streamingpulse.com/ssl/vcr2"
   
   tee = New MediaControl(pl, "tee")
   que = New MediaControl(pl, "queue")

' Per ascoltare l'audio della radio web:
   dcd = New MediaControl(pl, "decodebin")
   cnv1 = New MediaControl(pl, "audioconvert")
   snk1 = New MediaControl(pl, "autoaudiosink")

' Per salvare i dati del flusso audio della radio web in un file di formato OGG:
   dcd2 = New MediaControl(pl, "decodebin")
   cnv2 = New MediaControl(pl, "audioconvert")
   vor = New MediaControl(pl, "vorbisenc")
   ogg = New MediaControl(pl, "oggmux")
   snk2 = New MediaControl(pl, "filesink")
   snk2["location"] = temporaneo

' Divide il flusso dei dati audio in due rami identici:
   src.LinkTo(tee)

' 1° ramo dei dati audio (per la riproduzione sonora):
   tee.LinkTo(que)
   que.LinkTo(dcd)
   dcd.LinkLaterTo(cnv1)
   cnv1.LinkTo(snk1)

' 2° ramo dei dati audio (per salvare i dati in un file OGG):
   tee.LinkTo(dcd2)
   dcd2.LinkLaterTo(cnv2)
   cnv2.LinkTo(vor)
   vor.LinkTo(ogg)
   ogg.LinkTo(snk2)

   pl.Play()

   tm = Now

   Repeat
     Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
     Wait 0.1
   Until Not ToggleButton1.Value
 Else
   pl.Stop
   pl.Close
   If Exist("/tmp/audio.ogg") Then Kill "/tmp/audio.ogg"
   Copy temporaneo To "/tmp/audio.ogg"
 Endif

End


Ascoltare e contemporaneamente riprodurre soltanto alcune parti a scelta dell'audio trasmesso da una radio web

Se, mentre si ascolta una radio web, si intende solo ogni tanto e a scelta registrare l'audio trasmesso, si può adottare il seguente codice (sarà usato il plugin "uridecodebin "):

Private pl As MediaPipeline
Private temporaneo As String
Private i As Integer = -1


Public Sub Form_Open()
    
 ToggleButton1.Text = "Avvia ascolto della radio"
 ToggleButton2.Text = "Registra l'audio"

End


Public Sub ToggleButton1_Click()
    
 If ToggleButton1.Value Then
   temporaneo = Temp
   ToggleButton1.Text = "Chiudere il programma"
   Audio()
 Else
   pl.Stop
   pl.Close
   Me.Close
 Endif

End


Public Sub ToggleButton2_Click()

 If ToggleButton2.Value Then 
   ToggleButton2.Text = "Arresta la registrazione\ne salva in un file OGG"
   Audio()
 Else 
   If Exist("/tmp/audio" & CStr(i) & ".ogg") Then Kill "/tmp/audio" & CStr(i) & ".ogg"
   Copy temporaneo To "/tmp/audio" & CStr(i) & ".ogg"
   ToggleButton2.Text = "Registra l'audio"
 Endif

End


Private Procedure Audio()

 Dim src, tee, que As MediaControl
 Dim cnv1, snk1 As MediaControl
 Dim cnv2, ven, omu, snk2 As MediaControl
 Dim tm As Date

 pl = New MediaPipeline

 src = New MediaControl(pl, "uridecodebin")
 src["uri"] = "https://mambo.newradio.it/stream"

 tee = New MediaControl(pl, "tee")
 que = New MediaControl(pl, "queue")

' Per ascoltare il flusso di dati audio della radio web:
 cnv1 = New MediaControl(pl, "audioconvert")
 snk1 = New MediaControl(pl, "autoaudiosink")

' Per registrare i dati audio e salvare il relativo file audio in formato OGG:
 cnv2 = New MediaControl(pl, "audioconvert")
 ven = New MediaControl(pl, "vorbisenc")
 omu = New MediaControl(pl, "oggmux")

' Divide il flusso dei dati audio in due ramificazioni:
 src.LinkLaterTo(tee)

' 1° ramo dei dati audio (per l'ascolto):
 tee.LinkTo(que)
 que.LinkTo(cnv1)
 cnv1.LinkTo(snk1)

' 2° ramo dei dati audio (per registrare):
 tee.LinkTo(cnv2)
 cnv2.LinkTo(ven)
 ven.LinkTo(omu)
 snk2 = New MediaControl(pl, "filesink")
 snk2["location"] = temporaneo
 omu.LinkTo(snk2)

 pl.Play()

 Repeat
   Wait 0.01
 Until pl.State == Media.Playing

 tm = Now

 Repeat
   Me.Title = Str(Time(0, 0, 0, DateDiff(tm, Now, gb.Millisecond)))
   Wait 0.1
 Until pl.State == Media.Ready

End