/* Instru2Light - Illumine un instrument de musique en temps réel Copyright (C) 2012-2013 Ludovic Pouzenc This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include "gtkvumeter.h" #include "win_main.h" #include "compute.h" #include "capture.h" #include "hsv2rgb.h" #include "illuminate.h" gint *audio_vumeter_val, *light_h, *light_s, *light_v, *light_r, *light_g, *light_b; void my_process(float *data, size_t nsamples, size_t nchan); int main (int argc, char **argv) { int dmx_init_res; GtkWidget *mainwin; gint vals_for_vumeters[7]={0,0,0,0,0,0,0}; //sound,h,s,v,r,g,b //Some handy references to the previous array items to make things clear whenever possible audio_vumeter_val=vals_for_vumeters+0; light_h=vals_for_vumeters+1; light_s=vals_for_vumeters+2; light_v=vals_for_vumeters+3; light_r=vals_for_vumeters+4; light_g=vals_for_vumeters+5; light_b=vals_for_vumeters+6; pthread_t audio_analyzer; g_thread_init(NULL); gdk_threads_init(); gdk_threads_enter(); gtk_init (&argc, &argv); mainwin=win_main_build(); gtk_widget_show_all (mainwin); dmx_init_res=dmx_init(); printf("debug : main my_process==%p\n", my_process); printf("debug : main (void *)my_process==%p\n", (void *)my_process); pthread_create (&audio_analyzer, (void *)NULL, (void *)audio_thread, (void *)my_process); g_timeout_add (25, win_main_update_vumeters, (gpointer)vals_for_vumeters); gtk_main (); gdk_threads_leave(); if (dmx_init_res==0) dmx_deinit(); return 0; } void my_process(float *data, size_t nsamples, size_t nchan) { float sound_level; struct hsv_colour hsv; struct rgb_colour rgb; //FIXME : rate should came from PulseAudio sound_level=compute_level(data, nsamples, 44100); //FIXME : no fixed rate here ! // printf("sound_level==%+8f nsamples==%8i\n", sound_level, nsamples); // Update sound vumeter value (refreshed asynchronously) *audio_vumeter_val=(int)sound_level; // Transfert Function audio2hsv_1(sound_level,&(hsv.h),&(hsv.s),&(hsv.v)); // Conversion hsv2rgb(&hsv, &rgb); // printf("hsv %+.3f %+.3f %+.3f\n", hsv.h, hsv.s, hsv.v); // printf("rgb %+.3f %+.3f %+.3f\n", rgb.r, rgb.g, rgb.b); //Update vu-meters *light_h=hsv.h*255; *light_s=hsv.s*255; *light_v=hsv.v*255; *light_r=rgb.r*255; *light_g=rgb.g*255; *light_b=rgb.b*255; // Send to DMX dmx_write_rgb(*light_r, *light_g, *light_b); }