From a7a8306dd845504215c93f8ea29e7c3155d38a7a Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 10 Sep 2014 18:42:42 +0000 Subject: hide internal data format --- alsa.c | 18 +++++++++++++++--- fft.c | 6 +++--- fft.h | 4 +--- sio.c | 19 +++++++++++++++---- sio.h | 2 +- spectrogram.c | 9 ++++----- 6 files changed, 39 insertions(+), 19 deletions(-) diff --git a/alsa.c b/alsa.c index 099f885..35b3d79 100644 --- a/alsa.c +++ b/alsa.c @@ -31,6 +31,11 @@ static snd_pcm_hw_params_t *par; static int16_t *buffer; static unsigned int samples; +struct data { + int16_t left; + int16_t right; +}; + int init_sio(void) { @@ -76,10 +81,12 @@ max_samples_sio(void) return samples; } -int16_t * -read_sio(size_t n) +void +read_sio(double *left, double *right, size_t n) { snd_pcm_sframes_t rc; + struct data *data; + int i; if (n > samples) n = samples; @@ -91,7 +98,12 @@ read_sio(size_t n) snd_pcm_prepare(hdl); } - return buffer + samples - n; + data = (struct data *)&buffer[samples - n]; + + for (i = 0; i < n; i++) { + left[i] = data[i].left; + right[i] = data[i].right; + } } void diff --git a/fft.c b/fft.c index a2814b3..0b4ad0c 100644 --- a/fft.c +++ b/fft.c @@ -84,17 +84,17 @@ init_fft(size_t n) } int -exec_fft(int16_t *data, double *out, enum fft_chan chan) +exec_fft(double *io) { int i; for (i = 0; i < fft.n; i++) - fft.in[i] = fft.window[i] * data[2 * i + chan]; + fft.in[i] = fft.window[i] * io[i]; fftw_execute(fft.plan); for (i = 0; i < fft.n / 2; i++) - out[i] = fft.sq[i] * cabs(fft.out[i]); + io[i] = fft.sq[i] * cabs(fft.out[i]); return 0; } diff --git a/fft.h b/fft.h index e933e35..ddbc053 100644 --- a/fft.h +++ b/fft.h @@ -18,11 +18,9 @@ #ifndef __FFT_H #define __FFT_H -enum fft_chan { FFT_LEFT, FFT_RIGHT }; - __BEGIN_DECLS int init_fft(size_t); -int exec_fft(int16_t *, double *, enum fft_chan); +int exec_fft(double *); void free_fft(void); __END_DECLS diff --git a/sio.c b/sio.c index 31e947a..92e841b 100644 --- a/sio.c +++ b/sio.c @@ -32,6 +32,11 @@ static struct sio_par par; static int16_t *buffer; static unsigned int samples; +struct data { + int16_t left; + int16_t right; +}; + int init_sio(void) { @@ -78,13 +83,14 @@ max_samples_sio(void) return samples; } -int16_t * -read_sio(size_t n) +void +read_sio(double *left, double *right, size_t n) { - int done; + int done, i; char *p = (char *)buffer; size_t bufsz = samples * par.rchan * sizeof(int16_t); size_t rndsz = n * par.rchan * sizeof(int16_t); + struct data *data; if (rndsz > bufsz) rndsz = bufsz; @@ -99,7 +105,12 @@ read_sio(size_t n) * return a pointer to the latest ROUND samples (the most recent * ones) to minimize latency between picture and sound */ - return (int16_t *)(p - rndsz); + data = (struct data *)(p - rndsz); + + for (i = 0; i < n; i++) { + left[i] = data[i].left; + right[i] = data[i].right; + } } void diff --git a/sio.h b/sio.h index 025a0b2..b5b5d5e 100644 --- a/sio.h +++ b/sio.h @@ -20,7 +20,7 @@ __BEGIN_DECLS int init_sio(void); -int16_t *read_sio(size_t); +void read_sio(double *, double *, size_t); unsigned int max_samples_sio(void); void free_sio(void); __END_DECLS diff --git a/spectrogram.c b/spectrogram.c index e2faa12..dad4ccb 100644 --- a/spectrogram.c +++ b/spectrogram.c @@ -303,7 +303,7 @@ init_panel(Display *d, Window win, XRectangle r, enum mirror m) p = malloc(sizeof(struct panel)); assert(p); - p->data = calloc(r.width, sizeof(double)); + p->data = calloc(2 * r.width, sizeof(double)); assert(p->data); /* main panel window */ @@ -449,7 +449,6 @@ main(int argc, char **argv) int scr; struct panel *left, *right; - int16_t *buffer; int dflag = 0; /* daemonize */ int fflag = 0; /* fullscreen */ @@ -607,10 +606,10 @@ main(int argc, char **argv) } } - buffer = read_sio(round); + read_sio(left->data, right->data, round); - exec_fft(buffer, left->data, FFT_LEFT); - exec_fft(buffer, right->data, FFT_RIGHT); + exec_fft(left->data); + exec_fft(right->data); draw_panel(dsp, left); draw_panel(dsp, right); -- cgit v1.2.3