aboutsummaryrefslogtreecommitdiff
path: root/alsa.c
diff options
context:
space:
mode:
Diffstat (limited to 'alsa.c')
-rw-r--r--alsa.c84
1 files changed, 39 insertions, 45 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);
}