Autore Topic: Creare un semplice Client di Jack Audio Connection Kit  (Letto 1613 volte)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Creare un semplice Client di Jack Audio Connection Kit
« il: 21 Febbraio 2014, 16:49:48 »
Come creare un semplicissimo Client del server audio Jack Audio Connection Kit:

http://www.gambas-it.org/wiki/index.php?title=Creare_un_semplice_Client_di_Jack
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: Creare un semplice Client di Jack Audio Connection Kit
« Risposta #1 il: 21 Febbraio 2014, 18:27:27 »
molto interessante vuott ....

da un po' di tempo cercavo uno spunto per iniziare un progetto basao su Jack .... appena andato in pensione ne riparliamo :D
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #2 il: 24 Febbraio 2016, 23:41:00 »
ciao VUOTT, ben ritrovato :D

Allora ricapitolando, prendo un editor di testo e ci metto il codice del tuo esempio C ... chiamato come nel tuo esempio  jk.c

Ora ho strasformato il file jk.c in un file oggetto jk.o con:
gcc -fPIC -Wall -g -c jk.c

PS: prima ho installato le librerie di jack server 2 con:  sudo apt-get install libjack-jackd2-dev

A questo punto come proseguo? Da quello che leggo (http://www.gambas-it.org/wiki/index.php?title=Creare_una_Libreria_condivisa_(Shared_Library)_.so) dovrei usare un comando tipo:
gcc -g -shared -Wl,-soname,libprimo.so.0 -o libprimo.so.0.0 primo.o -lc

per generare la jk.so .... ma ... devo usare la libreria condivisa "vera" di jack? Ovvero la riga e' :
gcc -g -shared -Wl,-soname,libjack.so.0 -o jk.so.0.0 jk.o -lc

????


oppure (per avere come output un file .so) uso questo comando?:
gcc -g -shared -Wl,-soname,libjack.so.0 -o jk.so jk.o -lc

in C so veramente una mezza ..... :bad:
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #3 il: 24 Febbraio 2016, 23:46:54 »
No, è molto più semplice la cosa: in un editor di testo incolli il codice C e salvi il testo ad esempio nella cartella /tmp con il nome jk.c .

In tal caso nel codice Gambas dovrai solo cambiare la riga:
 Shell "gcc -o  /tmp/libjk.so " & Application.Path &/ "jk.c -shared -fPIC -ljack"

con questa nuova:
Codice: [Seleziona]
Shell "gcc -o  /tmp/libjk.so /tmp/jk.c -shared -fPIC -ljack"

Sarà questa riga, appunto, a creare la libreria esterna dinamica condivisa .so ad hoc .

« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #4 il: 25 Febbraio 2016, 00:13:34 »
Perfetto!

il fatto di usare gli spazi nella cartella del progetto gambas non aiutava ... :D
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #5 il: 25 Febbraio 2016, 00:23:52 »
Mooooolto bene !!!    :D

Ho variato il codice facilitando la creazione del sorgente della libreria ad hoc direttamente da Gambas.
Provalo e fammi sapere se funziona ugualmente.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #6 il: 25 Febbraio 2016, 11:19:29 »
Perfetto! Funziona benissimo :D

Pero' nel wiki la sezione relativa al codice C e' rimasta un po' confusa ..... magari sarebbe da fare riferimento al fatto che il codice c e' incluso nella procedura CreaLibjk dell'applicazione gambas.


Ho fatto qualche modifica "duplicando" le porte di in e out:
Codice: [Seleziona]
Private input_port_right As Pointer   'AGGIUNTA PER LO STEREO
Private output_port_right As Pointer  'AGGIUNTA PER LO STEREO
nelle dichiarazioni ...

e
Codice: [Seleziona]
input_port_right = jack_port_register(client, "input_2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0)         'AGGIUNTA PER LO STEREO
output_port_right = jack_port_register(client, "output_2", JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput, 0)      'AGGIUNTA PER LO STEREO
If (input_port_right = 0) Or (output_port_right = 0) Then Print "Nessuna porta di Jack disponibile !"         'AGGIUNTA PER LO STEREO

ed effettivamente jack riconoscie le porte di in e out ....

Ma suppongo che dovro' lavorare su CreaLibjk per avere il feedback audio come succede sul canale left ......


Codice: [Seleziona]
  File.Save("/tmp/jk.c", "#include <string.h>\n" &
           "#include <jack/jack.h>" &
           "\n\n" &
           "jack_port_t *input_port_left;\n" &
           "jack_port_t *input_port_right;\n" &     'AGGIUNTA PER LO STEREO
           "jack_port_t  *output_port_left;\n" &
           "jack_port_t  *output_port_right;\n" &   'AGGIUNTA PER LO STEREO
           "jack_client_t *client;" &
           "\n\n" &
           "int process (jack_nframes_t, void *);" &
           "\n\n" &
         "void principale (jack_client_t *cl, jack_port_t *it, jack_port_t *ot) {\n" &
           "   client = cl;\n" &
           "   input_port_left = it;\n" &
           "   input_port_right = it;\n" &      'AGGIUNTA PER LO STEREO
           "   output_port_left = ot;\n" &
           "   output_port_right = ot;\n\n" &     'AGGIUNTA PER LO STEREO
           "   jack_set_process_callback (client, process, 0);\n}" &
           "\n\n" &
         "int process (jack_nframes_t nframes, void *arg) {\n"
           "   jack_default_audio_sample_t *in, *out;\n" &
           "   in = jack_port_get_buffer (input_port_left, nframes);\n" &
           "   out = jack_port_get_buffer (output_port_left, nframes);\n\n" &
           "   memcpy (out, in, sizeof (jack_default_audio_sample_t) * nframes);\n\n" &
           "   return 0;\n}\n")


manca qualcosa in in e out .....
« Ultima modifica: 25 Febbraio 2016, 14:34:47 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #7 il: 25 Febbraio 2016, 14:20:58 »
se inputport  e outputport le trasformo in inputport_left e inputport_right e outputport_left e outputport_right .... Che definisco opportunamente, posso gestire un client stereo?

Quelle sono semplicemente delle variabili di tipo Puntatore.
Suppongo che l'effetto stereo sia legato solo ai dati trasmessi (ad esempio un file audio wav di due canali è sempre comunque un unico file).
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #8 il: 25 Febbraio 2016, 14:35:51 »
penso che jack lavori sempre in mono ... stereo sono sue jack mono accoppiati ....
« Ultima modifica: 25 Febbraio 2016, 14:37:17 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #9 il: 25 Febbraio 2016, 14:48:38 »
penso che jack lavori sempre in mono
Si, lavora in seriale


stereo sono sue jack mono accoppiati ....
Ah, ora ho compreso meglio ciò che intendevi dire.
« Ultima modifica: 25 Febbraio 2016, 16:35:42 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #10 il: 25 Febbraio 2016, 16:36:33 »
.... magari sarebbe da fare riferimento al fatto che il codice c e' incluso nella procedura CreaLibjk dell'applicazione gambas.
Grazie, ho apportato la precisazione.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #11 il: 25 Febbraio 2016, 19:09:31 »
Scrivo dal cellulare quindi non ho a portata di mano il codice ...

Ma mi sembra di notare che l'ascolto di quello che dico al microfono (solo un canale), derivi dal fatto che faccio un memcopy da in su out.
Ma per aggiungere una seconda procedura di callback sul canale destro dove devo metterlo nel pezzo in c?
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #12 il: 25 Febbraio 2016, 19:21:59 »
Ma per aggiungere una seconda procedura di callback sul canale destro dove devo metterlo nel pezzo in c?
Ritengo di sì, poiché la chiamata alla funzione di callback avviene nel codice C della libreria .so da noi appositamente creata.
Si pone, a mio avviso, anche il problema di "cosa" viene passato  da Gambas alla funzione chiamata "principale" della nostra libreria .so.

...sarebbe utile magari fare anche una ricerca su un eventuale esempio in C di gestione stereo. 
« Ultima modifica: 25 Febbraio 2016, 19:31:06 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #13 il: 25 Febbraio 2016, 21:21:00 »
...ci sarebbe da raddoppiare alcune righe del codice Gambas, cambiando opportunamente i nomi delle porte e di alcune variabili... per esempio aggiungere le righe per input_2 e così via insomma.
« Ultima modifica: 25 Febbraio 2016, 21:22:04 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re:Creare un semplice Client di Jack Audio Connection Kit
« Risposta #14 il: 26 Febbraio 2016, 00:30:17 »
Domani dall'ufficio carico le mie modifiche ..  Artigianali .... E provo a googolare un po di esempi in C ...
se corri, morirai stanco (motto degli sniper)