Creare un Client di Jack con le funzioni esterne del API di libJack e GStreamer
Da Gambas-it.org - Wikipedia.
Versione del 18 giu 2024 alle 05:08 di Vuott (Discussione | contributi)
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
- http://jackaudio.org Jack Audio Connection Kit
- http://jackaudio.org/files/docs/html/index.html
- https://github.com/jackaudio/jackaudio.github.com/wiki/Q_difference_jack1_jack2
- https://github.com/jackaudio/example-clients
- http://jackit.sourceforge.net/cgi-bin/lxr/http/source/example-clients/
- https://www.crudebyte.com/jack-ios/sdk/doc/getting_started.html