From c609ba488f7209a0ef94687fa2fd93b4cbe52305 Mon Sep 17 00:00:00 2001 From: Ahmet Inan Date: Mon, 23 Feb 2015 13:29:52 +0100 Subject: [PATCH] rearranged and fixed alsa init code --- alsa.c | 229 +++++++++++++++++++++++++++------------------------------ 1 file changed, 108 insertions(+), 121 deletions(-) diff --git a/alsa.c b/alsa.c index 876a36d..dde885c 100644 --- a/alsa.c +++ b/alsa.c @@ -79,6 +79,64 @@ int write_alsa(struct pcm *pcm, short *buff, int frames) int open_alsa_read(struct pcm **p, char *name) { + snd_pcm_t *pcm; + if (snd_pcm_open(&pcm, name, SND_PCM_STREAM_CAPTURE, 0) < 0) { + fprintf(stderr, "Error opening PCM device %s\n", name); + return 0; + } + + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + if (snd_pcm_hw_params_any(pcm, params) < 0) { + fprintf(stderr, "Can not configure this PCM device.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_access(pcm, params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { + fprintf(stderr, "Error setting access.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_format(pcm, params, SND_PCM_FORMAT_S16_LE) < 0) { + fprintf(stderr, "Error setting S16_LE format.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_rate_resample(pcm, params, 0) < 0) { + fprintf(stderr, "Error disabling resampling.\n"); + snd_pcm_close(pcm); + return 0; + } + + unsigned rate_min = 8000; + int dir_min = 0; + if (snd_pcm_hw_params_set_rate_min(pcm, params, &rate_min, &dir_min) < 0 || rate_min < 8000) { + fprintf(stderr, "Error setting min rate.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params(pcm, params) < 0) { + fprintf(stderr, "Error setting HW params.\n"); + snd_pcm_close(pcm); + return 0; + } + unsigned int rate = 0; + if (snd_pcm_hw_params_get_rate(params, &rate, 0) < 0) { + fprintf(stderr, "Error getting rate.\n"); + snd_pcm_close(pcm); + return 0; + } + unsigned int channels = 0; + if (snd_pcm_hw_params_get_channels(params, &channels) < 0) { + fprintf(stderr, "Error getting channels.\n"); + snd_pcm_close(pcm); + return 0; + } + struct alsa *alsa = (struct alsa *)malloc(sizeof(struct alsa)); alsa->base.close = close_alsa; alsa->base.info = info_alsa; @@ -87,73 +145,6 @@ int open_alsa_read(struct pcm **p, char *name) alsa->base.rw = read_alsa; alsa->base.data = (void *)alsa; - snd_pcm_t *pcm; - snd_pcm_hw_params_t *params; - snd_pcm_hw_params_alloca(¶ms); - - if (snd_pcm_open(&pcm, name, SND_PCM_STREAM_CAPTURE, 0) < 0) { - fprintf(stderr, "Error opening PCM device %s\n", name); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_any(pcm, params) < 0) { - fprintf(stderr, "Can not configure this PCM device.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_access(pcm, params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { - fprintf(stderr, "Error setting access.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_format(pcm, params, SND_PCM_FORMAT_S16_LE) < 0) { - fprintf(stderr, "Error setting S16_LE format.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_rate_resample(pcm, params, 0) < 0) { - fprintf(stderr, "Error disabling resampling.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - unsigned rate_min = 8000; - int dir_min = 0; - if (snd_pcm_hw_params_set_rate_min(pcm, params, &rate_min, &dir_min) < 0 || rate_min < 8000) { - fprintf(stderr, "Error setting min rate.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params(pcm, params) < 0) { - fprintf(stderr, "Error setting HW params.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - unsigned int rate = 0; - if (snd_pcm_hw_params_get_rate(params, &rate, 0) < 0) { - fprintf(stderr, "Error getting rate.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - unsigned int channels = 0; - if (snd_pcm_hw_params_get_channels(params, &channels) < 0) { - fprintf(stderr, "Error getting channels.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } alsa->pcm = pcm; alsa->r = rate; alsa->c = channels; @@ -164,6 +155,56 @@ int open_alsa_read(struct pcm **p, char *name) int open_alsa_write(struct pcm **p, char *name, int rate, int channels, float seconds) { + snd_pcm_t *pcm; + if (snd_pcm_open(&pcm, name, SND_PCM_STREAM_PLAYBACK, 0) < 0) { + fprintf(stderr, "Error opening PCM device %s\n", name); + return 0; + } + + snd_pcm_hw_params_t *params; + snd_pcm_hw_params_alloca(¶ms); + if (snd_pcm_hw_params_any(pcm, params) < 0) { + fprintf(stderr, "Can not configure this PCM device.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_access(pcm, params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { + fprintf(stderr, "Error setting access.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_format(pcm, params, SND_PCM_FORMAT_S16_LE) < 0) { + fprintf(stderr, "Error setting S16_LE format.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_rate_resample(pcm, params, 0) < 0) { + fprintf(stderr, "Error disabling resampling.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_rate_near(pcm, params, (unsigned int *)&rate, 0) < 0) { + fprintf(stderr, "Error setting rate.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params_set_channels_near(pcm, params, (unsigned int *)&channels) < 0) { + fprintf(stderr, "Error setting channels.\n"); + snd_pcm_close(pcm); + return 0; + } + + if (snd_pcm_hw_params(pcm, params) < 0) { + fprintf(stderr, "Error setting HW params.\n"); + snd_pcm_close(pcm); + return 0; + } + struct alsa *alsa = (struct alsa *)malloc(sizeof(struct alsa)); alsa->base.close = close_alsa; alsa->base.info = info_alsa; @@ -172,60 +213,6 @@ int open_alsa_write(struct pcm **p, char *name, int rate, int channels, float se alsa->base.rw = write_alsa; alsa->base.data = (void *)alsa; - snd_pcm_t *pcm; - snd_pcm_hw_params_t *params; - snd_pcm_hw_params_alloca(¶ms); - - if (snd_pcm_open(&pcm, name, SND_PCM_STREAM_PLAYBACK, 0) < 0) { - fprintf(stderr, "Error opening PCM device %s\n", name); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_any(pcm, params) < 0) { - fprintf(stderr, "Can not configure this PCM device.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_access(pcm, params, SND_PCM_ACCESS_RW_INTERLEAVED) < 0) { - fprintf(stderr, "Error setting access.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_format(pcm, params, SND_PCM_FORMAT_S16_LE) < 0) { - fprintf(stderr, "Error setting S16_LE format.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_rate_resample(pcm, params, 0) < 0) { - fprintf(stderr, "Error disabling resampling.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } - - if (snd_pcm_hw_params_set_rate_near(pcm, params, (unsigned int *)&rate, 0) < 0) { - fprintf(stderr, "Error setting rate.\n"); - return 0; - } - - if (snd_pcm_hw_params_set_channels_near(pcm, params, (unsigned int *)&channels) < 0) { - fprintf(stderr, "Error setting channels.\n"); - return 0; - } - - if (snd_pcm_hw_params(pcm, params) < 0) { - fprintf(stderr, "Error setting HW params.\n"); - snd_pcm_close(alsa->pcm); - free(alsa); - return 0; - } alsa->pcm = pcm; alsa->r = rate; alsa->c = channels;