diff options
author | Jindrich Makovicka <makovick@gmail.com> | 2010-10-17 20:17:19 +0200 |
---|---|---|
committer | malc <av1474@comtv.ru> | 2010-10-18 00:39:06 +0400 |
commit | 38cc9b607f85017b095793cab6c129bc9844f441 (patch) | |
tree | b6f5581d2ee7a5564b2ccec060c68b0e8133a434 /audio | |
parent | 22d948a2d97434192018bdabaf0a50cda7f994be (diff) | |
download | qemu-38cc9b607f85017b095793cab6c129bc9844f441.zip qemu-38cc9b607f85017b095793cab6c129bc9844f441.tar.gz qemu-38cc9b607f85017b095793cab6c129bc9844f441.tar.bz2 |
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 <makovick@gmail.com>
Signed-off-by: malc <av1474@comtv.ru>
Diffstat (limited to 'audio')
-rw-r--r-- | audio/alsaaudio.c | 23 |
1 files changed, 17 insertions, 6 deletions
diff --git a/audio/alsaaudio.c b/audio/alsaaudio.c index 3ca4078..0741203 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; |