From 5b385abef33b20c122bddf9cc9e947594e0ebd32 Mon Sep 17 00:00:00 2001
From: Ludovic Pouzenc <ludovic@pouzenc.fr>
Date: Mon, 4 Jun 2012 21:44:28 +0000
Subject: Bon. Partie pulse audio finie je pense. début de la partie galère sur
 le "vrai" calcul pour le vu-mètre. C'est compliqué car si on veut du dbA il
 faut faire une FFT pour appliquer des poids par fréquence. Analyse
 fréquentielle copiée depuis le projet Audacity (adaptée du C++ au C et
 décimée). Il y a des tas de petits mallocs pour la FFT et ça pue. D'ailleurs
 l'exécution de cette version donne un assertion failed sur malloc() que
 j'avais jamais vu...
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

git-svn-id: file:///var/svn/2012-violon-leds/trunk@12 6be1fa4d-33ac-4c33-becc-79fcb3794bb6
---
 tests/test5/capture.c | 40 +++++++++++-----------------------------
 1 file changed, 11 insertions(+), 29 deletions(-)

(limited to 'tests/test5/capture.c')

diff --git a/tests/test5/capture.c b/tests/test5/capture.c
index 441a6ac..00d9c54 100644
--- a/tests/test5/capture.c
+++ b/tests/test5/capture.c
@@ -5,7 +5,7 @@
 #define APP_TITLE "Test 5 lpo"
 #define BUFSIZE 1024
 
-extern void my_process(gint sound_level, void *userdata);
+extern void my_process(float *data, size_t nsamples, size_t nchan);
 
 capture_sound_level_cb_t *capture_sound_level_cb=NULL;
 
@@ -16,7 +16,6 @@ void context_get_source_info_callback(pa_context *c, const pa_source_info *si, i
 pa_stream * create_stream(pa_context *c, const pa_source_info *si);
 void stream_state_callback(pa_stream *s, void *userdata);
 void stream_read_callback(pa_stream *s, size_t nbytes, void *userdata);
-gint compute_level(const void *data, size_t nbytes);
 
 char *device_name=NULL;
 
@@ -106,7 +105,6 @@ void context_get_server_info_callback(pa_context *c, const pa_server_info*si, vo
 }
 
 void context_get_source_info_callback(pa_context *c, const pa_source_info *si, int is_last, void *userdata) {
-	static pa_stream* pa_st=NULL;
 
 	if (is_last < 0) {
 		printf("Failed to get sink information\n");
@@ -117,18 +115,10 @@ void context_get_source_info_callback(pa_context *c, const pa_source_info *si, i
 		return;
 	}
 
-	pa_st=create_stream(c,si);
-	g_assert(pa_st);
+	create_stream(c,si);
 }
 
 pa_stream *create_stream(pa_context *c, const pa_source_info *si) {
-	/* The sample type to use 
-	static const pa_sample_spec nss = {
-		.format = PA_SAMPLE_S16LE,
-		.rate = 44100,
-		.channels = 1
-	};
-*/
 	static const pa_buffer_attr ba={
 		.maxlength=-1,
 		.tlength=1024,
@@ -137,6 +127,12 @@ pa_stream *create_stream(pa_context *c, const pa_source_info *si) {
 		.fragsize=512
 	};
 
+	pa_sample_spec nss = {
+		.format = PA_SAMPLE_FLOAT32LE,
+		.rate = si->sample_spec.rate,
+		.channels = si->sample_spec.channels
+	};
+
 	pa_stream *stream=NULL;
 	//pa_proplist *pl=NULL;
 	char t[256];
@@ -148,7 +144,7 @@ pa_stream *create_stream(pa_context *c, const pa_source_info *si) {
 */
 
 	printf("Source : %s (%s)\n", si->name, si->description);
-	printf("Using sample format: %s\n", pa_sample_spec_snprint(t, sizeof(t), &(si->sample_spec)));
+	printf("Using sample format: %s\n", pa_sample_spec_snprint(t, sizeof(t), &nss));
 	printf("Using channel map: %s\n", pa_channel_map_snprint(t, sizeof(t), &(si->channel_map)));
 /*
 	pl=pa_proplist_new();
@@ -156,7 +152,7 @@ pa_stream *create_stream(pa_context *c, const pa_source_info *si) {
 	pa_proplist_set(pl, "tlength", &pl_tlength, sizeof(pl_tlength));
 	pa_proplist_set(pl, "fragsize", &pl_fragsize, sizeof(pl_fragsize));
 */
-	stream=pa_stream_new(c, APP_TITLE, &(si->sample_spec), &(si->channel_map));
+	stream=pa_stream_new(c, APP_TITLE, &nss, &(si->channel_map));
 	//stream=pa_stream_new_with_proplist(c, APP_TITLE, &(si->sample_spec), &(si->channel_map), pl);
 	pa_stream_set_state_callback(stream, stream_state_callback, NULL);
 	pa_stream_set_read_callback(stream, stream_read_callback, NULL);
@@ -196,11 +192,9 @@ void stream_read_callback(pa_stream *s, size_t nbytes, void *userdata) {
 		printf("pa_stream_peek() failed\n");//: %s", pa_strerror(pa_context_errno(context)));
 		return;
 	}
-	//printf("level : %i\n", compute_level(p,nbytes));
 
 //printf("debug : before call capture_sound_level_cb==%p\n", capture_sound_level_cb);
-
-	my_process(compute_level(p,nbytes), NULL);
+	my_process((float *)p,nbytes/sizeof(float), pa_stream_get_sample_spec(s)->channels);
 //	(*capture_sound_level_cb)(compute_level(p,nbytes), NULL);
 
 //printf("debug : after call capture_sound_level_cb==%p\n", capture_sound_level_cb);
@@ -208,15 +202,3 @@ void stream_read_callback(pa_stream *s, size_t nbytes, void *userdata) {
 	pa_stream_drop(s);
 }
 
-gint compute_level(const void *data, size_t nbytes) {
-	size_t i;
-	gint val, level=0;
-	for (i=0;i<nbytes/2;i++) {
-		val=((int16_t *)data)[i];
-		//printf("val==%i\n", val);
-		if (val<0) val=-val;
-		if (level<val) level=val;
-	}
-	return level;
-}
-
-- 
cgit v1.2.3