<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ca">
	<id>http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Programant_amb_l%27API_de_JACK</id>
	<title>Programant amb l'API de JACK - Historial de revisió</title>
	<link rel="self" type="application/atom+xml" href="http://wiki.joanillo.org/index.php?action=history&amp;feed=atom&amp;title=Programant_amb_l%27API_de_JACK"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Programant_amb_l%27API_de_JACK&amp;action=history"/>
	<updated>2026-08-30T06:23:59Z</updated>
	<subtitle>Historial de revisió per a aquesta pàgina del wiki</subtitle>
	<generator>MediaWiki 1.34.2</generator>
	<entry>
		<id>http://wiki.joanillo.org/index.php?title=Programant_amb_l%27API_de_JACK&amp;diff=251061&amp;oldid=prev</id>
		<title>Joan: /* example-clients dels repositoris */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Programant_amb_l%27API_de_JACK&amp;diff=251061&amp;oldid=prev"/>
		<updated>2014-01-09T15:52:29Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;example-clients dels repositoris&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Pàgina nova&lt;/b&gt;&lt;/p&gt;&lt;div&gt;__TOC__&lt;br /&gt;
http://dis-dot-dat.net/index.cgi?item=/jacktuts/starting/&lt;br /&gt;
&lt;br /&gt;
Els fitxers amb què treballo estan a 50.../way6/jack. (aquesta podria ser una de les maneres de tocar a baix nivell, programant l'API de JACK).&lt;br /&gt;
Segueixo&lt;br /&gt;
*http://dis-dot-dat.net/index.cgi?item=jacktuts/starting/playing_a_note&lt;br /&gt;
&lt;br /&gt;
per fer el primer codi, que consisteix en tocar una nota.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$gcc -std=c99 -o playc `pkg-config --cflags --libs jack` playc.c&lt;br /&gt;
$ ./playc hola&lt;br /&gt;
the sample rate is now 44100/sec&lt;br /&gt;
engine sample rate: 44100&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Efectivament, veig que apareix hola en la pestanya Audio de les connexions JACK, i que està connectat al system, i escolto el Do central en la targeta de so.&lt;br /&gt;
&lt;br /&gt;
Per enviar missatges MIDI (apareix el client en la pestanya MIDI del JACK) ho tinc documentat a:&lt;br /&gt;
*[[Sax_Trainer#Programaci.C3.B3_de_l.27API_de_JACK_per_enviar_missatges_MIDI]]&lt;br /&gt;
També es podria fer un seqüenciador amb l'API d'ALSA, i en aquest cas el client apareixeria en la pestanya ALSA del JACK.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
He estat fent bastantes proves i documentant-me, que bàsicament estan a sax_trainer/programacio_jack. '''midisine.c''' (i midisine_comentat.c), midiseq.c, simple_client. Concretament estic fent proves amb jack_bridge.c, que ha d'assentar les bases per tal que el sax_trainer el pugui connectar a un foot controller.&lt;br /&gt;
&lt;br /&gt;
*http://trac.jackaudio.org/browser/trunk/jack/example-clients&lt;br /&gt;
*http://trac.jackaudio.org/browser/trunk/jack/example-clients/midisine.c&lt;br /&gt;
També seria interessant mirar:&lt;br /&gt;
*http://nedko.arnaudov.name/soft/fluidjack.c&lt;br /&gt;
&lt;br /&gt;
El secret per entendre l'API de Jack és pensar una mica a baix nivell, en els buffers i la informació de buffers de memòria que s'intercanvies les aplicacions clients.&lt;br /&gt;
==example-clients dels repositoris==&lt;br /&gt;
''jackmp'' significa JACK multi-processador, que és el mateix que dir JACK2, i aquesta és la diferència gran entre JACK2 i JACK1: està optimitzat per ordinadors amb multi-processador.&lt;br /&gt;
&lt;br /&gt;
$ svn co http://subversion.jackaudio.org/jack/jack2/trunk/jackmp&lt;br /&gt;
dins d'example-clients, compilo els exemples:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc -D jack -o showtime `pkg-config --cflags --libs jack` showtime.c&lt;br /&gt;
./showtime&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o samplerate `pkg-config --cflags --libs jack` samplerate.c&lt;br /&gt;
./samplerate&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o cpu_load `pkg-config --cflags --libs jack` cpu_load.c&lt;br /&gt;
./cpu_load&lt;br /&gt;
jack DSP load 0.997674&lt;br /&gt;
jack DSP load 0.843427&lt;br /&gt;
jack DSP load 0.843836&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o alias `pkg-config --cflags --libs jack` alias.c&lt;br /&gt;
./alias&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o alsa_in `pkg-config --cflags --libs jack` alsa_in.c&lt;br /&gt;
./alsa_inno compila llegir:&lt;br /&gt;
*http://permalink.gmane.org/gmane.comp.audio.jackit/18384&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o alsa_out `pkg-config --cflags --libs jack` alsa_out.c&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o bufsize `pkg-config --cflags --libs jack` bufsize.c&lt;br /&gt;
./bufsize&lt;br /&gt;
buffer size = 256  sample rate = 44100&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o capture_client `pkg-config --cflags --libs jack` capture_client.c&lt;br /&gt;
no em compila&lt;br /&gt;
&lt;br /&gt;
gcc -D jack -o metro `pkg-config --cflags --libs jack` metro.c&lt;br /&gt;
./metro&lt;br /&gt;
(és un client de JACK que és un metrònom).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
per a l'exemple transport.c és necessari incloure la llibreria -lreadline&lt;br /&gt;
$ gcc -D jack -o transport -lreadline  `pkg-config --cflags --libs jack` transport.c&lt;br /&gt;
o també:&lt;br /&gt;
$ gcc -Wall transport.c -o transport -ljack -lreadline&lt;br /&gt;
&lt;br /&gt;
$ ./transport &lt;br /&gt;
transport&amp;gt; help&lt;br /&gt;
activate		Call jack_activate().&lt;br /&gt;
exit		Exit transport program.&lt;br /&gt;
deactivate		Call jack_deactivate().&lt;br /&gt;
help		Display help text [&amp;lt;command&amp;gt;].&lt;br /&gt;
locate		Locate to frame &amp;lt;position&amp;gt;.&lt;br /&gt;
master		Become timebase master [&amp;lt;conditionally&amp;gt;].&lt;br /&gt;
play		Start transport rolling.&lt;br /&gt;
quit		Synonym for `exit'.&lt;br /&gt;
release		Release timebase.&lt;br /&gt;
stop		Stop transport.&lt;br /&gt;
tempo		Set beat tempo &amp;lt;beats_per_min&amp;gt;.&lt;br /&gt;
timeout		Set sync timeout in &amp;lt;seconds&amp;gt;.&lt;br /&gt;
?		Synonym for `help'.&lt;br /&gt;
&lt;br /&gt;
transport&amp;gt; play&lt;br /&gt;
transport&amp;gt; stop&lt;br /&gt;
transport&amp;gt; tempo 100&lt;br /&gt;
transport&amp;gt; play&lt;br /&gt;
transport&amp;gt; master&lt;br /&gt;
transport&amp;gt; tempo 80&lt;br /&gt;
transport&amp;gt; tempo 120&lt;br /&gt;
transport&amp;gt; stop&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Què és una funció callback?==&lt;br /&gt;
Del Synthesis ToolKit in C++ trobo una bona definició de callback:&lt;br /&gt;
*https://ccrma.stanford.edu/software/stk/crealtime.html&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
An alternative scheme for audio input/output is to define a specific function in which audio computations are performed and to let the audio system call this function when more input/output data can be accepted by the hardware (referred to as a callback scheme). In this section, we show how the previous rtsine.cpp program can be modified to work in a callback scenario. There is no &amp;quot;single-sample&amp;quot; interface for this functionality. The callback function will be invoked automatically by the audio system controller (RtAudio) when new data is needed and it is necessary to compute a full audio buffer of samples at that time (see Blocking vs. Callbacks for further information).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
La idea és que tenim un servidor d'àudio, i aquest servidor és el que s'encarrega de fer crides als clients quan detecta que el buffer de la interface està buida.&lt;br /&gt;
==Exemples didàctics==&lt;br /&gt;
He fet algunes aplicacions petites amb la idea d'ilustrar com es programa la API de JACK i com es poden fer coses bàsiques a nivell Audio i MIDI.&lt;br /&gt;
*[[Projectes_d'Informàtica_Musical#Exemples_did.C3.A0ctics_de_la_API_de_JACK]]&lt;br /&gt;
==Exemples importants: realtime, ringbuffer,...(per imprimir i provar)==&lt;br /&gt;
S'han recopilat els articles en un sol document i s'ha penjat al servidor:&lt;br /&gt;
*[[Fitxer:Articles codi audio programming.odt.zip]]&lt;br /&gt;
&lt;br /&gt;
*Article ''Time waits for nothing'': http://www.rossbencina.com/code/real-time-audio-programming-101-time-waits-for-nothing&lt;br /&gt;
*sndfile-jackplay.c (/home/joan/projectes/jplay-sndfile). thread. Fem playback mentre llegim el fitxer. Comentaris sobre l'ús de threads a [[Fils/threads_amb_C%2B%2B]]&lt;br /&gt;
*JACK_i_Ringbuffer: http://harryhaaren.blogspot.com/2011/11/tutorial-jack-ringbuffers.html, [[Circular_buffer_/_Ringbuffer]]&lt;br /&gt;
*Gravar del micro: jcapture&lt;br /&gt;
*Gravar del micro: '''capture_client.c''' (https://github.com/jackaudio/example-clients/blob/master/capture_client.c). Comentaris sobre l'ús de threads a [[Fils/threads_amb_C%2B%2B]]&lt;br /&gt;
*http://harryhaaren.blogspot.com/2011/12/tutorial-load-loop-samples.html (Harry Haaren). This tutorial will show you how to load a sample into memory, and then play it back trough a JACK port, continually looping. There's not really that much to it, just a bit of thinking of the order things happen, and arrays.&lt;br /&gt;
**codi font: https://github.com/harryhaaren/Linux-Audio-Programming-Documentation/blob/master/loopedSample/loopedSample.cpp&lt;br /&gt;
*http://harryhaaren.blogspot.com/2010/06/tutorials.html&lt;br /&gt;
**JACK MIDI Examples&lt;br /&gt;
*http://harryhaaren.blogspot.com/2009/12/tut-5-callbacks-with-gtkmm.html. Callbacks with GTKmm (senyals)&lt;br /&gt;
*Writing Audio To File: http://harryhaaren.blogspot.com/2009/12/tut-4-writing-audio-to-file.html&lt;br /&gt;
*JACK tuner. http://freecode.com/projects/jack-tuner. '''compte!!''' aquest programa produciex tons, no és un afinador, i per tant no té res a veure amb la FFT. De totes maneres, pot ser interessant estudiar i compilar el codi.&lt;br /&gt;
=capture_client.c=&lt;br /&gt;
*https://github.com/jackaudio/example-clients/blob/master/capture_client.c&lt;br /&gt;
És un exemple important doncs mostra com s'utilitza la comunicació entre els fils de JACK i del fitxer. A la callback no hi ha cap operació que no sigui ''realtime safe'', però és possible que l'operació d'escriure a disc ralentitzi el procés i apareguin XRuns, que podem calcular (això només hauria de passar si tenim algun problema d'un disc que va lent, o estem utilitzant una latència molt baixa i no hi ha temps a escriure. Recordem que per a captura convé augmentar la latència).&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gcc -Wall -o jackrec -ljack -lsndfile capture_client.c&lt;br /&gt;
$ ./jackrec&lt;br /&gt;
usage: jackrec -f filename [ -d second ] [ -b bitdepth ] [ -B bufsize ] port1 [ port2 ... ]&lt;br /&gt;
&lt;br /&gt;
$ ./jackrec -f foo.wav system:capture_1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
Però fixem-nos bé que amb aquesta tècnica de programació controlada per fils no hi ha un bucle principal del programa. Ara bé, com es pot veure estudiant el codi, la única manera de sortir del codi pel final del main() i poder tancar de manera polida el JACK i alliberar recursos és utilitzar l'opció -d, que limita el funcionament a un número de segons determinat. Si no utilitzo -d aleshores es tanca fent Ctrl-C, però el codi original no gestiona l'ús de Ctrl-C.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ gcc -Wall -o jackrec -ljack -lsndfile capture_client.c&lt;br /&gt;
$ ./jackrec -f aaa.wav -d 1 system:capture_1&lt;br /&gt;
disk thread finished&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, setembre 2010&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>