aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2014-09-10 18:42:42 +0000
committerDimitri Sokolyuk <demon@dim13.org>2014-09-10 18:42:42 +0000
commita7a8306dd845504215c93f8ea29e7c3155d38a7a (patch)
tree5dcb86764ed34ecd4b75b366cc359dfd89f13764
parent47875bb2282e68784b0ec357eb20bf996bd38666 (diff)
hide internal data format
-rw-r--r--alsa.c18
-rw-r--r--fft.c6
-rw-r--r--fft.h4
-rw-r--r--sio.c19
-rw-r--r--sio.h2
-rw-r--r--spectrogram.c9
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);