summaryrefslogtreecommitdiffstats
path: root/plugins/alsa/alsa-core-pcm.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/alsa/alsa-core-pcm.c')
-rw-r--r--plugins/alsa/alsa-core-pcm.c24
1 files changed, 21 insertions, 3 deletions
diff --git a/plugins/alsa/alsa-core-pcm.c b/plugins/alsa/alsa-core-pcm.c
index adceebc..a45d463 100644
--- a/plugins/alsa/alsa-core-pcm.c
+++ b/plugins/alsa/alsa-core-pcm.c
@@ -29,6 +29,9 @@ for the specific language governing permissions and
#include <sys/syscall.h>
#include <sched.h>
+#include <signal.h>
+#include <poll.h>
+
#include "time_utils.h"
static int xrun(snd_pcm_t * pcm, int error);
@@ -127,7 +130,7 @@ PUBLIC int AlsaPcmConf(SoftMixerT *mixer, AlsaPcmCtlT *pcm, int mode) {
if ((error = snd_pcm_hw_params_set_format(pcm->handle, pxmHwParams, opts->format)) < 0) {
AFB_ApiError(mixer->api,
"%s (%s) mixer=%s Set_Format=%s (%d) FAILED current=%d error=%s",
- __func__, card, mixer->uid, opts->formatS, opts->format, format, snd_strerror(error));
+ __func__, card, mixer->uid, opts->formatString, opts->format, format, snd_strerror(error));
AlsaDumpFormats(mixer, pcm->handle);
goto OnErrorExit;
}
@@ -483,6 +486,7 @@ static void *readThreadEntry(void *handle) {
if (muted)
readSuspend(pcmCopyHandle);
+
/* loop until end */
for (;;) {
@@ -531,7 +535,7 @@ static void *readThreadEntry(void *handle) {
continue;
}
- unsigned short revents;
+ unsigned short revents = 0;
int res = snd_pcm_poll_descriptors_revents(pcmCopyHandle->pcmIn->handle, framePfds, pcmCopyHandle->nbPcmFds, &revents);
@@ -549,6 +553,7 @@ static void *readThreadEntry(void *handle) {
}
done:
pthread_exit(0);
+
return NULL;
}
@@ -689,9 +694,14 @@ PUBLIC int AlsaPcmCopyStop(SoftMixerT *mixer, AlsaPcmCopyHandleT * handle) {
if (pthread_join(handle->rthread, NULL) != 0)
AFB_ApiDebug(mixer->api, "%s: Failed to join read thread", __func__);
+ AFB_ApiDebug(mixer->api, "%s: Copy threads of %s are STOPPED", __func__, handle->stream->uid);
+
sem_destroy(&handle->sem);
- AFB_ApiDebug(mixer->api, "%s: Copy threads of %s are STOPPED", __func__, handle->stream->uid);
+ alsa_ringbuf_free(handle->rbuf);
+
+ free(handle->pollFds);
+ free(handle);
return 0;
@@ -709,9 +719,17 @@ PUBLIC int AlsaPcmCopyStart(SoftMixerT *mixer, AlsaStreamAudioT *stream, AlsaPcm
/* remember configuration of capture */
pcmIn->params = (AlsaPcmHwInfoT*)malloc(sizeof(AlsaPcmHwInfoT));
+ if (!pcmIn->params) {
+ SOFTMIXER_NOMEM(mixer->api);
+ goto OnErrorExit;
+ }
memcpy(pcmIn->params, opts, sizeof(AlsaPcmHwInfoT));
pcmOut->params = (AlsaPcmHwInfoT*)malloc(sizeof(AlsaPcmHwInfoT));
+ if (!pcmOut->params) {
+ SOFTMIXER_NOMEM(mixer->api);
+ goto OnErrorExit;
+ }
memcpy(pcmOut->params, opts, sizeof(AlsaPcmHwInfoT));
pcmIn->mixer = mixer;