From 38cc9b607f85017b095793cab6c129bc9844f441 Mon Sep 17 00:00:00 2001 From: Jindrich Makovicka Date: Sun, 17 Oct 2010 20:17:19 +0200 Subject: issue snd_pcm_start() when capturing audio snd_pcm_start() starts the capture process and ensures that the events are delivered to the poll handler. Without the call, capture can be started only when there is simultaneous playback running. Signed-off-by: Jindrich Makovicka Signed-off-by: malc --- audio/alsaaudio.c | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) (limited to 'audio/alsaaudio.c') diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index 3ca40780ec..07412030c2 100644 --- a/audio/alsaaudio.c +++ b/audio/alsaaudio.c @@ -843,11 +843,15 @@ static int alsa_init_out (HWVoiceOut *hw, struct audsettings *as) return 0; } -static int alsa_voice_ctl (snd_pcm_t *handle, const char *typ, int pause) +#define VOICE_CTL_PAUSE 0 +#define VOICE_CTL_PREPARE 1 +#define VOICE_CTL_START 2 + +static int alsa_voice_ctl (snd_pcm_t *handle, const char *typ, int ctl) { int err; - if (pause) { + if (ctl == VOICE_CTL_PAUSE) { err = snd_pcm_drop (handle); if (err < 0) { alsa_logerr (err, "Could not stop %s\n", typ); @@ -860,6 +864,13 @@ static int alsa_voice_ctl (snd_pcm_t *handle, const char *typ, int pause) alsa_logerr (err, "Could not prepare handle for %s\n", typ); return -1; } + if (ctl == VOICE_CTL_START) { + err = snd_pcm_start(handle); + if (err < 0) { + alsa_logerr (err, "Could not start handle for %s\n", typ); + return -1; + } + } } return 0; @@ -884,7 +895,7 @@ static int alsa_ctl_out (HWVoiceOut *hw, int cmd, ...) poll_mode = 0; } hw->poll_mode = poll_mode; - return alsa_voice_ctl (alsa->handle, "playback", 0); + return alsa_voice_ctl (alsa->handle, "playback", VOICE_CTL_PREPARE); } case VOICE_DISABLE: @@ -893,7 +904,7 @@ static int alsa_ctl_out (HWVoiceOut *hw, int cmd, ...) hw->poll_mode = 0; alsa_fini_poll (&alsa->pollhlp); } - return alsa_voice_ctl (alsa->handle, "playback", 1); + return alsa_voice_ctl (alsa->handle, "playback", VOICE_CTL_PAUSE); } return -1; @@ -1106,7 +1117,7 @@ static int alsa_ctl_in (HWVoiceIn *hw, int cmd, ...) } hw->poll_mode = poll_mode; - return alsa_voice_ctl (alsa->handle, "capture", 0); + return alsa_voice_ctl (alsa->handle, "capture", VOICE_CTL_START); } case VOICE_DISABLE: @@ -1115,7 +1126,7 @@ static int alsa_ctl_in (HWVoiceIn *hw, int cmd, ...) hw->poll_mode = 0; alsa_fini_poll (&alsa->pollhlp); } - return alsa_voice_ctl (alsa->handle, "capture", 1); + return alsa_voice_ctl (alsa->handle, "capture", VOICE_CTL_PAUSE); } return -1; -- cgit v1.2.1