<?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=Jcapture</id>
	<title>Jcapture - 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=Jcapture"/>
	<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Jcapture&amp;action=history"/>
	<updated>2026-08-30T13:47: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=Jcapture&amp;diff=248965&amp;oldid=prev</id>
		<title>Joan: /* Blog */</title>
		<link rel="alternate" type="text/html" href="http://wiki.joanillo.org/index.php?title=Jcapture&amp;diff=248965&amp;oldid=prev"/>
		<updated>2012-02-27T00:41:45Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Blog&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;=Introducció=&lt;br /&gt;
Es tracta de l'aplicació mínima per tal de mostrar la informació que arriba del micròfon. Es dibuixa el senyal en forma d'un ''meter'' textual.&lt;br /&gt;
&lt;br /&gt;
=Desenvolupament=&lt;br /&gt;
El rovell de l'ou està en la funció callback. Per cada crida de la funció callback n'hi hauria prou de copiar el buffer d'entrada (la senyal que ve del micro i que està disponible en la interfície d'audio) al fitxer de so mitjançant la funcion ''sf_write_float'' de la llibreria de ''libsndfile''.&lt;br /&gt;
&lt;br /&gt;
Ara bé, tot i que no faig processament del senyal (no canvio el valor de les mostres), m'interessa recórrer totes les mostres per tal d'obtenir un valor mitja de les mostres durant un periode de temps (calculat al llarg de 5 crides a la funció callback), i per tant implemento també el bucle for.&lt;br /&gt;
&lt;br /&gt;
He perdut bastant de temps perquè utilitzava la funció ''''sf_write_double'' en comptes de la correcte ''sf_write_float'', i les mostres que obtenia quedaven molt reduïdes...&lt;br /&gt;
&lt;br /&gt;
===versions===&lt;br /&gt;
*0.0.1: mostro per pantalla el valor de les mostres&lt;br /&gt;
*0.0.2: implemento un meter (mal calculat per culpa de la funció abs, veure més avall)&lt;br /&gt;
*0.0.3: incloc la llibreria libsndfile per escriure a un fitxer wav.&lt;br /&gt;
*1.0.0: versió definitiva. Es passa com a argument el nom del fitxer de sortida.&lt;br /&gt;
===Problema amb el valor absolut===&lt;br /&gt;
He perdut bastant de temps a l'hora de mostrar el ''meter textual'', perquè la funció abs() no funcionava com s'espera. A&lt;br /&gt;
A &amp;lt;cstdlib&amp;gt; està definida la funció '''abs0''':&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
int abs ( int n );&lt;br /&gt;
long abs ( long n );&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i com es veu només espera com a argument tipus enter. Com es llegeix en la documentació (http://www.cplusplus.com/reference/clibrary/cstdlib/abs/):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
In C++, this function is overloaded in &amp;lt;cmath&amp;gt; for floating-point types (see cmath abs), in &amp;lt;complex&amp;gt; for complex numbers (see complex abs), and in &amp;lt;valarray&amp;gt; for valarrays (see valarray abs).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i per tant, si vull el valor absolut de valors float, he d'utilitzar la llibreria #include &amp;lt;cmath&amp;gt;. El codi mínim per veure el problema és (comentar o descomentar #include &amp;lt;cmath&amp;gt;):&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
using namespace std;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;cmath&amp;gt;&lt;br /&gt;
&lt;br /&gt;
int main (int argc, char* argv[]) &lt;br /&gt;
{&lt;br /&gt;
	float a=.342;&lt;br /&gt;
	float b;&lt;br /&gt;
	b=(float)abs(a);&lt;br /&gt;
	printf(&amp;quot;%f\n&amp;quot;,b);&lt;br /&gt;
&lt;br /&gt;
	return 0 ;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
===Realtime safe===&lt;br /&gt;
'''printf''' no és realtime safe.&lt;br /&gt;
&lt;br /&gt;
D'altra banda, jo a cada crida de la callback també faig &lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
sf_write_float (sndfile, (float *)ins , nframes) ;	&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
i no crec que fer això dins de la callback sigui ''realtime safe''. Per tant, la única alternativa serà fer-ho amb threads, com de fet ja està resolt a:&lt;br /&gt;
*https://github.com/jackaudio/example-clients/blob/master/capture_client.c&lt;br /&gt;
&lt;br /&gt;
=Download=&lt;br /&gt;
*[[Fitxer:Jcapture-1.0.0.tar.gz]]&lt;br /&gt;
&lt;br /&gt;
=Blog=&lt;br /&gt;
*entrada blog: http://www.joanillo.org/?p=613&amp;amp;lang=ca&lt;br /&gt;
&lt;br /&gt;
{{Autor}}, febrer 2012&lt;br /&gt;
[[Category: Música Electrònica]]&lt;br /&gt;
[[Category: www.joanillo.org]]&lt;/div&gt;</summary>
		<author><name>Joan</name></author>
		
	</entry>
</feed>