From 9671bb4cc41beda923e115b94b928c249bf55d62 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Wed, 10 Sep 2014 17:24:15 +0000 Subject: make module internal data privat --- alsa.c | 84 +++++++++++++++++++++++++++-------------------------------- fft.c | 49 ++++++++++++++++------------------ fft.h | 7 +++-- sio.c | 76 ++++++++++++++++++++++++----------------------------- sio.h | 10 +++---- spectrogram.c | 18 ++++++------- 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); -- cgit v1.2.3