summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--plugins/gtkui/widgets.c33
-rw-r--r--streamer.c55
2 files changed, 40 insertions, 48 deletions
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c
index e42601b6..5132689c 100644
--- a/plugins/gtkui/widgets.c
+++ b/plugins/gtkui/widgets.c
@@ -37,6 +37,7 @@
#include "namedicons.h"
#include "hotkeys.h" // for building action treeview
#include "../../strdupa.h"
+#include "../../optmath.h"
#define min(x,y) ((x)<(y)?(x):(y))
#define max(x,y) ((x)>(y)?(x):(y))
@@ -2264,16 +2265,16 @@ scope_wavedata_listener (void *ctx, ddb_waveformat_t *fmt, const float *data, in
w_scope_t *w = ctx;
if (w->samples) {
// append
- float ratio = (44100.f / fmt->samplerate);
- int size = in_samples * ratio;
+ float ratio = fmt->samplerate / 44100.f;
+ int size = in_samples / ratio;
int sz = min (w->nsamples, size);
int n = w->nsamples-sz;
memmove (w->samples, w->samples + sz, n * sizeof (float));
float pos = 0;
- for (int i = 0; i < sz && pos < in_samples; i++, pos += 1./ratio) {
- w->samples[n + i] = data[(int)(pos * fmt->channels)];
+ for (int i = 0; i < sz && pos < in_samples; i++, pos += ratio) {
+ w->samples[n + i] = data[ftoi(pos * fmt->channels)];
}
}
}
@@ -2285,16 +2286,12 @@ scope_draw_cairo (GtkWidget *widget, cairo_t *cr, gpointer user_data) {
cairo_set_source_rgb (cr, 0, 0, 0);
cairo_rectangle (cr, 0, 0, a.width, a.height);
cairo_fill (cr);
- cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
- cairo_set_line_width (cr, 1);
- cairo_set_source_rgb (cr, 1, 1, 1);
w_scope_t *w = user_data;
float spp = 1;
int nsamples = a.width / spp;
if (w->nsamples != nsamples) {
- printf ("init\n");
float *oldsamples = w->samples;
int oldnsamples = w->nsamples;
w->samples = NULL;
@@ -2313,21 +2310,15 @@ scope_draw_cairo (GtkWidget *widget, cairo_t *cr, gpointer user_data) {
}
}
-
+ cairo_set_antialias (cr, CAIRO_ANTIALIAS_NONE);
+ cairo_set_source_rgb (cr, 1, 1, 1);
+ cairo_set_line_width (cr, 1);
+ cairo_move_to (cr, 0, ftoi(w->samples[0] * a.height/2 + a.height/2));
float incr = a.width / (float)w->nsamples;
- for (int i = 0; i < w->nsamples; i++) {
- float s = w->samples[i];
- cairo_line_to (cr, i, s * a.height/2 + a.height/2);
+ for (int i = 1; i < w->nsamples; i += 2) {
+ float y = w->samples[i] * a.height/2 + a.height/2;
+ cairo_line_to (cr, i, y);
}
-
-#if 0
- float incr = a.width / (float)DDB_AUDIO_MEMORY_FRAMES;
- float pos = 0;
- for (float x = 0; x < a.width && pos < DDB_AUDIO_MEMORY_FRAMES; x += incr, pos ++) {
- float s = data[(int)pos];
- cairo_line_to (cr, x, s * a.height/2 + a.height/2);
- }
-#endif
cairo_stroke (cr);
return FALSE;
diff --git a/streamer.c b/streamer.c
index 1348b617..674f3517 100644
--- a/streamer.c
+++ b/streamer.c
@@ -2279,35 +2279,36 @@ streamer_read (char *bytes, int size) {
printf ("streamer_read took %d ms\n", ms);
#endif
- mutex_lock (audio_mem_mutex);
- int in_frame_size = (output->fmt.bps >> 3) * output->fmt.channels;
- int in_frames = sz / in_frame_size;
- ddb_waveformat_t out_fmt = {
- .bps = 32,
- .channels = 1,
- .samplerate = output->fmt.samplerate,
- .channelmask = DDB_SPEAKER_FRONT_LEFT,
- .is_float = 1,
- .is_bigendian = 0
- };
-
- float temp_audio_data[in_frames * out_fmt.channels];
- pcm_convert (&output->fmt, bytes, &out_fmt, (char *)temp_audio_data, sz);
- if (in_frames < DDB_AUDIO_MEMORY_FRAMES) {
- memmove (audio_data, audio_data + in_frames, (DDB_AUDIO_MEMORY_FRAMES-in_frames)*sizeof (float));
- memcpy (audio_data + DDB_AUDIO_MEMORY_FRAMES - in_frames, temp_audio_data, sz);
- }
- else {
- memcpy (audio_data, temp_audio_data, DDB_AUDIO_MEMORY_FRAMES * in_frame_size);
- }
-
- for (wavedata_listener_t *l = wavedata_listeners; l; l = l->next) {
- l->callback (l->ctx, &out_fmt, temp_audio_data, in_frames);
- }
+ if (wavedata_listeners) {
+ mutex_lock (audio_mem_mutex);
+ int in_frame_size = (output->fmt.bps >> 3) * output->fmt.channels;
+ int in_frames = sz / in_frame_size;
+ ddb_waveformat_t out_fmt = {
+ .bps = 32,
+ .channels = 1,
+ .samplerate = output->fmt.samplerate,
+ .channelmask = DDB_SPEAKER_FRONT_LEFT,
+ .is_float = 1,
+ .is_bigendian = 0
+ };
+
+ float temp_audio_data[in_frames * out_fmt.channels];
+ pcm_convert (&output->fmt, bytes, &out_fmt, (char *)temp_audio_data, sz);
+ if (in_frames < DDB_AUDIO_MEMORY_FRAMES) {
+ memmove (audio_data, audio_data + in_frames, (DDB_AUDIO_MEMORY_FRAMES-in_frames)*sizeof (float));
+ memcpy (audio_data + DDB_AUDIO_MEMORY_FRAMES - in_frames, temp_audio_data, sz);
+ }
+ else {
+ memcpy (audio_data, temp_audio_data, DDB_AUDIO_MEMORY_FRAMES * in_frame_size);
+ }
- calc_freq (audio_data, freq_data);
+ for (wavedata_listener_t *l = wavedata_listeners; l; l = l->next) {
+ l->callback (l->ctx, &out_fmt, temp_audio_data, in_frames);
+ }
- mutex_unlock (audio_mem_mutex);
+ calc_freq (audio_data, freq_data);
+ mutex_unlock (audio_mem_mutex);
+ }
if (!output->has_volume) {
int mult = 1-audio_is_mute ();