Creare un Client di Jack con le funzioni esterne del API di libJack e GStreamer

Da Gambas-it.org - Wikipedia.

E' possibile creare un Client di Jack mediante le funzioni esterne della libreria libJack e del API di GStreamer.

Per poter fruire in Gambas delle risorse di Jack e di GStreamer, è necessario avere installate e richiamare le librerie dinamiche condivise:

  • libgstreamer-0.10.so.0.30.0
  • libjack.so.0.1.0


Mostriamo di seguito un esempio di creazione di due Client di Jack con connessione delle proprie porte al Server jack di tipo stereo:

Private pipeline As Pointer


Library "libgstreamer-0.10:0.30.0"

Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Private Enum GST_STATE_CHANGE_FAILURE = 0, GST_STATE_CHANGE_SUCCESS, GST_STATE_CHANGE_ASYNC, GST_STATE_CHANGE_NO_PREROLL

' gst_init (int *argc, char **argv[])
' Initializes the GStreamer library, setting up internal path lists, registering built-in elements, and loading standard plugins.
Private Extern gst_init(argc As Pointer, argv As Pointer)

' GstElement * gst_pipeline_new (const gchar *name)
' Create a new pipeline with the given name.
Private Extern gst_pipeline_new(name As String) As Pointer

' GstElement * gst_element_factory_make(const gchar *factoryname, Const gchar * name)
' Create a new element of the type defined by the given element factory.
Private Extern gst_element_factory_make(factoryname As String, name As String) As Pointer

' void g_object_set(gpointer object, const gchar *first_property_name, ...)
' Sets properties on an object.
Private Extern g_object_set(gobject As Pointer, key As String, jclient As Pointer, pointer_3 As Pointer)

' void gst_bin_add_many (GstBin *bin, GstElement *element_1, ...)
' Adds a NULL-terminated list of elements to a bin.
Private Extern gst_bin_add_many(Gstbin As Pointer, element_1 As Pointer, element_2 As Pointer, element_3 As Pointer)

' gboolean gst_element_link (GstElement *src, GstElement *dest)
' Links src to dest.
Private Extern gst_element_link(src As Pointer, dest As Pointer) As Boolean

' GstStateChangeReturn gst_element_set_state(GstElement *element, GstState state)
' Sets the state of the element.
Private Extern gst_element_set_state(gstelement As Pointer, state As Integer) As Integer

' void gst_object_unref(gpointer object)
' Decrements the reference count on object.
Private Extern gst_object_unref(gobject As Pointer)


Library "libjack:0.1.0"

Private Enum JackNullOption = 0, JackNoStartServer, JackUseExactName, JackServerName = 4 
Private Enum JackFailure = 1, JackInvalidOption, JackNameNotUnique = 4, JackServerStarted = 8, 
             JackServerFailed = &10, JackServerError = &20, JackNoSuchClient = &40, JackLoadFailure = &80
 
' jack_client_t * jack_client_open (const char *client_name, jack_options_t options, jack_status_t *status,...)
' Open an external client session with a JACK server.
Private Extern jack_client_open(client_name As String, options As Integer, status As Pointer, server_name As String) As Pointer


Public Sub Form_Open()
  
  gst_init(0, 0)
  
End


Public Sub Button1_Click()
 
 Dim src_client, sink_client As Pointer
 Dim src, sink As Pointer
 Dim status, rit As Integer
 Dim bo As Boolean
 
' Crea i Client di Jack:
  src_client = jack_client_open("src_client", JackNoStartServer, VarPtr(status), Null)
  If src_client = 0 Then
    If status And JackServerFailed Then
      Error.Raise("Il server Jack non è in funzione !")
    Else
      Error.Raise("Impossibile creare un Client di Jack, status: " & status)
    Endif
  Endif
  
  
  sink_client = jack_client_open("sink_client", JackNoStartServer, VarPtr(status), Null)
  If sink_client = 0 Then
    If status And JackServerFailed Then
      Error.Raise("Il server Jack non è in funzione !")
    Else
      Error.Raise("Impossibile creare un Client di Jack, status: " & status)
    Endif
  Endif
   
  
' Crea gli elementi GStreamer:
  pipeline = gst_pipeline_new("pipeline")
   
  src = gst_element_factory_make("jackaudiosrc", Null)
  sink = gst_element_factory_make("jackaudiosink", Null)
   
  g_object_set(src, "client", src_client, 0)
  g_object_set(sink, "client", sink_client, 0)
   
  gst_bin_add_many(pipeline, src, sink, 0)
   
' Collega gli elementi GStreamer:
  bo = gst_element_link(src, sink)
  If bo = False Then Error.Raise("Impossibile collegare gli elementi GStreamer !")
   
' Avvia:
  rit = gst_element_set_state(pipeline, GST_STATE_PLAYING)
  If rit = GST_STATE_CHANGE_FAILURE Then Error.Raise("Impossibile far funzionare la pipeline di elementi GStreamer !")
      
End


Public Sub Button2_Click()   ' Chiude i collegamenti delle porte
  
  gst_element_set_state(pipeline, GST_STATE_NULL)
  gst_object_unref(pipeline)
  
End



Riferimenti