Gestione dei dati media creando una libreria .so personalizzata con le funzioni esterne del API di GStreamer

Da Gambas-it.org - Wikipedia.

In questa pagina mostreremo come creare una nostra libreria dinamica condivisa .so esterna, il cui sorgente verrà scritto in linguaggio C, con le funzioni esterne della libreria di GStreamer

Tale libreria esterna .so sarà personalizzata, nelsenso che verranno create alcune essenziali funzioni per la gestione dei dati di file mediali. Le funzioni di questa nostra libreria .so verranno ovviamente richiamate ed utilizzate all'interno di un'applicazione Gambas.

Questa risorsa, non dovendo diventare un Componente del nostro Gambas, ma restando una mera libreria esterna, non ci obbliga ad installarla nel nostro sistema, e ci consente così di crearla e di gestirla direttamente con l'applicazione Gambas in maniera molto elastica e semplice. Il codice sorgente verrà quindi scritto all'interno dell'applicazione Gambas che utilizzerà poi le sue funzioni.

Mostriamo un esempio pratico:

Private p As Pointer
Private Tempus As Timer


Library "/tmp/LibreriaGSTR"

Private Extern CaricaFile(nombrefile As String) As Pointer
Private Extern Esegue(GSelement As Pointer) As Long
Private Extern Stop(GSelement As Pointer) As Integer
Private Extern Pausa(GSelement As Pointer) As Integer
Private Extern Continua(GSelement As Pointer) As Integer
Private Extern Tempo(GSelement As Pointer) As Long


Public Sub Form_Open()
 
  ScriveLibreria()
 
  With Tempus = New Timer As "Tempus"
   .Delay = 70
  End With
 
End


Public Sub Button1_Click()
 
 Dim durata As Long
 
  p = CaricaFile("/percorso/del/file/media")
  
  Tempus.Start
   
  durata = Esegue(p)
  
  Print "Durata: "; CStr(Date(0, 0, 0, 0, 0, 0, durata / 1000000))
  
End


Public Sub Button2_Click()
 
  Stop(p)
 
  Tempus.Stop
 
End


Public Sub ToggleButton1_Click()
 
  If ToggleButton1.Value Then
    Pausa(p)
    Tempus.Stop
  Else
    Continua(p)
    Tempus.Start
  Endif

 End


Public Sub Tempus_Timer()

 Dim posizione As Long
 
  posizione = Tempo(p)
  
  Write #File.Out, "\rPosizione: " & Date(0, 0, 0, 0, 0, 0, posizione / 1000000)
  
End


Private Procedure ScriveLibreria()
 
 Dim s As String
 
  s = "#include <gstreamer-1.0/gst/gst.h>\n#include <unistd.h>\n" &   ' Specifica le librerie necessarie
      "\nGstElement * CaricaFile(char *file) {" &   ' Scrive la funzione per caricare il file media
      "\nGstElement *pipeline;" &
      "\ngst_init (0, NULL);" &
      "\npipeline = gst_element_factory_make (\"playbin\", NULL);" &
      "\ng_object_set (pipeline, \"uri\", g_filename_to_uri(file, NULL, NULL), NULL);" &
      "\nreturn pipeline;\n}\n" &   ' Ritorna un "Puntatore"
      "\ngint64 Esegue(GstElement *pipeline) {" &   ' Scrive la funzione per eseguire il file media
      "\ngint64 durata;" &
      "\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
      "\nusleep(1000000);" &
      "\ngst_element_query_duration(pipeline, GST_FORMAT_TIME, &durata);" &
      "\nreturn durata;\n}\n" &   ' Ritorna la durata della esecuzione del file media
      "\nint Pausa(GstElement *pipeline) {" &   ' Scrive la funzione per porre in pausa l'esecuzione del file media
      "\ngst_element_set_state (pipeline, GST_STATE_PAUSED);" &
      "\nreturn 0;\n}\n" &   ' Se non vi sono errori, ritorna il valore 0
      "\nint Continua(GstElement *pipeline) {" &   ' Scrive la funzione per proseguire l'esecuzione del file precedentemente posto in pausa
      "\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
      "\nreturn 0;\n}\n" &   ' Se non vi sono errori, ritorna il valore 0
      "\nint Stop(GstElement *pipeline) {" &   ' Scrive la funzione per terminare l'esecuzione del file media
      "\ngst_element_set_state (pipeline, GST_STATE_NULL);" &
      "\ngst_object_unref (pipeline);" &
      "\nreturn 0;\n}\n" &   ' Se non vi sono errori, ritorna il valore 0
      "\ngint64 Tempo(GstElement *pipeline) {" &   ' Scrive la funzione per sapere cuanto tempo è passato dall'inizio dell'esecuzione del file media
      "\ngint64 positio;" &
      "\ngst_element_query_position(pipeline, GST_FORMAT_TIME, &positio);" &
      "\nreturn positio;\n}\n"   ' Ritorna il valore del tempo trascorso
 
' Salva il codice sorgente della nostra libreria .so personalizzata:
      File.Save("/tmp/LibreriaGSTR.c", s)
        
' Crea la nostra libreria .so personalizzata:
      Shell "gcc -o /tmp/LibreriaGSTR.so  /tmp/LibreriaGSTR.c -shared -fPIC `pkg-config --cflags --libs gstreamer-1.0`" Wait
  
End