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