aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2014-09-10 17:24:15 +0000
committerDimitri Sokolyuk <demon@dim13.org>2014-09-10 17:24:15 +0000
commit9671bb4cc41beda923e115b94b928c249bf55d62 (patch)
tree4c62ccb0b74b0e8116363b022ddda36355454273
parent195e81ffc3af2e40996fbb9861caa2cb7cb2e173 (diff)
make module internal data privat
-rw-r--r--alsa.c84
-rw-r--r--fft.c49
-rw-r--r--fft.h7
-rw-r--r--sio.c76
-rw-r--r--sio.h10
-rw-r--r--spectrogram.c18
6 files changed, 110 insertions, 134 deletions
diff --git a/alsa.c b/alsa.c
index e1f0208..f221c08 100644
--- a/alsa.c
+++ b/alsa.c
@@ -26,86 +26,80 @@
#define RATE 48000
#define FPS 25
-struct sio {
- snd_pcm_t *handle;
- snd_pcm_hw_params_t *params;
+struct alsa {
+ snd_pcm_t *hdl;
+ snd_pcm_hw_params_t *par;
int16_t *buffer;
unsigned int samples;
-};
+} alsa;
-struct sio *
+int
init_sio(void)
{
- struct sio *sio;
snd_pcm_uframes_t round;
unsigned int rate;
int rc;
- sio = malloc(sizeof(struct sio));
- assert(sio);
-
- rc = snd_pcm_open(&sio->handle, "default", SND_PCM_STREAM_CAPTURE, 0);
+ rc = snd_pcm_open(&alsa.hdl, "default", SND_PCM_STREAM_CAPTURE, 0);
if (rc < 0)
errx(1, "unable to open pcm device: %s", snd_strerror(rc));
- snd_pcm_hw_params_malloc(&sio->params);
- snd_pcm_hw_params_any(sio->handle, sio->params);
- snd_pcm_hw_params_set_access(sio->handle, sio->params,
+ snd_pcm_hw_params_malloc(&alsa.par);
+ snd_pcm_hw_params_any(alsa.hdl, alsa.par);
+ snd_pcm_hw_params_set_access(alsa.hdl, alsa.par,
SND_PCM_ACCESS_RW_INTERLEAVED);
- snd_pcm_hw_params_set_format(sio->handle, sio->params,
+ snd_pcm_hw_params_set_format(alsa.hdl, alsa.par,
SND_PCM_FORMAT_S16_LE);
- snd_pcm_hw_params_set_channels(sio->handle, sio->params, STEREO);
- snd_pcm_hw_params_set_rate(sio->handle, sio->params, RATE, 0);
+ snd_pcm_hw_params_set_channels(alsa.hdl, alsa.par, STEREO);
+ snd_pcm_hw_params_set_rate(alsa.hdl, alsa.par, RATE, 0);
- rc = snd_pcm_hw_params(sio->handle, sio->params);
+ rc = snd_pcm_hw_params(alsa.hdl, alsa.par);
if (rc < 0)
errx(1, "unable to set hw parameters: %s", snd_strerror(rc));
- snd_pcm_hw_params_get_period_size(sio->params, &round, NULL);
- snd_pcm_hw_params_get_rate(sio->params, &rate, 0);
- snd_pcm_hw_params_free(sio->params);
- snd_pcm_prepare(sio->handle);
-
- sio->samples = rate / FPS;
- warnx("min samples: %d", sio->samples);
- sio->samples -= sio->samples % round - round;
- warnx("max samples: %d", sio->samples);
- sio->buffer = calloc(sio->samples * STEREO, sizeof(int16_t));
- assert(sio->buffer);
-
-
- return sio;
+ snd_pcm_hw_params_get_period_size(alsa.par, &round, NULL);
+ snd_pcm_hw_params_get_rate(alsa.par, &rate, 0);
+ snd_pcm_hw_params_free(alsa.par);
+ snd_pcm_prepare(alsa.hdl);
+
+ alsa.samples = rate / FPS;
+ warnx("min samples: %d", alsa.samples);
+ alsa.samples -= alsa.samples % round - round;
+ warnx("max samples: %d", alsa.samples);
+ alsa.buffer = calloc(alsa.samples * STEREO, sizeof(int16_t));
+ assert(alsa.buffer);
+
+ return 0;
}
unsigned int
-max_samples_sio(struct sio *sio)
+max_samples_sio(void)
{
- return sio->samples;
+ return alsa.samples;
}
int16_t *
-read_sio(struct sio *sio, unsigned int n)
+read_sio(unsigned int n)
{
snd_pcm_sframes_t rc;
- if (n > sio->samples)
- n = sio->samples;
+ if (n > alsa.samples)
+ n = alsa.samples;
- rc = snd_pcm_readi(sio->handle, sio->buffer, sio->samples);
- if (rc != sio->samples) {
+ rc = snd_pcm_readi(alsa.hdl, alsa.buffer, alsa.samples);
+ if (rc != alsa.samples) {
warnx("audio read error: %s", snd_strerror(rc));
if (rc == -EPIPE)
- snd_pcm_prepare(sio->handle);
+ snd_pcm_prepare(alsa.hdl);
}
- return sio->buffer + sio->samples - n;
+ return alsa.buffer + alsa.samples - n;
}
void
-free_sio(struct sio *sio)
+free_sio(void)
{
- snd_pcm_drain(sio->handle);
- snd_pcm_close(sio->handle);
- free(sio->buffer);
- free(sio);
+ snd_pcm_drain(alsa.hdl);
+ snd_pcm_close(alsa.hdl);
+ free(alsa.buffer);
}
diff --git a/fft.c b/fft.c
index 89ef38e..a2814b3 100644
--- a/fft.c
+++ b/fft.c
@@ -32,7 +32,7 @@ struct fft {
size_t n;
double *window;
double *sq;
-};
+} fft;
static double *
hamming(size_t n)
@@ -66,49 +66,44 @@ squares(size_t n)
return p;
}
-struct fft *
+int
init_fft(size_t n)
{
- struct fft *p;
-
- p = malloc(sizeof(struct fft));
- assert(p);
+ fft.n = n;
+ fft.in = fftw_malloc(fft.n * sizeof(double));
+ fft.out = fftw_malloc(fft.n * sizeof(fftw_complex) / 2);
+ assert(fft.in && fft.out);
- p->n = n;
- p->in = fftw_malloc(p->n * sizeof(double));
- p->out = fftw_malloc(p->n * sizeof(fftw_complex) / 2);
- assert(p->in && p->out);
+ fft.window = hamming(fft.n);
+ fft.sq = squares(fft.n);
- p->window = hamming(p->n);
- p->sq = squares(p->n);
+ fft.plan = fftw_plan_dft_r2c_1d(fft.n, fft.in, fft.out,
+ FFTW_MEASURE);
- p->plan = fftw_plan_dft_r2c_1d(p->n, p->in, p->out, FFTW_MEASURE);
-
- return p;
+ return 0;
}
int
-exec_fft(struct fft *p, int16_t *data, double *out, enum fft_chan chan)
+exec_fft(int16_t *data, double *out, enum fft_chan chan)
{
int i;
- for (i = 0; i < p->n; i++)
- p->in[i] = p->window[i] * data[2 * i + chan];
+ for (i = 0; i < fft.n; i++)
+ fft.in[i] = fft.window[i] * data[2 * i + chan];
- fftw_execute(p->plan);
+ fftw_execute(fft.plan);
- for (i = 0; i < p->n / 2; i++)
- out[i] = p->sq[i] * cabs(p->out[i]);
+ for (i = 0; i < fft.n / 2; i++)
+ out[i] = fft.sq[i] * cabs(fft.out[i]);
return 0;
}
void
-free_fft(struct fft *p)
+free_fft(void)
{
- fftw_free(p->in);
- fftw_free(p->out);
- free(p->window);
- free(p->sq);
- free(p);
+ fftw_free(fft.in);
+ fftw_free(fft.out);
+ free(fft.window);
+ free(fft.sq);
}
diff --git a/fft.h b/fft.h
index eeeaffd..e933e35 100644
--- a/fft.h
+++ b/fft.h
@@ -18,13 +18,12 @@
#ifndef __FFT_H
#define __FFT_H
-struct fft;
enum fft_chan { FFT_LEFT, FFT_RIGHT };
__BEGIN_DECLS
-struct fft *init_fft(size_t);
-int exec_fft(struct fft *, int16_t *, double *, enum fft_chan);
-void free_fft(struct fft *);
+int init_fft(size_t);
+int exec_fft(int16_t *, double *, enum fft_chan);
+void free_fft(void);
__END_DECLS
#endif
diff --git a/sio.c b/sio.c
index f140950..3beb85e 100644
--- a/sio.c
+++ b/sio.c
@@ -28,79 +28,72 @@
#define FPS 25
struct sio {
- struct sio_hdl *sio;
+ struct sio_hdl *hdl;
struct sio_par par;
int16_t *buffer;
unsigned int samples;
-};
+} sio;
-struct sio *
+int
init_sio(void)
{
- struct sio *sio;
-
- sio = malloc(sizeof(struct sio));
- assert(sio);
-
- sio->sio = sio_open(SIO_DEVANY, SIO_REC, 0);
- if (!sio->sio)
+ sio.hdl = sio_open(SIO_DEVANY, SIO_REC, 0);
+ if (!sio.hdl)
errx(1, "cannot connect to sound server, is it running?");
- sio_initpar(&sio->par);
+ sio_initpar(&sio.par);
- sio->par.rchan = STEREO;
- sio->par.bits = BITS;
- sio->par.le = SIO_LE_NATIVE;
- sio->par.sig = SIGNED;
+ sio.par.rchan = STEREO;
+ sio.par.bits = BITS;
+ sio.par.le = SIO_LE_NATIVE;
+ sio.par.sig = SIGNED;
- if (!sio_setpar(sio->sio, &sio->par))
+ if (!sio_setpar(sio.hdl, &sio.par))
errx(1, "SIO set params failed");
- if (!sio_getpar(sio->sio, &sio->par))
+ if (!sio_getpar(sio.hdl, &sio.par))
errx(1, "SIO get params failed");
- if (sio->par.rchan != STEREO ||
- sio->par.bits != BITS ||
- sio->par.le != SIO_LE_NATIVE ||
- sio->par.sig != SIGNED)
+ if (sio.par.rchan != STEREO ||
+ sio.par.bits != BITS ||
+ sio.par.le != SIO_LE_NATIVE ||
+ sio.par.sig != SIGNED)
errx(1, "unsupported audio params");
- sio->samples = sio->par.rate / FPS;
- warnx("min samples: %d", sio->samples);
- sio->samples -= sio->samples % sio->par.round - sio->par.round;
- warnx("max samples: %d", sio->samples);
- sio->buffer = calloc(sio->samples * sio->par.rchan, sizeof(int16_t));
- assert(sio->buffer);
-
- sio_start(sio->sio);
+ sio.samples = sio.par.rate / FPS;
+ warnx("min samples: %d", sio.samples);
+ sio.samples -= sio.samples % sio.par.round - sio.par.round;
+ warnx("max samples: %d", sio.samples);
+ sio.buffer = calloc(sio.samples * sio.par.rchan, sizeof(int16_t));
+ assert(sio.buffer);
- return sio;
+ return sio_start(sio.hdl);
}
unsigned int
-max_samples_sio(struct sio *sio)
+max_samples_sio(void)
{
/*
* maximal number of samples we're willing to provide
* with 1920 at 25 fps and 48000 Hz or
* with 1764 at 25 fps and 44100 Hz it shall fit on most screens
*/
- return sio->samples;
+ return sio.samples;
}
int16_t *
-read_sio(struct sio *sio, unsigned int n)
+read_sio(unsigned int n)
{
int done;
- char *buffer = (char *)sio->buffer;
- size_t bufsz = sio->samples * sio->par.rchan * sizeof(int16_t);
- size_t rndsz = n * sio->par.rchan * sizeof(int16_t);
+ char *buffer = (char *)sio.buffer;
+ size_t bufsz = sio.samples * sio.par.rchan * sizeof(int16_t);
+ size_t rndsz = n * sio.par.rchan * sizeof(int16_t);
if (rndsz > bufsz)
rndsz = bufsz;
for (done = 0; bufsz > 0; buffer += done, bufsz -= done) {
- done = sio_read(sio->sio, buffer, bufsz);
- if (sio_eof(sio->sio))
+ done = sio_read(sio.hdl, buffer, bufsz);
+ if (sio_eof(sio.hdl))
errx(1, "SIO EOF");
}
@@ -114,8 +107,7 @@ read_sio(struct sio *sio, unsigned int n)
void
free_sio(struct sio *sio)
{
- sio_stop(sio->sio);
- sio_close(sio->sio);
- free(sio->buffer);
- free(sio);
+ sio_stop(sio.hdl);
+ sio_close(sio.hdl);
+ free(sio.buffer);
}
diff --git a/sio.h b/sio.h
index 775b222..c51cbdf 100644
--- a/sio.h
+++ b/sio.h
@@ -18,13 +18,11 @@
#ifndef __SIO_H
#define __SIO_H
-struct sio;
-
__BEGIN_DECLS
-struct sio *init_sio(void);
-int16_t *read_sio(struct sio *, unsigned int);
-unsigned int max_samples_sio(struct sio *);
-void free_sio(struct sio *);
+int init_sio(void);
+int16_t *read_sio(unsigned int);
+unsigned int max_samples_sio(void);
+void free_sio(void);
__END_DECLS
#endif
diff --git a/spectrogram.c b/spectrogram.c
index 68d1a74..e2faa12 100644
--- a/spectrogram.c
+++ b/spectrogram.c
@@ -449,8 +449,6 @@ main(int argc, char **argv)
int scr;
struct panel *left, *right;
- struct sio *sio;
- struct fft *fft;
int16_t *buffer;
int dflag = 0; /* daemonize */
@@ -491,8 +489,8 @@ main(int argc, char **argv)
if (dflag)
daemon(0, 0);
- sio = init_sio();
- maxwidth = max_samples_sio(sio);
+ init_sio();
+ maxwidth = max_samples_sio();
maxheight = wa.height;
dsp = XOpenDisplay(NULL);
@@ -549,7 +547,7 @@ main(int argc, char **argv)
0, 0, width, height, 0, white, black);
XMapWindow(dsp, container);
- fft = init_fft(round);
+ init_fft(round);
geo.x = 0;
geo.y = 0;
@@ -609,10 +607,10 @@ main(int argc, char **argv)
}
}
- buffer = read_sio(sio, round);
+ buffer = read_sio(round);
- exec_fft(fft, buffer, left->data, FFT_LEFT);
- exec_fft(fft, buffer, right->data, FFT_RIGHT);
+ exec_fft(buffer, left->data, FFT_LEFT);
+ exec_fft(buffer, right->data, FFT_RIGHT);
draw_panel(dsp, left);
draw_panel(dsp, right);
@@ -624,8 +622,8 @@ main(int argc, char **argv)
XResetScreenSaver(dsp);
}
- free_sio(sio);
- free_fft(fft);
+ free_sio();
+ free_fft();
free_panel(dsp, left);
free_panel(dsp, right);