http://foro.gambas-es.org/viewtopic.php?f=17&t=4808
un codigo fuente, en lenguaje C, para ejecutar archivos audio/Midi/video con las funciones externas de GStreamer.
Ahora vamos a ver como crear una nuestra librería dinámica .so (shared library) personalizada con aquellas funciones externas. Librería que podremos utilizar en una nuestra aplicacion de Gambas.
La librería dinámica .so no nos obliga a instalarla en el sistema operativo, no debe ser instalada. Por eso la escribiremos dentro el nuestro programa principal de gambas, creandola y manejandola en manera muy elástica.
Private p As Pointer
Library "/tmp/LibreriaGSTR"
Private Extern CargaFile(nombrefile As String) As Pointer
Private Extern Ejecuta(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 Posic(GSelement As Pointer) As Long
Public Sub Form_Open()
EscribeLibreria()
Timer1.Delay = 70
End
Public Sub Button1_Click()
Dim duracion As Long
p = CargaFile("/ruta/del/file/media")
Timer1.Start
duracion = Ejecuta(p)
Print "Duración: "; CStr(Date(0, 0, 0, 0, 0, 0, duracion / 1000000))
End
Public Sub Button2_Click()
Stop(p)
Timer1.Stop
End
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
Pausa(p)
Timer1.Stop
Else
Continua(p)
Timer1.Start
Endif
End
Public Sub Timer1_Timer()
Dim posicion As Long
posicion = Posic(p)
Write #File.Out, "\rPosición: " & Date(0, 0, 0, 0, 0, 0, posicion / 1000000)
End
Private Procedure EscribeLibreria()
Dim s As String
s = "#include <gstreamer-1.0/gst/gst.h>\n#include <unistd.h>\n" & ' Especifica las librerías necesarias
"\nGstElement * CargaFile(char *file) {" & ' Escribe la función para cargar el archivo 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" & ' Devuelve un Puntero
"\ngint64 Ejecuta(GstElement *pipeline) {" & ' Escribe la función para ejecutar el archivo media
"\ngint64 duracion;" &
"\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
"\nusleep(1000000);" &
"\ngst_element_query_duration(pipeline, GST_FORMAT_TIME, &duracion);" &
"\nreturn duracion;\n}\n" & ' Devuelve la duración de la ejecución del archivo media
"\nint Pausa(GstElement *pipeline) {" & ' Escribe la función para poner en pausa la ejecución del archivo media
"\ngst_element_set_state (pipeline, GST_STATE_PAUSED);" &
"\nreturn 0;\n}\n" & ' Si es todo bien, devuelve 0
"\nint Continua(GstElement *pipeline) {" & ' Escribe la función para continuar la ejecución del archivo ya puesto en pausa.
"\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
"\nreturn 0;\n}\n" & ' Si es todo bien, devuelve 0
"\nint Stop(GstElement *pipeline) {" & ' Escribe la función para acabar la ejecución del archivo
"\ngst_element_set_state (pipeline, GST_STATE_NULL);" &
"\ngst_object_unref (pipeline);" &
"\nreturn 0;\n}\n" & ' Si es todo bien, devuelve 0
"\ngint64 Posic(GstElement *pipeline) {" & ' Escribe la función para saber cuanto tiempo es pasado desde el principio de la ejecución del archivo
"\ngint64 positio;" &
"\ngst_element_query_position(pipeline, GST_FORMAT_TIME, &positio);" &
"\nreturn positio;\n}\n" ' Devuelve el valor del tiempo pasado
' Guarda el codigo fuente de la nuestra libreria personalizada:
File.Save("/tmp/LibreriaGSTR.c", s)
' Crea la nuestra libreria personalizada:
Shell "gcc -o /tmp/LibreriaGSTR.so /tmp/LibreriaGSTR.c -shared -fPIC `pkg-config --cflags --libs gstreamer-1.0`" Wait
End
Library "/tmp/LibreriaGSTR"
Private Extern CargaFile(nombrefile As String) As Pointer
Private Extern Ejecuta(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 Posic(GSelement As Pointer) As Long
Public Sub Form_Open()
EscribeLibreria()
Timer1.Delay = 70
End
Public Sub Button1_Click()
Dim duracion As Long
p = CargaFile("/ruta/del/file/media")
Timer1.Start
duracion = Ejecuta(p)
Print "Duración: "; CStr(Date(0, 0, 0, 0, 0, 0, duracion / 1000000))
End
Public Sub Button2_Click()
Stop(p)
Timer1.Stop
End
Public Sub ToggleButton1_Click()
If ToggleButton1.Value Then
Pausa(p)
Timer1.Stop
Else
Continua(p)
Timer1.Start
Endif
End
Public Sub Timer1_Timer()
Dim posicion As Long
posicion = Posic(p)
Write #File.Out, "\rPosición: " & Date(0, 0, 0, 0, 0, 0, posicion / 1000000)
End
Private Procedure EscribeLibreria()
Dim s As String
s = "#include <gstreamer-1.0/gst/gst.h>\n#include <unistd.h>\n" & ' Especifica las librerías necesarias
"\nGstElement * CargaFile(char *file) {" & ' Escribe la función para cargar el archivo 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" & ' Devuelve un Puntero
"\ngint64 Ejecuta(GstElement *pipeline) {" & ' Escribe la función para ejecutar el archivo media
"\ngint64 duracion;" &
"\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
"\nusleep(1000000);" &
"\ngst_element_query_duration(pipeline, GST_FORMAT_TIME, &duracion);" &
"\nreturn duracion;\n}\n" & ' Devuelve la duración de la ejecución del archivo media
"\nint Pausa(GstElement *pipeline) {" & ' Escribe la función para poner en pausa la ejecución del archivo media
"\ngst_element_set_state (pipeline, GST_STATE_PAUSED);" &
"\nreturn 0;\n}\n" & ' Si es todo bien, devuelve 0
"\nint Continua(GstElement *pipeline) {" & ' Escribe la función para continuar la ejecución del archivo ya puesto en pausa.
"\ngst_element_set_state(pipeline, GST_STATE_PLAYING);" &
"\nreturn 0;\n}\n" & ' Si es todo bien, devuelve 0
"\nint Stop(GstElement *pipeline) {" & ' Escribe la función para acabar la ejecución del archivo
"\ngst_element_set_state (pipeline, GST_STATE_NULL);" &
"\ngst_object_unref (pipeline);" &
"\nreturn 0;\n}\n" & ' Si es todo bien, devuelve 0
"\ngint64 Posic(GstElement *pipeline) {" & ' Escribe la función para saber cuanto tiempo es pasado desde el principio de la ejecución del archivo
"\ngint64 positio;" &
"\ngst_element_query_position(pipeline, GST_FORMAT_TIME, &positio);" &
"\nreturn positio;\n}\n" ' Devuelve el valor del tiempo pasado
' Guarda el codigo fuente de la nuestra libreria personalizada:
File.Save("/tmp/LibreriaGSTR.c", s)
' Crea la nuestra libreria personalizada:
Shell "gcc -o /tmp/LibreriaGSTR.so /tmp/LibreriaGSTR.c -shared -fPIC `pkg-config --cflags --libs gstreamer-1.0`" Wait
End