Duplicare il flusso dei dati audio di una pipeline della Classe ''MediaPipeline'' del componente gb.media

Da Gambas-it.org - Wikipedia.

Duplicando il flusso dei dati audio di un Oggetto pipeline della Classe MediaPipeline del componente gb.media, si ottiene una sorta di ramificazione del flusso che consente di gestire ciascun flusso di dati audio in modo del tutto autonomo.

La duplicazione del flusso audio principale è compiuta con l'elemento "Tee".

Vediamo di seguito un esempio pratico utilizzando un file audio di tipo WAV. In questo esempio le due ramificazioni del flusso di dati audio resteranno indipendenti sino alla fine, ossia sino al loro invio all'elemento di riproduzione audio.

Public Sub Main()

 Dim pl As MediaPipeline
 Dim src, tee, que As MediaControl
 Dim vor, cnv, res, pan, vol, snk As MediaControl
 Dim vor2, cnv2, res2, pan2, pit, snk2 As MediaControl
 
 pl = New MediaPipeline 
  
 src = New MediaControl(pl, "filesrc")
 src["location"] = "/percorso/del/file/audio.wav"
 tee = New MediaControl(pl, "tee")
 que = New MediaControl(pl, "queue")
 
 vor = New MediaControl(pl, "wavparse")
 cnv = New MediaControl(pl, "audioconvert")
 res = New MediaControl(pl, "audioresample")
 pan = New MediaControl(pl, "audiopanorama")
 pan["panorama"] = 1.00   ' Pan a destra
 vol = New MediaControl(pl, "volume")
 vol["volume"] = 0.5
 snk = New MediaControl(pl, "autoaudiosink")
  
 vor2 = New MediaControl(pl, "wavparse")
 cnv2 = New MediaControl(pl, "audioconvert")
 res2 = New MediaControl(pl, "audioresample")
 pan2 = New MediaControl(pl, "audiopanorama")
 pan2["panorama"] = -1.00   ' Pan a sinistra
 pit = New MediaControl(pl, "pitch")
 pit["pitch"] = 0.8
 snk2 = New MediaControl(pl, "autoaudiosink")
 
' Il flusso dei dati audio viene diviso in due rami:
 src.LinkTo(tee)
  
' 1° ramo dei dati audio:
 tee.LinkTo(que)
 que.LinkTo(vor)
 vor.LinkTo(cnv)
 cnv.LinkTo(res)
 res.LinkTo(pan)
 pan.LinkTo(vol)
 vol.LinkTo(snk)
  
' 2° ramo dei dati audio:
 tee.LinkTo(vor2)
 vor2.LinkTo(cnv2)
 cnv2.LinkTo(res2)
 res2.LinkTo(pan2)
 pan2.LinkTo(pit)
 pit.LinkTo(snk2)
  
 pl.Play()
      
 While pl.Duration > pl.Position
   Write "\rTempo: " & Date(0, 0, 0, 0, 0, 0, pl.Position * 1000)
   Wait 0.001
 Wend
  
 pl.Stop()
 pl.Close()
  
End