Differenze tra le versioni di "Creare un Client di Jack con le funzioni esterne del API di libJack e GStreamer"

Da Gambas-it.org - Wikipedia.
(Creata pagina con "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 ''Ja...")
 
Riga 2: Riga 2:
  
 
Per poter fruire in Gambas delle risorse di ''Jack'' e di ''GStreamer'', è necessario avere installate e richiamare le librerie dinamiche condivise:
 
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''
+
* ''libgstreamer-1.0.so.0.2403.0''
 
* ''libjack.so.0.1.0''
 
* ''libjack.so.0.1.0''
  
Riga 10: Riga 10:
 
   
 
   
 
   
 
   
  Library "libgstreamer-0.10:0.30.0"
+
  Library "libgstreamer-1.0:0.2403.0"
 
   
 
   
 
  Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
 
  Private Enum GST_STATE_VOID_PENDING = 0, GST_STATE_NULL, GST_STATE_READY, GST_STATE_PAUSED, GST_STATE_PLAYING
Riga 59: Riga 59:
 
   
 
   
 
   
 
   
  '''Public''' Sub Form_Open()
+
  Public Sub Form_Open()
 
    
 
    
 
   gst_init(0, 0)
 
   gst_init(0, 0)
 
    
 
    
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button1_Click()
+
  Public Sub Button1_Click()
 
    
 
    
 
   Dim src_client, sink_client As Pointer
 
   Dim src_client, sink_client As Pointer
Riga 74: Riga 74:
 
    
 
    
 
  <FONT Color=gray>' ''Crea i Client di Jack:''</font>
 
  <FONT Color=gray>' ''Crea i Client di Jack:''</font>
  src_client = jack_client_open("src_client", JackNoStartServer, VarPtr(status), Null)
+
  src_client = jack_client_open("src_client", JackNoStartServer, VarPtr(status), Null)
  If src_client = 0 Then
+
  If src_client == 0 Then
    If status And JackServerFailed Then
+
    If status And JackServerFailed Then
      Error.Raise("Il server Jack non è in funzione !")
+
      Error.Raise("Il server Jack non è in funzione !")
    Else
+
    Else
      Error.Raise("Impossibile creare un Client di Jack, status: " & status)
+
      Error.Raise("Impossibile creare un Client di Jack, status: " & status)
    Endif
+
    Endif
  Endif
+
  Endif
 
    
 
    
 
+
  sink_client = jack_client_open("sink_client", JackNoStartServer, VarPtr(status), Null)
  sink_client = jack_client_open("sink_client", JackNoStartServer, VarPtr(status), Null)
+
  If sink_client == 0 Then
  If sink_client = 0 Then
+
    If status And JackServerFailed Then
    If status And JackServerFailed Then
+
      Error.Raise("Il server Jack non è in funzione !")
      Error.Raise("Il server Jack non è in funzione !")
+
    Else
    Else
+
      Error.Raise("Impossibile creare un Client di Jack, status: " & status)
      Error.Raise("Impossibile creare un Client di Jack, status: " & status)
+
    Endif
    Endif
+
  Endif
  Endif
 
 
      
 
      
 
 
 
  <FONT Color=gray>' ''Crea gli elementi GStreamer:''</font>
 
  <FONT Color=gray>' ''Crea gli elementi GStreamer:''</font>
  pipeline = gst_pipeline_new("pipeline")
+
  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)
 
 
      
 
      
 +
  src = gst_element_factory_make("jackaudiosrc", Null)
 +
  If src == 0 Then Error.Raise("Errore !")
 +
  sink = gst_element_factory_make("jackaudiosink", Null)
 +
  If sink == 0 Then Error.Raise("Errore !")
 +
 
 +
  g_object_set(src, "client", src_client, 0)
 +
  g_object_set(sink, "client", sink_client, 0)
 +
 
 +
  gst_bin_add_many(pipeline, src, sink, 0)
 +
 
 
  <FONT Color=gray>' ''Collega gli elementi GStreamer:''</font>
 
  <FONT Color=gray>' ''Collega gli elementi GStreamer:''</font>
  bo = gst_element_link(src, sink)
+
  bo = gst_element_link(src, sink)
  If bo = False Then Error.Raise("Impossibile collegare gli elementi GStreamer !")
+
  If bo = False Then Error.Raise("Impossibile collegare gli elementi GStreamer !")
 
      
 
      
 
  <FONT Color=gray>' ''Avvia:''</font>
 
  <FONT Color=gray>' ''Avvia:''</font>
  rit = gst_element_set_state(pipeline, GST_STATE_PLAYING)
+
  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 !")
+
  If rit = GST_STATE_CHANGE_FAILURE Then Error.Raise("Impossibile far funzionare la pipeline di elementi GStreamer !")
 
        
 
        
  '''End'''
+
  End
 
   
 
   
 
   
 
   
  '''Public''' Sub Button2_Click()  <FONT Color=gray>' ''Chiude i collegamenti delle porte''</font>
+
  Public Sub Button2_Click()  <FONT Color=gray>' ''Chiude i collegamenti delle porte''</font>
 
    
 
    
 
   gst_element_set_state(pipeline, GST_STATE_NULL)
 
   gst_element_set_state(pipeline, GST_STATE_NULL)
 
   gst_object_unref(pipeline)
 
   gst_object_unref(pipeline)
 
    
 
    
  '''End'''
+
  End
 
 
  
  

Versione delle 05:11, 4 giu 2024

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-1.0.so.0.2403.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-1.0:0.2403.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)
 If src == 0 Then Error.Raise("Errore !")
 sink = gst_element_factory_make("jackaudiosink", Null)
 If sink == 0 Then Error.Raise("Errore !")
  
 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