Mercurial > audlegacy-plugins
changeset 2669:ed0ad7b373d3
make vis working
author | Tomasz Mon <desowin@gmail.com> |
---|---|
date | Sat, 31 May 2008 14:17:37 +0200 |
parents | a1431a900f28 |
children | 53ed12578b57 |
files | src/skins/ui_main_evlisteners.c src/skins/ui_svis.c src/skins/ui_vis.c |
diffstat | 3 files changed, 165 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/skins/ui_main_evlisteners.c Fri May 30 21:02:12 2008 +0200 +++ b/src/skins/ui_main_evlisteners.c Sat May 31 14:17:37 2008 +0200 @@ -30,6 +30,7 @@ #include "visualization.h" #endif #include <audacious/plugin.h> +#include <audacious/input.h> #if 0 #include "ui_credits.h" #endif @@ -220,10 +221,164 @@ static void ui_main_evlistener_visualization_timeout(gpointer hook_data, gpointer user_data) { + if (hook_data == NULL) { + if (config.player_shaded && config.player_visible) + ui_svis_timeout_func(mainwin_svis, NULL); + else + ui_vis_timeout_func(mainwin_vis, NULL); + return; + } + + VisNode *vis = (VisNode*) hook_data; + + guint8 intern_vis_data[512]; + gint16 mono_freq[2][256]; + gboolean mono_freq_calced = FALSE; + gint16 mono_pcm[2][512], stereo_pcm[2][512]; + gboolean mono_pcm_calced = FALSE, stereo_pcm_calced = FALSE; + gint i; + + if (config.vis_type == VIS_OFF) + return; + + if (config.vis_type == VIS_ANALYZER) { + /* Spectrum analyzer */ + /* 76 values */ + const gint long_xscale[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, + 17, 18, + 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, + 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, + 50, 51, + 52, 53, 54, 55, 56, 57, 58, 61, 66, 71, 76, 81, 87, 93, + 100, 107, + 114, 122, 131, 140, 150, 161, 172, 184, 255 + }; + /* 20 values */ + const int short_xscale[] = + { 0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 15, 20, 27, + 36, 47, 62, 82, 107, 141, 184, 255 + }; + const double y_scale = 3.60673760222; /* 20.0 / log(256) */ + const int *xscale; + gint j, y, max; + + if (!mono_freq_calced) + aud_calc_mono_freq(mono_freq, vis->data, vis->nch); + + memset(intern_vis_data, 0, 75); + + if (config.analyzer_type == ANALYZER_BARS) { + if (config.player_shaded) { + max = 13; + } + else { + max = 19; + } + xscale = short_xscale; + } + else { + if (config.player_shaded) { + max = 37; + } + else { + max = 75; + } + xscale = long_xscale; + } + + for (i = 0; i < max; i++) { + for (j = xscale[i], y = 0; j < xscale[i + 1]; j++) { + if (mono_freq[0][j] > y) + y = mono_freq[0][j]; + } + y >>= 7; + if (y != 0) { + intern_vis_data[i] = log(y) * y_scale; + if (intern_vis_data[i] > 15) + intern_vis_data[i] = 15; + } + else + intern_vis_data[i] = 0; + } + } + else if(config.vis_type == VIS_VOICEPRINT){ + if (config.player_shaded && config.player_visible) { + /* VU */ + gint vu, val; + + if (!stereo_pcm_calced) + aud_calc_stereo_pcm(stereo_pcm, vis->data, vis->nch); + vu = 0; + for (i = 0; i < 512; i++) { + val = abs(stereo_pcm[0][i]); + if (val > vu) + vu = val; + } + intern_vis_data[0] = (vu * 37) >> 15; + if (intern_vis_data[0] > 37) + intern_vis_data[0] = 37; + if (vis->nch == 2) { + vu = 0; + for (i = 0; i < 512; i++) { + val = abs(stereo_pcm[1][i]); + if (val > vu) + vu = val; + } + intern_vis_data[1] = (vu * 37) >> 15; + if (intern_vis_data[1] > 37) + intern_vis_data[1] = 37; + } + else + intern_vis_data[1] = intern_vis_data[0]; + } + else { /*Voiceprint*/ + if (!mono_freq_calced) + aud_calc_mono_freq(mono_freq, vis->data, vis->nch); + memset(intern_vis_data, 0, 256); + + /* For the values [0-16] we use the frequency that's 3/2 as much. + If we assume the 512 values calculated by calc_mono_freq to + cover 0-22kHz linearly we get a range of + [0-16] * 3/2 * 22000/512 = [0-1,031] Hz. + Most stuff above that is harmonics and we want to utilize the + 16 samples we have to the max[tm] + */ + for (i = 0; i < 50 ; i+=3){ + intern_vis_data[i/3] += (mono_freq[0][i/2] >> 5); + + /*Boost frequencies above 257Hz a little*/ + //if(i > 4 * 3) + // intern_vis_data[i/3] += 8; + } + } + } + else { /* (config.vis_type == VIS_SCOPE) */ + + /* Oscilloscope */ + gint pos, step; + + if (!mono_pcm_calced) + aud_calc_mono_pcm(mono_pcm, vis->data, vis->nch); + + step = (vis->length << 8) / 74; + for (i = 0, pos = 0; i < 75; i++, pos += step) { + intern_vis_data[i] = ((mono_pcm[0][pos >> 8]) >> 12) + 7; + if (intern_vis_data[i] == 255) + intern_vis_data[i] = 0; + else if (intern_vis_data[i] > 12) + intern_vis_data[i] = 12; + /* Do not see the point of that? (comparison always false) -larne. + if (intern_vis_data[i] < 0) + intern_vis_data[i] = 0; */ + } + } + if (config.player_shaded && config.player_visible) - ui_svis_timeout_func(mainwin_svis, hook_data); + ui_svis_timeout_func(mainwin_svis, intern_vis_data); else - ui_vis_timeout_func(mainwin_vis, hook_data); + ui_vis_timeout_func(mainwin_vis, intern_vis_data); } static void
--- a/src/skins/ui_svis.c Fri May 30 21:02:12 2008 +0200 +++ b/src/skins/ui_svis.c Sat May 31 14:17:37 2008 +0200 @@ -486,8 +486,9 @@ } void ui_svis_clear_data(GtkWidget *widget) { + g_return_if_fail(UI_IS_SVIS(widget)); + gint i; - UiSVis *svis = UI_SVIS (widget); for (i = 0; i < 75; i++) { @@ -496,6 +497,8 @@ } void ui_svis_timeout_func(GtkWidget *widget, guchar * data) { + g_return_if_fail(UI_IS_SVIS(widget)); + UiSVis *svis = UI_SVIS (widget); static GTimer *timer = NULL; gulong micros = 9999999;
--- a/src/skins/ui_vis.c Fri May 30 21:02:12 2008 +0200 +++ b/src/skins/ui_vis.c Sat May 31 14:17:37 2008 +0200 @@ -631,6 +631,8 @@ } void ui_vis_clear_data(GtkWidget *widget) { + g_return_if_fail(UI_IS_VIS(widget)); + gint i; UiVis *vis = UI_VIS (widget); @@ -642,6 +644,8 @@ } void ui_vis_timeout_func(GtkWidget *widget, guchar * data) { + g_return_if_fail(UI_IS_VIS(widget)); + UiVis *vis = UI_VIS (widget); static GTimer *timer = NULL; gulong micros = 9999999;