Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 1
 
 
Crear Una Librería .so Personalizada Con Las Funciones Externas De GStreamer.
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Crear Una Librería .so Personalizada Con Las Funciones Externas De GStreamer. 
 
Vimos en este tema:
http://www.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

 



 
última edición por vuott el Miercoles, 12 Agosto 2015, 12:58; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Crear Una Librería .so Personalizada Con Las Funciones Externas De GStreamer. 
 
Muy bueno. Es una forma de expandir gambas... supongo. A mí se me escapa, que cuando oigo decir C como que me salen granos...   
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Crear Una Librería .so Personalizada Con Las Funciones Externas De GStreamer. 
 
shordi escribió: [Ver mensaje]
Es una forma de expandir gambas... supongo.

Es asì !  


shordi escribió: [Ver mensaje]
A mí se me escapa, que cuando oigo decir C como que me salen granos...


" Noli ledere C linguam ! "
 



 
última edición por vuott el Sabado, 15 Agosto 2015, 01:57; editado 1 vez 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
Ocultar¡Este tema fue útil?

 

Elegir valoración:                       

Media de valoración Valoración mínima Valoración máxima Número de valoraciones
0.00 0 0 0
 

Publicar nuevo tema  Responder al tema  Página 1 de 1
 

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 0 invitados
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
No puede descargar archivos
No puede publicar eventos en el calendario